~/f/erlang/RPMS.2017 ~/f/erlang ~/f/erlang RPMS.2017/erlang-27.3.4-1.1.x86_64.rpm RPMS/erlang-27.3.4-1.1.x86_64.rpm differ: char 225, line 1 Comparing erlang-27.3.4-1.1.x86_64.rpm to erlang-27.3.4-1.1.x86_64.rpm comparing the rpm tags of erlang --- old-rpm-tags +++ new-rpm-tags @@ -3153 +3153 @@ -/usr/lib64/erlang/lib/ssh-5.2.11/ebin/ssh.beam 1119665227a5d055b7ed547cc2f5a2763d312b8d36a2f4adfcf8ac342f7939c6 0 +/usr/lib64/erlang/lib/ssh-5.2.11/ebin/ssh.beam 876604a6acb9d86b3b72fffb4d530badbc625792eb785aa5b14cf1103a84b1ca 0 @@ -3179 +3179 @@ -/usr/lib64/erlang/lib/ssh-5.2.11/ebin/ssh_options.beam fc2abaa00521bd942e20c402c34309e818e7e4f4c2aa3bf008c0e0d75d67bf6e 0 +/usr/lib64/erlang/lib/ssh-5.2.11/ebin/ssh_options.beam d27199e9b5ad084d2b0fa8dff874d2b1e01983bd41a05dc8426ccfc5d0675a9e 0 comparing rpmtags comparing RELEASE comparing PROVIDES comparing scripts comparing filelist comparing file checksum creating rename script RPM file checksum differs. Extracting packages /usr/lib64/erlang/lib/ssh-5.2.11/ebin/ssh.beam differs at offset '72428' (Erlang BEAM file) --- old /usr/lib64/erlang/lib/ssh-5.2.11/ebin/ssh.beam (hex) +++ new /usr/lib64/erlang/lib/ssh-5.2.11/ebin/ssh.beam (hex) @@ -1,9 +1,9 @@ 00011ac0 5f 32 28 29 6a 77 04 6e 6f 6e 65 74 00 00 00 03 |_2()jw.nonet....| 00011ad0 77 05 74 69 74 6c 65 6d 00 00 00 0e 44 61 65 6d |w.titlem....Daem| -00011ae0 6f 6e 20 4f 70 74 69 6f 6e 73 77 05 65 71 75 69 |on Optionsw.equi| -00011af0 76 6d 00 00 00 0a 70 77 64 66 75 6e 5f 34 2f 30 |vm....pwdfun_4/0| -00011b00 77 08 65 78 70 6f 72 74 65 64 77 05 66 61 6c 73 |w.exportedw.fals| -00011b10 65 68 05 68 03 77 04 74 79 70 65 77 0c 6b 62 5f |eh.h.w.typew.kb_| +00011ae0 6f 6e 20 4f 70 74 69 6f 6e 73 77 08 65 78 70 6f |on Optionsw.expo| +00011af0 72 74 65 64 77 05 66 61 6c 73 65 77 05 65 71 75 |rtedw.falsew.equ| +00011b00 69 76 6d 00 00 00 0a 70 77 64 66 75 6e 5f 34 2f |ivm....pwdfun_4/| +00011b10 30 68 05 68 03 77 04 74 79 70 65 77 0c 6b 62 5f |0h.h.w.typew.kb_| 00011b20 69 6e 74 5f 74 75 70 6c 65 61 00 6c 00 00 00 02 |int_tuplea.l....| 00011b30 68 02 77 04 66 69 6c 65 6b 00 07 73 73 68 2e 68 |h.w.filek..ssh.h| 00011b40 72 6c 68 02 77 08 6c 6f 63 61 74 69 6f 6e 68 02 |rlh.w.locationh.| /usr/lib64/erlang/lib/ssh-5.2.11/ebin/ssh_options.beam differs at offset '69219' (Erlang BEAM file) --- old /usr/lib64/erlang/lib/ssh-5.2.11/ebin/ssh_options.beam (hex) +++ new /usr/lib64/erlang/lib/ssh-5.2.11/ebin/ssh_options.beam (hex) @@ -1,8 +1,8 @@ 00010e40 6e 65 74 00 00 00 03 77 05 74 69 74 6c 65 6d 00 |net....w.titlem.| 00010e50 00 00 0e 44 61 65 6d 6f 6e 20 4f 70 74 69 6f 6e |...Daemon Option| -00010e60 73 77 05 65 71 75 69 76 6d 00 00 00 0a 70 77 64 |sw.equivm....pwd| -00010e70 66 75 6e 5f 34 2f 30 77 08 65 78 70 6f 72 74 65 |fun_4/0w.exporte| -00010e80 64 77 05 66 61 6c 73 65 68 05 68 03 77 04 74 79 |dw.falseh.h.w.ty| +00010e60 73 77 08 65 78 70 6f 72 74 65 64 77 05 66 61 6c |sw.exportedw.fal| +00010e70 73 65 77 05 65 71 75 69 76 6d 00 00 00 0a 70 77 |sew.equivm....pw| +00010e80 64 66 75 6e 5f 34 2f 30 68 05 68 03 77 04 74 79 |dfun_4/0h.h.w.ty| 00010e90 70 65 77 0c 6b 62 5f 69 6e 74 5f 74 75 70 6c 65 |pew.kb_int_tuple| 00010ea0 61 00 6c 00 00 00 02 68 02 77 04 66 69 6c 65 6b |a.l....h.w.filek| 00010eb0 00 07 73 73 68 2e 68 72 6c 68 02 77 08 6c 6f 63 |..ssh.hrlh.w.loc| RPMS.2017/erlang-doc-27.3.4-1.1.x86_64.rpm RPMS/erlang-doc-27.3.4-1.1.x86_64.rpm differ: char 225, line 1 Comparing erlang-doc-27.3.4-1.1.x86_64.rpm to erlang-doc-27.3.4-1.1.x86_64.rpm comparing the rpm tags of erlang-doc --- old-rpm-tags +++ new-rpm-tags @@ -333 +333 @@ -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/dist/search_data-45BBA3CE.js 2 (none) 100644 root root 0 4294967295 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/dist/search_data-4F4A610F.js 2 (none) 100644 root root 0 4294967295 @@ -1332 +1332 @@ -/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/dist/search_data-5F40933F.js 2 (none) 100644 root root 0 4294967295 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/dist/search_data-8746A0E5.js 2 (none) 100644 root root 0 4294967295 @@ -1550 +1550 @@ -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/dist/search_data-D2253CE5.js 2 (none) 100644 root root 0 4294967295 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/dist/search_data-12AAC588.js 2 (none) 100644 root root 0 4294967295 @@ -2332,2 +2332,2 @@ -/usr/share/doc/packages/erlang-doc/doc/404.html 61521f8fd7faa16e6db52bd59eb9d129056849fe696e937c13ed3359d7e54c08 2 -/usr/share/doc/packages/erlang-doc/doc/asn1.html 1da7841cdc00f2278c3530a572ef1ad43a101912237401fe05cacd40646f521f 2 +/usr/share/doc/packages/erlang-doc/doc/404.html 9d1550c034219ff81c57621b02aa85785f3b0a4817b8833cf3d8ea029af5c8f4 2 +/usr/share/doc/packages/erlang-doc/doc/asn1.html d92a0f315d4c2a485bcf89b69bff00780c19bdcfb21cd27b420eba3e4a5f1c1f 2 @@ -2336,8 +2336,8 @@ -/usr/share/doc/packages/erlang-doc/doc/common_test.html 46dd119ad73d2de562d47a704ebf95c4c6af11d5e6f64eb688f9ffa2db15eeb1 2 -/usr/share/doc/packages/erlang-doc/doc/compiler.html 99435fc733bef4e92851d88be57f5975fef87028b24b65f8265fbd6b8013f20f 2 -/usr/share/doc/packages/erlang-doc/doc/crypto.html dd4d91568171fef551aa8be45cf4ac4fc96f7dea83a8262d5616ea74a8060f59 2 -/usr/share/doc/packages/erlang-doc/doc/debugger.html 9b1228b3bbf6cb5b0ba9699eee71a8c39536f4a80cb262401b69401bbe4975e1 2 -/usr/share/doc/packages/erlang-doc/doc/deprecations.html 57c62e6e8422084b49277ea6e0ae0f51de73f2b501aadd311be2e5dd1e19672f 2 -/usr/share/doc/packages/erlang-doc/doc/design_principles.html 8f20693fccad8cbb439a01d83e247b503827fa2f094275f8de1098e1db5eab52 2 -/usr/share/doc/packages/erlang-doc/doc/dialyzer.html 5ffc4ad88205b05d215fb433aaa0093c990d352470230fa14a640f7d50c79284 2 -/usr/share/doc/packages/erlang-doc/doc/diameter.html 22d0f468445da2d72bd72908da9034339a9570749f6447ffec54b17d5c93d988 2 +/usr/share/doc/packages/erlang-doc/doc/common_test.html 4c97537e6ee7ce5a84c4905667f05fbc63536b8c8c2f15a2b8231d497c4fcba0 2 +/usr/share/doc/packages/erlang-doc/doc/compiler.html 07bc478bd83385867f68ba382b83c3f48f0f8aeb41ca028a4fc1e2ea511d8ebe 2 +/usr/share/doc/packages/erlang-doc/doc/crypto.html e7c4194d28b2019df443c01bb8cacad0453f377098dd70744c633b7dad9d66d5 2 +/usr/share/doc/packages/erlang-doc/doc/debugger.html 2f653e8301af9ede51f57f207a2b4c051f835d23790aa68eaf63de6ed03508d8 2 +/usr/share/doc/packages/erlang-doc/doc/deprecations.html e1273eeb6e7a8bd18640d13756bdda71fa18a0d7a9645985c270f5b0ad89a811 2 +/usr/share/doc/packages/erlang-doc/doc/design_principles.html 41fcf43f5786114eb9927b3f32571b4da7b40830b9975f4928b30b37100d4660 2 +/usr/share/doc/packages/erlang-doc/doc/dialyzer.html 4331993d1af885464e25c5c0c73ea1d1da84cec8231ff6b04e40d4ec7a973a35 2 +/usr/share/doc/packages/erlang-doc/doc/diameter.html a6d3806a7e6d6e3975c7c73b4aa76552430c3fc8f8f462dff71616995fc56ec1 2 @@ -2364,10 +2364,10 @@ -/usr/share/doc/packages/erlang-doc/doc/edoc.html 3c361985edb68bb9852fb72f82576e42c06769816ce098b6957267b4c40cd9d6 2 -/usr/share/doc/packages/erlang-doc/doc/efficiency_guide.html 6380f05d95f4c60c5c46f831d3b8c998ba6256852aed3975470bd10456324404 2 -/usr/share/doc/packages/erlang-doc/doc/eldap.html e019eb3231a39a76468abcd51adde09136a2322cc739ab9559d55ce2745293d8 2 -/usr/share/doc/packages/erlang-doc/doc/embedded.html ad2b5521b2f83637c07a271df0ef010a0ea5e4ad7d0e4cbdfd89d69b790c2ae5 2 -/usr/share/doc/packages/erlang-doc/doc/erl_interface.html 183bd886886be84362ed20e33a1ed50069b26cf64fb7d71322fa4bc3d1aec29c 2 -/usr/share/doc/packages/erlang-doc/doc/erts.html 347c2e04f4ece487826521a40ff633625a6450407c1d701bcfcfd2b3a086dd6b 2 -/usr/share/doc/packages/erlang-doc/doc/et.html d8a62b70acde2c732b8c15b6fca997ebfe993716b82dc1b5284c3980fd1a2dbf 2 -/usr/share/doc/packages/erlang-doc/doc/eunit.html 276f5cc98a3e3219c8161425d5b2ef894613bdf31e8229df464329f9ce10fc29 2 -/usr/share/doc/packages/erlang-doc/doc/ftp.html a9455c1401cfde69511c605816a7a4cbcb05b56b5b8badab94272c8aed30c0f7 2 -/usr/share/doc/packages/erlang-doc/doc/getting_started.html 0fedf5c0f5b4d07be9c16e3d1e35a09f30fccdce579ca016899833f98660659f 2 +/usr/share/doc/packages/erlang-doc/doc/edoc.html db4f9c36623abac40dd260f9a1663a0b60b9d9418a688b704cd380f07c976013 2 +/usr/share/doc/packages/erlang-doc/doc/efficiency_guide.html 7b90f194e231a604f4258b98522e37d0e239da1a4ee7af03552731c09a352e0f 2 +/usr/share/doc/packages/erlang-doc/doc/eldap.html c80c27271f8d022a6b19d29a54aa3eb07cec2b7a6827b1846378078c2f9e9c2e 2 +/usr/share/doc/packages/erlang-doc/doc/embedded.html aec33497d95666ccb4e6cf58d2c82bf12be6b1d925f6828ca283f545aa344a19 2 +/usr/share/doc/packages/erlang-doc/doc/erl_interface.html 2de4016f29517b92b4ea6cba51c6deb0f41e1b4fb9194279e12d5947de01f5de 2 +/usr/share/doc/packages/erlang-doc/doc/erts.html 687add05c45a77e34e4348336e2623d03c8e6be67a78b8dc77e1a067c47a18e7 2 +/usr/share/doc/packages/erlang-doc/doc/et.html ab585a9f24ca194e65fb9baed8b936ba5eec1c5556410e4d7a67d4dc0f1271f2 2 +/usr/share/doc/packages/erlang-doc/doc/eunit.html 524d3d17615ea7c01eedbb28e5ab54f106e3201a8613a2d409dbcad7c7c996c2 2 +/usr/share/doc/packages/erlang-doc/doc/ftp.html 766d17f121b12e644e77855bb9398d3e9b1473b401b009f0cfde9899afeff32d 2 +/usr/share/doc/packages/erlang-doc/doc/getting_started.html 2fa5f8b1e48cb59b01680a567e8dcfa110e560a1f317a33123ff0e048796da7f 2 @@ -2375,26 +2375,26 @@ -/usr/share/doc/packages/erlang-doc/doc/inets.html dc6e7a3286969397fe3d9ef8e7d90ff1d0c371543abb9a9000bd1117b26d144c 2 -/usr/share/doc/packages/erlang-doc/doc/installation_guide.html ced3b0851c826331532635765eda15683e34ba7c6b09a6f255fa5e61b89515fd 2 -/usr/share/doc/packages/erlang-doc/doc/jinterface.html 9731649c1cc1069e0b0164fb3fe82bb6a5b2de68eed849b8a5aab5e1a11ee5c4 2 -/usr/share/doc/packages/erlang-doc/doc/kernel.html a1eb8fff68add33c339d2bc6a0b88b31a6f2525bdc12e4e78c5528682fb1dcc4 2 -/usr/share/doc/packages/erlang-doc/doc/man_index.html 5269abce3d9ec1f4fa3a782eca38f77b37bf97492b4813913860179951a5dc7a 2 -/usr/share/doc/packages/erlang-doc/doc/megaco.html 992ef89f35609725f815f285fa4845fcc967ebf6ecf3fa80f66699dfb9baf7e1 2 -/usr/share/doc/packages/erlang-doc/doc/mnesia.html 708e8d8eb9823a659dfc9d5f7c731ec19f9a4b8dc3c12bd11fc0cbf28ec76817 2 -/usr/share/doc/packages/erlang-doc/doc/observer.html 9deebf4ceaf26f9d2785a366f97d6fc8cad6a67a68bff9a346c64b189cddf94f 2 -/usr/share/doc/packages/erlang-doc/doc/odbc.html d1acd9d6665ebf7d7de9985b8e33ed33e88d05fac90eec594fac495aba6385ea 2 -/usr/share/doc/packages/erlang-doc/doc/os_mon.html 8992436ee6bd4e99e33e705d9e877adb50cdc0a23434784472a63be0d7e22bd0 2 -/usr/share/doc/packages/erlang-doc/doc/parsetools.html febdf5e5c738bc27ccc1519011389ca644af82a37379100b48611bc17415377f 2 -/usr/share/doc/packages/erlang-doc/doc/programming_examples.html 6be053c4437776f85396dca81a764297121b40a793360d103cf28f69b3aa489c 2 -/usr/share/doc/packages/erlang-doc/doc/public_key.html e9f76ddc4ee0381d22c6afdf6781baaa5c924e34b888f094361a9726ed631ade 2 -/usr/share/doc/packages/erlang-doc/doc/readme.html a12425a3756ce3913d0e331b16cb817de7306dd97e16c139f8e4fd88cafd020d 2 -/usr/share/doc/packages/erlang-doc/doc/reference_manual.html 9e372a3c09ef31a992d482ba3866a62e810785ee3d4874cb70b2e982845ca551 2 -/usr/share/doc/packages/erlang-doc/doc/reltool.html 985106f9ab117b4a4eb070742b962dec02020286b5fcae65727d431f207783c9 2 -/usr/share/doc/packages/erlang-doc/doc/removed.html 615476005dd77203fc84a7cdb987ccf84e300eceed00cc5f3fbd10274f29ad36 2 -/usr/share/doc/packages/erlang-doc/doc/runtime_tools.html dcc1d902b9f96e4bbe393efeae6524814b5e81c45fcd16335c1721b62fb2a93d 2 -/usr/share/doc/packages/erlang-doc/doc/sasl.html 5a5ed8dba72f42fcaee69904e79b382af27f2ed1af38459e2daab0e9de61166d 2 -/usr/share/doc/packages/erlang-doc/doc/scheduled_for_removal.html 6859589908699768f34b867287e46045e6aab88be31e0c427d88b7af5f82d430 2 -/usr/share/doc/packages/erlang-doc/doc/search.html 843ad5e3e6c3196417bc037da49c17d816e9d3f57a8c2e13a8e87d9eafc16b0f 2 -/usr/share/doc/packages/erlang-doc/doc/snmp.html 87a04620c912d9f470980c0f87119c02e92afdcf727c600e6009144a4ae87340 2 -/usr/share/doc/packages/erlang-doc/doc/ssh.html ae7cb6cd5106dafdda10b1ede3535e46c47be1c3043968d80058e68b47a8628c 2 -/usr/share/doc/packages/erlang-doc/doc/ssl.html c6004dcdf120fb42de874baa8fb92f90f7bced93b2dd3a7ff646091be46ee696 2 -/usr/share/doc/packages/erlang-doc/doc/stdlib.html 4bd0813c85055fc79cb40ad984cb40ac59f85653dcb7269e38d78f98b59cc7c5 2 -/usr/share/doc/packages/erlang-doc/doc/syntax_tools.html 46cfad183d6420bab2b64de35d3362c00fe9f45d3a5a51f0641d551396b4b7c3 2 +/usr/share/doc/packages/erlang-doc/doc/inets.html fb532a44f5b8d24f74730f07fee75ee8dcc8ca7c63f573974f59b296f3323804 2 +/usr/share/doc/packages/erlang-doc/doc/installation_guide.html 8208aa2b36812f319641eeb35796afd6958f838be81304554faefbf7fed33fd0 2 +/usr/share/doc/packages/erlang-doc/doc/jinterface.html f741ff3e728e0b804e4e964957a8f625e260fcd127c6e9bce4a7031e0ec59901 2 +/usr/share/doc/packages/erlang-doc/doc/kernel.html c035ac6731de4ec1e6d9838eccd50432e5d16cba7e42601b5de4cb905fd6b675 2 +/usr/share/doc/packages/erlang-doc/doc/man_index.html 705dce72e6197e682498e4bb9425e52f56b2ecf6c38b69727c933103f7a8c991 2 +/usr/share/doc/packages/erlang-doc/doc/megaco.html 4a4c43d64ec4787d106a15b4ccdd2aa42eeae263f57f6ebfc4b108da4c43c795 2 +/usr/share/doc/packages/erlang-doc/doc/mnesia.html b50e1c8040ef3f84745ebefe85cc84487a5e244abb8aa06a2851dcffa4d4b4c9 2 +/usr/share/doc/packages/erlang-doc/doc/observer.html 7e191e1b216374984feeec6cf251c49c752e322ab40722f183281df5ed271315 2 +/usr/share/doc/packages/erlang-doc/doc/odbc.html cdcdcfcd51c197a0aeb39632871c315f7ec78f029212c5c070e4199a9992a4a7 2 +/usr/share/doc/packages/erlang-doc/doc/os_mon.html b2da145f393f5ca8db75d54c0b5d7fec94b1d1860b43a5c95c6201418155f784 2 +/usr/share/doc/packages/erlang-doc/doc/parsetools.html 11fb96ae0cd06f0543bf2bcda82ebf85d567023a3ec70f909d4957704e92def6 2 +/usr/share/doc/packages/erlang-doc/doc/programming_examples.html 4d1e0eddec3ac0ea12a0e3fc400645c26898cadf21c9505729ab5d13ed5776f7 2 +/usr/share/doc/packages/erlang-doc/doc/public_key.html 839e973b259a04f22cd814b9540305e210d0686dcb53c28514e328927cf44ff0 2 +/usr/share/doc/packages/erlang-doc/doc/readme.html 1d2302a66e8988f5b364acf697c5b3c44c05e355ab9943a9a9491cbbbbb6e0d8 2 +/usr/share/doc/packages/erlang-doc/doc/reference_manual.html e65eca655c67d4c651f4e94fc3dd63c8290a77f8f166c79717c45297c5e0f1fd 2 +/usr/share/doc/packages/erlang-doc/doc/reltool.html b310b10f2f58392684fdddb99012728d2e7404e1f5dfccba6f6b7f1ee00b8326 2 +/usr/share/doc/packages/erlang-doc/doc/removed.html 9a9f6924aba52afca030a3f7269db440dbfe127f01f1b14795b7dfc894545225 2 +/usr/share/doc/packages/erlang-doc/doc/runtime_tools.html 4b960f2f8a5b9a601241370070575a9e09a1e07e4fdc1bf433718b0b1fdf6b76 2 +/usr/share/doc/packages/erlang-doc/doc/sasl.html a88409a3de08f8c608a645c8f960366357113b151713d723d6cecf9b37ea8a8c 2 +/usr/share/doc/packages/erlang-doc/doc/scheduled_for_removal.html 6e10e7b550e4a64658ae5552b0cf31c49dbf3a9877a9e965802da06b9d4ba059 2 +/usr/share/doc/packages/erlang-doc/doc/search.html cfd6a6126d76d943bf31fc597cdb2b50b36881ab9d414d26fcfbcca4012c64a7 2 +/usr/share/doc/packages/erlang-doc/doc/snmp.html 142847ed9bcc6abd4e9f11e337b13a303a1bd07ec7eb1698e681f7ba7a25bd96 2 +/usr/share/doc/packages/erlang-doc/doc/ssh.html f3c8a49f0ac2ff911b7fa66bb1ff0387f4ed9860d478496da1a019ea7a9107d5 2 +/usr/share/doc/packages/erlang-doc/doc/ssl.html 88f16c02bcb5526978d629ef41ba727a8477d9be6e5224a7c8c877df64f38a1b 2 +/usr/share/doc/packages/erlang-doc/doc/stdlib.html d94d634181ad5f47b2db06cde1de920f377ed688f3ddbd1ebf2e60906c4b7368 2 +/usr/share/doc/packages/erlang-doc/doc/syntax_tools.html 721058d23129fb02539d0592a0ec5f2dc552fbb5b47a1819bf2df6f04eacc259 2 @@ -2402,4 +2402,4 @@ -/usr/share/doc/packages/erlang-doc/doc/system/404.html 97aa9472c1cd5736111900a0b19f8a2ecb9784e94a8dccd780e0a1dfff6b81a5 2 -/usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub c5c407d607dcccd78bce5ad71ffcefd7199de169ca776596ef1b0f4292909516 2 -/usr/share/doc/packages/erlang-doc/doc/system/applications.html 49fe3a1512f28895bb10b3e424d58a7a7272b7e86674451a2b4b9de2bef83e9f 2 -/usr/share/doc/packages/erlang-doc/doc/system/appup_cookbook.html 4441a8eb6efe170f2abf8c41d32b077d7708bbb237f67f70084da0269e6ae984 2 +/usr/share/doc/packages/erlang-doc/doc/system/404.html ac4123b4657b0593fba4f1116705a75d4d2b655377bdf31b1f78dae403377b58 2 +/usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub 66a3fbde4d510aacf6ff8d053633d7a0ede29d206f86a3838523ef814a3c5f83 2 +/usr/share/doc/packages/erlang-doc/doc/system/applications.html 5cdb41464b28c123d040cc6232c32b641c54219d37553f07aacacd09f1596a64 2 +/usr/share/doc/packages/erlang-doc/doc/system/appup_cookbook.html e2de14b12b0d105b350cc7127430f65fbd2cb52eae61d0df694ecb7480b7dec5 2 @@ -2415,14 +2415,14 @@ -/usr/share/doc/packages/erlang-doc/doc/system/benchmarking.html 736144b0e5834ae5ebf0d2f666940530f5ad47dfabf7a428c4ce8bf7c2d83b5e 2 -/usr/share/doc/packages/erlang-doc/doc/system/binaryhandling.html 1a0900a4f86964416187083cb24a153bc7841c2540b76a94f7a6d9817bf6a605 2 -/usr/share/doc/packages/erlang-doc/doc/system/bit_syntax.html 7f2cd61c8b51e282efa3cc5a636617f72d74d09c725e55fbea4f1047859afea8 2 -/usr/share/doc/packages/erlang-doc/doc/system/c_port.html 656f519837daefc755db597346be78a583457ac44e60c4510033b2faabd71631 2 -/usr/share/doc/packages/erlang-doc/doc/system/c_portdriver.html 3d99188a76aa0e04e3f9ff6228ed50a029e3d7eb7523c59505d7d20e47383b48 2 -/usr/share/doc/packages/erlang-doc/doc/system/character_set.html 2cec4af39963469934827bb16325c3e9a974a4a5d5cf2e6e76feddd3178c5110 2 -/usr/share/doc/packages/erlang-doc/doc/system/cnode.html 6196554c4a936eeb114383b05caebebdac00a9138dab66136cdd8412d286fd51 2 -/usr/share/doc/packages/erlang-doc/doc/system/code_loading.html c90be8bc5c0fc83dbbb6024ba0874aa299ec811517b48dde9fa920292c7af8f7 2 -/usr/share/doc/packages/erlang-doc/doc/system/commoncaveats.html 84f62ca796ef046f24529b1a6c825e3223d47ab1a215b70b57663bdecd57625f 2 -/usr/share/doc/packages/erlang-doc/doc/system/conc_prog.html 897d856812c96adefd8cf00940e4230f1a14b1004fbe06338b6858461a2ea6e9 2 -/usr/share/doc/packages/erlang-doc/doc/system/create_target.html f527ccc30a778cd83ecb72cddb97f0a31d665873020b9ab1b4445eb1b1c121a2 2 -/usr/share/doc/packages/erlang-doc/doc/system/data_types.html 3bd65c3327faeb8e84f6bfabe2d5f9bc820fc0b598e21c94b172d6ef9e836f70 2 -/usr/share/doc/packages/erlang-doc/doc/system/debugging.html 6d1b8657d73d303a7b5c7927f1da6136996b1ad35a2a8eca254dab24869b30f0 2 -/usr/share/doc/packages/erlang-doc/doc/system/design_principles.html c4511ca628aa505d977cf533a247688c984efe24473edb481fc2a4200b8b62e8 2 +/usr/share/doc/packages/erlang-doc/doc/system/benchmarking.html e3f5ad6d3c293dc993f4409e5ef96410a8deb40fd42b8fca2c9bc365b7d0844c 2 +/usr/share/doc/packages/erlang-doc/doc/system/binaryhandling.html 26c2cdd6269c22d5991c7a4abf3254533821f880edd135b80673f640e66670f7 2 +/usr/share/doc/packages/erlang-doc/doc/system/bit_syntax.html 02b01a310765a34ef7b7ffaca6a26878a3c02c4286b248c90db818842e98daa1 2 +/usr/share/doc/packages/erlang-doc/doc/system/c_port.html 3262f47943f1254c1f98648a1b3623c9ae2cb39ff0f8dec6d65de839d09f6485 2 +/usr/share/doc/packages/erlang-doc/doc/system/c_portdriver.html 371ef3e94de29a7384837a6ee62d067e1a7adbe737246f3d4b6d3f99c19c9eca 2 +/usr/share/doc/packages/erlang-doc/doc/system/character_set.html 32b6b4c3ad6004ab741ec491dcdd33d3bbc67b1f29124b3159f70c60afa6565f 2 +/usr/share/doc/packages/erlang-doc/doc/system/cnode.html 1d2f7826ae546860832c26cdf56c557d11a5250f0248d7f614dbd093580ea5ec 2 +/usr/share/doc/packages/erlang-doc/doc/system/code_loading.html c9a34c3874a5fc11d17589bacc3e3236fcfd88c0fb99bc5cbffe5d80221738e0 2 +/usr/share/doc/packages/erlang-doc/doc/system/commoncaveats.html 75016b30c8e0d083eceae0bc6bf3dd1d6f6e402e7beb1dc0867427262dc419e5 2 +/usr/share/doc/packages/erlang-doc/doc/system/conc_prog.html 3461d5e9cda783397d9c857e3e7bc08ee3fbc0b2bb058c7f14cc5d64938791f7 2 +/usr/share/doc/packages/erlang-doc/doc/system/create_target.html 16faf79f7cb96de1c53863f7f7ca21566cf66e4a20553353979ebcbfac6631e5 2 +/usr/share/doc/packages/erlang-doc/doc/system/data_types.html 58aaf71123a3b0b11fd84b89029554137007cb273777e69f69df9a7c0e31d2ff 2 +/usr/share/doc/packages/erlang-doc/doc/system/debugging.html e9a733de82e6ad53834cb7329b62e096a411d51526e2e571eb7a1d5999d44841 2 +/usr/share/doc/packages/erlang-doc/doc/system/design_principles.html 7e1a1176d12b1d750f64ac5aee3823b0653f32329f24fb274573f5aac13464e7 2 @@ -2449,19 +2449,19 @@ -/usr/share/doc/packages/erlang-doc/doc/system/distributed.html 9d50a2154231e65ae8a473fdf7ac8e9ba86832ecdd303426f7b453dc3a15069c 2 -/usr/share/doc/packages/erlang-doc/doc/system/distributed_applications.html 5b8a7341b8077a34c7a8348d16ced8f81e91ae7a82e93a4142f949a7da7bc4d0 2 -/usr/share/doc/packages/erlang-doc/doc/system/documentation.html a0f65fa6f7afd0c92ad523d26dfd3a26801952b7ede76377e7823293eef805c9 2 -/usr/share/doc/packages/erlang-doc/doc/system/drivers.html 9a748d514e99d7efce6c62bd805d8670c7ce973481e9acfa2b5c85ef9e4dcac8 2 -/usr/share/doc/packages/erlang-doc/doc/system/eff_guide_functions.html 6a9429eb23d610400c73d96bb7e1c35770679e27764ae913af9d3d2e883d3da9 2 -/usr/share/doc/packages/erlang-doc/doc/system/eff_guide_processes.html 8b19bf904eb61fd320006ab2f788a047e0b4aa4495ac67fecefb85959913cffe 2 -/usr/share/doc/packages/erlang-doc/doc/system/efficiency_guide.html 86560e3c6ad75cb83e8ba85a92bdf27cfe4d3b741407cbb38d45f716cc11bfa3 2 -/usr/share/doc/packages/erlang-doc/doc/system/embedded.html 89016b9711e31559b689b6969a3d473da9d701529fd6aee787cd946c17fd220b 2 -/usr/share/doc/packages/erlang-doc/doc/system/erl_interface.html da65882beb3e3c34106f8b00bd42b4d4685eb599515c1f80724390c128f06f54 2 -/usr/share/doc/packages/erlang-doc/doc/system/error_logging.html c3364405d38041b9ac3db0de0d3f974bb5a2edd76481b09c205aea90f4440d69 2 -/usr/share/doc/packages/erlang-doc/doc/system/errors.html 8fe57b7cf48663f5bf56bff8828abaedc0195ee8f222154886d58ad0f0e2ca49 2 -/usr/share/doc/packages/erlang-doc/doc/system/events.html ebd0f63bdf970dd227c0928818ce074fc89812a9cc54d05868ad7dbe7b5792cf 2 -/usr/share/doc/packages/erlang-doc/doc/system/example.html 49c1af41283f277000c5d0aa23637c461d360127fcce0f41f692be9b84a311f9 2 -/usr/share/doc/packages/erlang-doc/doc/system/expressions.html ad02d6f4127de9af2de682c418398ab037fbedda26e03e10a04fb961861f6e56 2 -/usr/share/doc/packages/erlang-doc/doc/system/features.html 40bad694574c6a2e986832debbb3c728e8c00cfd284df11fe0fa6bfa26aedd01 2 -/usr/share/doc/packages/erlang-doc/doc/system/funs.html fe7d11ed443fce9f28bf532082255e497e6d17ab58d1da32cdcdfadc87a86227 2 -/usr/share/doc/packages/erlang-doc/doc/system/gen_server_concepts.html 5d286d874998d88d669f86451feaad476a48150a6f27985622567cf3e65ba95a 2 -/usr/share/doc/packages/erlang-doc/doc/system/getting_started.html 4fe4a037fd33fadc9dacedcf412038871735bcb199b05fa4956d286162f06264 2 -/usr/share/doc/packages/erlang-doc/doc/system/included_applications.html b12eaefd6d85f0ed2633cfe238a518b5db22089b178abe37fb7b2eed0c86403c 2 +/usr/share/doc/packages/erlang-doc/doc/system/distributed.html 1b2ceefe449c1a089714c90e1c950d6ce5efa0264f5b377d8c6dd30e064acefd 2 +/usr/share/doc/packages/erlang-doc/doc/system/distributed_applications.html 3cafdd1b54a80f6cc93f39e326b850d189a3dcd3a5bdcdd506952125dc3096f6 2 +/usr/share/doc/packages/erlang-doc/doc/system/documentation.html 0d34a8990189cfffcc433360c9d6ebb7377d699069a307906df18678ade2c00e 2 +/usr/share/doc/packages/erlang-doc/doc/system/drivers.html 07394a042d4ad5df41d60cf6187b1d7979d7c17a5fc3c315c7c4a17f7398f565 2 +/usr/share/doc/packages/erlang-doc/doc/system/eff_guide_functions.html 1d4f683664dc38da5743be8b76b634e21b027affa016fa321bc790de75d01256 2 +/usr/share/doc/packages/erlang-doc/doc/system/eff_guide_processes.html bedf824899168d0756ab18ee962c6bc7b9929527270d2105b69a148bfc5e3c3b 2 +/usr/share/doc/packages/erlang-doc/doc/system/efficiency_guide.html b9d76e9cee0b085da0ebabff2a2d66faeb455e50abf5bbeb14caf7ea6a8f19b8 2 +/usr/share/doc/packages/erlang-doc/doc/system/embedded.html 268c3904ad6ca54c745a1702788083de07c1a3b2406cb1a2c40f3d4c893a31a2 2 +/usr/share/doc/packages/erlang-doc/doc/system/erl_interface.html 7443f87b29ec844567948c950f3037aa196d4470a06eeda1954cf44e09e32710 2 +/usr/share/doc/packages/erlang-doc/doc/system/error_logging.html ddf94d5f30ea506fb02b600a0002c14a023b4331948e634eab8b5db134385291 2 +/usr/share/doc/packages/erlang-doc/doc/system/errors.html 25d8a475de066f7dfe4d7a0e8aa135f03b4d56dd1993678cff27d523b53d6b13 2 +/usr/share/doc/packages/erlang-doc/doc/system/events.html 57216e1650b31b9f9fc2b1619823985a8a0da63ffebcd7e40b19e540f3566ba1 2 +/usr/share/doc/packages/erlang-doc/doc/system/example.html 09d3526c751ce4ac5520aad371a0a0ef9fd71b1e53059a45eea4285a747ecfe4 2 +/usr/share/doc/packages/erlang-doc/doc/system/expressions.html 51df36983fb444a27b009bca0afaf671e7bdcf2554f1949828c0ab6c85243462 2 +/usr/share/doc/packages/erlang-doc/doc/system/features.html bc18d16c04f1c8039ce25043d88d8efe77a1db68871387a0ea64d40345313cb5 2 +/usr/share/doc/packages/erlang-doc/doc/system/funs.html 2e796b1610aff4b06746c78c16ad1bb48f9b4b651cc3402b33934879844dc1af 2 +/usr/share/doc/packages/erlang-doc/doc/system/gen_server_concepts.html f8c5066bee956f364490d62e311387b341246e2bccc86177828fdb6e1613a8e8 2 +/usr/share/doc/packages/erlang-doc/doc/system/getting_started.html 2842333deed86b88ffa0a4647a354252c67d568f176b80139bcd1ebd24cfeedc 2 +/usr/share/doc/packages/erlang-doc/doc/system/included_applications.html 01b49a9ab0c9ab85925ad4c3c9e5fc8a781bdd0efe57fbd6d7e5a8caf838631c 2 @@ -2469,48 +2469,48 @@ -/usr/share/doc/packages/erlang-doc/doc/system/install-cross.html 3c8f84920fb1f4c17d11bbc07be4a1030ac5fece79cfc20cc1fb0c042ba3cdf5 2 -/usr/share/doc/packages/erlang-doc/doc/system/install-win32.html 1bd5f3c89b05c9590d1833078be8c639ebae9bc64376fdecd0ef93d7af7e9938 2 -/usr/share/doc/packages/erlang-doc/doc/system/install.html 8266cc446a927dfdad1e98babadc50420b5397ff573fddaca2c960f89fbba746 2 -/usr/share/doc/packages/erlang-doc/doc/system/installation_guide.html 03346a54fc0af678238ad7bb10fe55f80f80a9e53f06b8c15180942ae086dd3d 2 -/usr/share/doc/packages/erlang-doc/doc/system/list_comprehensions.html 074911c15cbe94e0ed068b10aad0947248e09b35843a4bc5b7de7936503883bc 2 -/usr/share/doc/packages/erlang-doc/doc/system/listhandling.html b57d7a4319a85407f2a6f1991ba40c28e595263402a2e623acb5bc3e32b86768 2 -/usr/share/doc/packages/erlang-doc/doc/system/macros.html 950cb35229ffcca006ecb1e01ff6d4017f5d1d23952d9ccd1b3282eead5ef8eb 2 -/usr/share/doc/packages/erlang-doc/doc/system/maps.html 14fcdbc822e8a751c9f9425a8afdbf4c6d700fc985cf2a7be3b8418882e655b2 2 -/usr/share/doc/packages/erlang-doc/doc/system/memory.html f40a3dbcea8004bad1d2079678a7207a81719292ef39d3e6839b4d65e2c0a099 2 -/usr/share/doc/packages/erlang-doc/doc/system/misc.html b35f24e9e87edc8bbedd25ab99b54da7065d54e5cc56490add438722d2fd36ef 2 -/usr/share/doc/packages/erlang-doc/doc/system/modules.html ab43310ac3c212fd274b2f191071ffdfbab0283c10c1be4f81642811ae74da14 2 -/usr/share/doc/packages/erlang-doc/doc/system/nif.html 6147f1bafba82071b7f45d6289e3ea52cf68bd542550752eff06cf14836bc835 2 -/usr/share/doc/packages/erlang-doc/doc/system/opaques.html f266b5cc50df7cfc9010c035b9c316580ed1f0f7b69b269c69807763223ad1b7 2 -/usr/share/doc/packages/erlang-doc/doc/system/otp-patch-apply.html 04938f9e5ee9ccda493651bbe9c0be44c4101d1ddf8853c9eabe112917843a8d 2 -/usr/share/doc/packages/erlang-doc/doc/system/overview.html 3065955e6e465456af9b27198d350fb5d8fb2987afadd7488856af3c536c3ca1 2 -/usr/share/doc/packages/erlang-doc/doc/system/patterns.html 7ebefa2edf16a43765dd6319e40b177a90af26774d020df6111e7dfdb44ec90e 2 -/usr/share/doc/packages/erlang-doc/doc/system/ports.html 9a2357a0d08e65580a8ee5d89868592157dca769b81ceefe32c7f2d11a8df7ee 2 -/usr/share/doc/packages/erlang-doc/doc/system/profiling.html f5d6d65c81084a75551d74a94a7f9346c4ef203d8d3b37621bead980087c086e 2 -/usr/share/doc/packages/erlang-doc/doc/system/prog_ex_records.html 10714510e0ae7987b1bdc8a81d50c893309725f98bdd6923515003189c06531c 2 -/usr/share/doc/packages/erlang-doc/doc/system/programming_examples.html fb5db1887efeed1d9e84a7b7ce425f4b930c0681a9e235bb5f3f750b1d2646ea 2 -/usr/share/doc/packages/erlang-doc/doc/system/readme.html 160fac0e7e6de6b689cb7242a5712d81bd7b2ef6c8b5401ca6aef6db89fe8bfe 2 -/usr/share/doc/packages/erlang-doc/doc/system/records_macros.html 560287c16f8d6453af4213747fde6268bcb45d30ce8858bf9130caad694f965b 2 -/usr/share/doc/packages/erlang-doc/doc/system/ref_man_functions.html c81b38f02bcf8a301f003cbb6f5a1bd3c57fd8c683862c1ede0b0e68fc5944b7 2 -/usr/share/doc/packages/erlang-doc/doc/system/ref_man_processes.html 8a395159794037afb8fcfd68101df6f2efdea3d66b8dbb42c204af2bfae77e87 2 -/usr/share/doc/packages/erlang-doc/doc/system/ref_man_records.html 8f2ee651cf67139c8227b9a96279965ff5ed23f9240a6fe66757eb09226bd8ea 2 -/usr/share/doc/packages/erlang-doc/doc/system/reference_manual.html 2725dfb3b97f0782751848bb40d8e3713728ef04c246ea53d110da0f09f769f3 2 -/usr/share/doc/packages/erlang-doc/doc/system/release_handling.html 751d0e53768e462b6a1db2300f0362fb61108186a83ff6c1d6440312720d8e7f 2 -/usr/share/doc/packages/erlang-doc/doc/system/release_structure.html 98147f749c3cd7480a9afd07ca45d475124e4d466738a8a32eb3b03df663cb13 2 -/usr/share/doc/packages/erlang-doc/doc/system/robustness.html c02f5b4352736cb52c6e0e8229ddde0fd0fd1f2d172c7e64129f60fda898ae1c 2 -/usr/share/doc/packages/erlang-doc/doc/system/search.html c00097243d88027e436c65c6141527609d41b4c150e36d509730ef11151f1867 2 -/usr/share/doc/packages/erlang-doc/doc/system/seq_prog.html 8e7c52be21eb976b4dd01c025282db7d643be6e3f11d246c5320039adbca622c 2 -/usr/share/doc/packages/erlang-doc/doc/system/spec_proc.html a50f3669b8a4800198cea0422b0f7b9727d828d4cdb20754a2cb80dd5d1a9fbe 2 -/usr/share/doc/packages/erlang-doc/doc/system/statem.html 23dd22c3a9808a15a1d64b8129d31732a8105d3b3856b2e244325c18e3d1d8fd 2 -/usr/share/doc/packages/erlang-doc/doc/system/sup_princ.html dc15cb0a33d8e1dac8e6c991ccbf65c6d6eadabc62fdcf7b37baadb87ca33608 2 -/usr/share/doc/packages/erlang-doc/doc/system/system_limits.html 34eaca0db09f8d27f09053a6c28ed08c25306b64a42b69316d31eb20e06873e5 2 -/usr/share/doc/packages/erlang-doc/doc/system/system_principles.html 96bd6290b28cf520419e6ec68fcea872573856c5d15eaf28c57c057cf126b904 2 -/usr/share/doc/packages/erlang-doc/doc/system/tablesdatabases.html 828f1b80fad22b8b52029c10aeb9576c3be1c97492037de031cfaa7aee36070e 2 -/usr/share/doc/packages/erlang-doc/doc/system/tutorial.html b4e53fad0da8487a3a296c22d30193ca207c8e9cbb3362e70b04b1e02333da1f 2 -/usr/share/doc/packages/erlang-doc/doc/system/typespec.html 4ba72240082e6fcc5fab6d5da468708534e4648fc269969881e62debc624879a 2 -/usr/share/doc/packages/erlang-doc/doc/system/upgrade.html f74902c96429b0db2fc38ec83ae401071cc6fbd7c24c542603c9a0bdfb1152e8 2 -/usr/share/doc/packages/erlang-doc/doc/system/versions.html fd765717bfc879959de91432d6b7007b05a0a2fd99d8a6722eb91d5f61baf343 2 -/usr/share/doc/packages/erlang-doc/doc/system_principles.html 6c39839ec87f169e651b3c56f4b32a5b1712387a8ee17d21f908b9caa731e8ae 2 -/usr/share/doc/packages/erlang-doc/doc/tftp.html b135cf29b2e48f598bd89b63ce4ff6cca6a6b926b8bbff18d5c3aa2af70e6f2d 2 -/usr/share/doc/packages/erlang-doc/doc/tools.html e57e0d1f47564cf21946d0e11b5002eef429e5c47eb325572e9da0d9caa460b1 2 -/usr/share/doc/packages/erlang-doc/doc/tutorial.html e10b2b7e489c7cdae2211e146f37246ab6af528e9553a36f7648c67b277f6573 2 -/usr/share/doc/packages/erlang-doc/doc/upcoming_incompatibilities.html be3ea6778c30ac5f0f94b2d681dcacc1a4d2523ff4ce7d6b36899fef17c0696c 2 -/usr/share/doc/packages/erlang-doc/doc/wx.html 38e1c75a62f1aa11aaea733a820a6a4b37d8270af9385b7afda675665d210292 2 -/usr/share/doc/packages/erlang-doc/doc/xmerl.html 1f6f825599cae5758888ec8760a0992e70ba966101a053009ccea0d8ce8fff57 2 +/usr/share/doc/packages/erlang-doc/doc/system/install-cross.html 531da3d81351c2d22c1e68670db37eb3b953a87ef06796ffe04bf5a184f5f5b1 2 +/usr/share/doc/packages/erlang-doc/doc/system/install-win32.html 8dacee378ddb0563bcd2305fe71f48b0cd3bcfa0630a80b454b57a4f3731b7d3 2 +/usr/share/doc/packages/erlang-doc/doc/system/install.html 7898bf7c45378ed5e33c40b6002f2520d8a09d528ba6acd65be7d366ce599d30 2 +/usr/share/doc/packages/erlang-doc/doc/system/installation_guide.html f8f9a4e37e948847ab520cef38950c7bc347a58f8a1e1e9f8f66232bb7c7f1bd 2 +/usr/share/doc/packages/erlang-doc/doc/system/list_comprehensions.html 934bf104a8666e5c090c0572c2dda70bdce6d4d4fe72ac31f2d77d2b2459f11e 2 +/usr/share/doc/packages/erlang-doc/doc/system/listhandling.html 6af1dc6dde5e1f83e4f3f43280a622dd556be9955b23e024a146f0bccdc4a20b 2 +/usr/share/doc/packages/erlang-doc/doc/system/macros.html 045b704e5bed5c5dda6d1a6e70344b4d25a270e9f21954c5e65ee3d65800f79f 2 +/usr/share/doc/packages/erlang-doc/doc/system/maps.html 3a9d919c599f40ee3a66517f38f729b9efb0cbd785d0a00ebacebdec020b3a16 2 +/usr/share/doc/packages/erlang-doc/doc/system/memory.html 3160813d40fa4d440db325d91cd7e1751dac1c09866949716f8ec0cb5d3d3c94 2 +/usr/share/doc/packages/erlang-doc/doc/system/misc.html 35281099f0d6b17ce5d98481bac4ec5520e68d0bea2c7e03d00d0c5057eb33fe 2 +/usr/share/doc/packages/erlang-doc/doc/system/modules.html 778e32114439449f2de8461a3729d8f5e1824e2e19e842dff7e8418682846222 2 +/usr/share/doc/packages/erlang-doc/doc/system/nif.html d1ef4ced86ad0b13c340ec6fd052b1b0c5fdfc848bf2faea8550bb7449550bce 2 +/usr/share/doc/packages/erlang-doc/doc/system/opaques.html 17df4eab8f59fd4d08c7c5aa0110a2df49b915a8659f84f9e3f4d68d8c46f354 2 +/usr/share/doc/packages/erlang-doc/doc/system/otp-patch-apply.html c16302cc2ae0a2cee7a8cb2d076aeba052b7e2a56c534a0831ae479e87a6f262 2 +/usr/share/doc/packages/erlang-doc/doc/system/overview.html b92038f329e441922ac9d4272c8ecc282eea56adca8a823c350ac2d639c39ea5 2 +/usr/share/doc/packages/erlang-doc/doc/system/patterns.html abd50322e7c4be1475256792dcc78b60377d64cc3263c3543ab107389cac3961 2 +/usr/share/doc/packages/erlang-doc/doc/system/ports.html 2f2a4dc424dec2df9b917c0b7204bc0f98e4fc188f6ba35b6fa597693a1c9a86 2 +/usr/share/doc/packages/erlang-doc/doc/system/profiling.html c8405bcce6cb965ee8c4f301a7c7857173290d7a2aea7705a4726e3e3955f2ef 2 +/usr/share/doc/packages/erlang-doc/doc/system/prog_ex_records.html 97657ed9aecb6cf6d4226e24d2945564dc87a58257e7e8cccea2372b7d319d0d 2 +/usr/share/doc/packages/erlang-doc/doc/system/programming_examples.html 0bcc7a33e7bb0993b5b29ded3a06806f7e043e9beef43061b3dfd1ed2587ce8d 2 +/usr/share/doc/packages/erlang-doc/doc/system/readme.html 3fc8cac7cc55fe5aaf7cff1c938295340138ee0915825393322363b1d308ba81 2 +/usr/share/doc/packages/erlang-doc/doc/system/records_macros.html 7c194f40fce00522193c1b60b9c2337ca728a32c74b6983f94d4a5a8cc0d61cd 2 +/usr/share/doc/packages/erlang-doc/doc/system/ref_man_functions.html 3e29a1a752805d62f997ac2001eb37e217b4bb5be2b6ab2ff4f5f73b933eb53e 2 +/usr/share/doc/packages/erlang-doc/doc/system/ref_man_processes.html d1aa0430a7b29ad7fddd10f7c983640d17491a487bb680a6b95e8ca6a929411a 2 +/usr/share/doc/packages/erlang-doc/doc/system/ref_man_records.html cc6e1701437b2923ac62bcc1939bd1c694fe15273c159493e35766ea8d4ed331 2 +/usr/share/doc/packages/erlang-doc/doc/system/reference_manual.html b6a17f0c5b8af26623a064246216c6f61765f8eab7e3e7d262368b0f2263c5e9 2 +/usr/share/doc/packages/erlang-doc/doc/system/release_handling.html 92d4c78732e47a03b5f3ab11567bab4d8004b4309012c05c7544aac1d1cfa225 2 +/usr/share/doc/packages/erlang-doc/doc/system/release_structure.html bab451bfa233c78c747301e14f7fa310d1f55524dc18416ad9a2377971eaf3d6 2 +/usr/share/doc/packages/erlang-doc/doc/system/robustness.html e055395e4caea2a29418fde3a56a9da9a47ceef7e899018a2b691dfef5c4396b 2 +/usr/share/doc/packages/erlang-doc/doc/system/search.html e4550a6633c04ba5064cb3498f0e69f200c30722830f6e67c5c97bf330a515f7 2 +/usr/share/doc/packages/erlang-doc/doc/system/seq_prog.html 8c52cbe26e049d5029669fccb56d0b0052c1f2b2569c75000936f3d2c2309a8d 2 +/usr/share/doc/packages/erlang-doc/doc/system/spec_proc.html 19baf59aaba08b7afd7d466f4a6a277a36fe60dfce42c6bb862fa5c519686a56 2 +/usr/share/doc/packages/erlang-doc/doc/system/statem.html f3d4d1faa12fa2ffd9968e442f14cb31434d8f6880eb103f282f5d890837f2e4 2 +/usr/share/doc/packages/erlang-doc/doc/system/sup_princ.html 7ea02950ca59d5f90fc737009ed7643312ac54f05728788b1dc288207db6c0de 2 +/usr/share/doc/packages/erlang-doc/doc/system/system_limits.html cc61ec1ed6f2ce2ead11427742b9a5be79979932b6cde657fda3bbed482a1e97 2 +/usr/share/doc/packages/erlang-doc/doc/system/system_principles.html b69daf9be77f55e66cc1fd6214111d9346df91f1830c5f984592f8fcf9d18a7a 2 +/usr/share/doc/packages/erlang-doc/doc/system/tablesdatabases.html b0defd658387c6524b9d89d3e567fcd605c04ba49f757fe97a7763a28d686c53 2 +/usr/share/doc/packages/erlang-doc/doc/system/tutorial.html b4127e6718c56073d42bc0a09ab9b6a039bd36cf5d12de555c4e12a72c9e5318 2 +/usr/share/doc/packages/erlang-doc/doc/system/typespec.html 1f8cea78c12490257dd1ffbd892f622884e9407a8b13a0f4e17c93f96a0fdb08 2 +/usr/share/doc/packages/erlang-doc/doc/system/upgrade.html 87855be922c4ac0b61f6881d7b5364933cdb62e45ea48cad081a240cee405937 2 +/usr/share/doc/packages/erlang-doc/doc/system/versions.html 497f3afd9d5f11e461849f4c8fde33229d19a60199c347e06165ee2a9a64d21f 2 +/usr/share/doc/packages/erlang-doc/doc/system_principles.html 3dcc44acf65c14f9371956e4c72f69e4a682042c8459b01423129bfbe38aa4a2 2 +/usr/share/doc/packages/erlang-doc/doc/tftp.html 5c6d38af5abc317e6634507930518e497d68818fc9e9316172c59c80e28befb9 2 +/usr/share/doc/packages/erlang-doc/doc/tools.html 2da8d19bfa6b6d3543731453ead80ead26ad740627cbf09b6cea8d8cd32c0aba 2 +/usr/share/doc/packages/erlang-doc/doc/tutorial.html 34d745414d16cd39d3df049aee4e2725315a866250ea3f9e4db2c4e85e114328 2 +/usr/share/doc/packages/erlang-doc/doc/upcoming_incompatibilities.html e866358fc8ab3b379a2464d05b7d4fd7b5a22de20c952bad7ba7424ff16ee9c5 2 +/usr/share/doc/packages/erlang-doc/doc/wx.html 1ae4c7f63b24dda83a79507469a711cbf9177c0e2004af2231f02d36cf335e5b 2 +/usr/share/doc/packages/erlang-doc/doc/xmerl.html 7b929bb40b64b73027502ea83ce7392e4a67b28b430801d9cbc94ba339e173aa 2 @@ -2520,5 +2520,5 @@ -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/404.html 53c2df25f11356b16d39b1e433bdbce089100005e5978060a5d19f8451018446 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/absform.html 27f5c57d887f6cb95391f73d755b639a96b6be497b049f992ee13d553e885315 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/alt_disco.html ce15cf8cd11a5a1fdb820679339b0ff6f93c5c1de019601970e2111d9917e04e 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/alt_dist.html 95b4d69737e460d8fc4cda274d592e92dc463956b8d344f2f09e9dbbede5d7f7 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/api-reference.html 45a944688d83a779541ec61da0afab1aad8e5be4cb059a2eedb3d3a807e632a0 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/404.html 4172a736fe018f361f8cc95368ccc081ab040ff2dcb8f62ed4e6f961ee273bff 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/absform.html 54f98f4bf43a2adff37ea60554e64653bfe8a8fd49a3129cc62f79e81bfc27a9 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/alt_disco.html 8b2838f7c0473a1a3ca434949f3cfec6a61537058bba12268268ae181c589455 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/alt_dist.html 7be223427d4eb0b3e822042a8f235769119765a1f623f3c8feda23accee86d30 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/api-reference.html 1a5ccd872f8561a0fa03a18ff1e61216e52535a57f2181cb0e9537688110065c 2 @@ -2540,11 +2540,11 @@ -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/atomics.html 3f153508821b81058f0ad10860a9a3d6b7148eb6ea89aa898e13ba8c2bf63b70 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/automaticyieldingofccode.html bc4881293b6682e153d7897a35a5558334b56e82b4ece514d165d973ad86a28a 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/beam_makeops.html 804a095134d7d9742d940b5423c51bef833ae3ec13247f225e339f6340871655 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/beamasm.html 29befc5863a0f8396a96ae0aaacafc268a389757694780887024422fda10ff82 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/carriermigration.html bd3dc2d0e323899b263a40e938bc141e4a8993789f3011d0e678b8c7f0fa9b28 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/codeloading.html 05daeaa1e44b034b630fdfcd204b0a6c1d5dccee31f0dcc241e2055ef90385ba 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/communication.html 20a85cab13e858986c26085bf643a6db5e41dc0e89513fd190a5ed76e81b1427 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/counters.html 36add111301d22f67a69fb8883e37601b711b3365fac7685cedc07f200f9a9f4 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/countinginstructions.html 18b33e7d51ccd3c3e536a2a6e60db92063526c06cebe2b6ec78caaa5d5a291bc 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/crash_dump.html 196ef97546a62af03669970b8c62c2e526d3f86d574b966198082c0eec0033f3 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/delayeddealloc.html 4a9842841408862332505b409553a4a249b4e146e115a05a03cc1ff2fbc6503e 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/atomics.html bd732e33ba9a7d77d6c11895a625ee087af0c53f09e793e8d743db6b3830370a 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/automaticyieldingofccode.html 5f72f8222c26e579fdc7a6f63697196a9d6de68b590dfd8cb9969391ebb5da0f 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/beam_makeops.html 20c15788cdcc86adf9909a229a7965b2244141263a18e09fc2a803026c3ee634 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/beamasm.html f6667f414aa2b084e8574ece8a2853ef7c488f7d03f83b50f92dd8592f14aa52 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/carriermigration.html 6af08a53eac5afc9492283c6e07593306d8594d4ee3f11606fefaf2e8cfd3d8b 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/codeloading.html 6197167ee1d0e4f93b92386c3317e3030476be43a9a4c769bada85286be4b464 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/communication.html bc957dde076ed42285ef240b8569406bbec21fa5dc0dc16216ffabfc695facb2 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/counters.html c7c47ac96c04a00d8c34f715af06ec0b6fa50ba85a0b58e3e0d83e3827ed945e 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/countinginstructions.html 6d8642516531bb09b0dda99f5b5957650733e811d05e6b6b008bc9d01b0d40e8 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/crash_dump.html 7137491b3abf218d2ce892bd0010248763f2beeec0d285542d424f0c5879ad6e 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/delayeddealloc.html 666ac85a62e80fd32a6a8ecbae57b5940a8edb9f971dda8a8a8f77b887ff92aa 2 @@ -2569 +2569 @@ -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/dist/search_data-45BBA3CE.js 97a6b6f95b5745dbd4f4480e7f71b1c868276f26c586935ef0969f7c8e1cb660 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/dist/search_data-4F4A610F.js 1ae772bbe9aa18da519415332f8fb7de341a1b82f6dd607612af0f502e3ac635 2 @@ -2571,16 +2571,16 @@ -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/driver.html c00e043e8a6c88d0e82e87ab45610d4dd7c61d11e0849a0b4313d08346871098 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/driver_entry.html 92e10854007347960a466ce7e90234e75528ae1a1eec8ce8e75c0361c1da9907 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/epmd_cmd.html e2cfa235b77e5e7543026b5ab4be94174819304c4a255011efe577c0c6cee84b 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_cmd.html 85af75ab1df2c31e491346bdbfe821af7869b40d960867f0faf905b6ba861cdd 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_dist_protocol.html de566927cccba7b131c106f8b29f94339a970fe0520aab26140801cf5b3f3dea 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_driver.html 4b97d757b2482e9c1591f72fd90a0bb8d7183eef7a889f5c82f96cca5bdb23e7 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_ext_dist.html 9b1c7535fb5e65e956dfbb3a275b1649957122d3936118bce4c6cd0c8f07c319 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_nif.html 5814c9f1acd6fe5c1d0ff2760fa0568f3017ce5a89dfba4575700e23a1b3bd59 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_prim_loader.html 9c3a6a7d8fd89e1c092066fd1906c417f0ddaec999325a05a9dfc16a663ba01c 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_tracer.html f8803c9cb22ac374e943f607bf85d0ce6e06d5b3c1718c77f85dcd5109697e81 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erlang.html af8351252bc3f19cf690ec394f364c6bf7f065b17f6230be1ab1ffc5616ff322 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erlc_cmd.html eb18d3bc32449cebc25c0d34c7c1d2c473967fb0ffff8930993839e16bc1173b 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erlsrv_cmd.html 9f0856dd910edd27c6eb7a245332e3686841608375025e8bd222188896e5e5e0 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erts_alloc.html 48035719bcec36f731ec9b18654b24241bbcc6412f954ed860112e63503d6d3f 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/escript_cmd.html 59f7a9e5140ee9b16772eff2cb980958e21472bdaf88969a7bc166827e5f46fb 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/garbagecollection.html e01895c6dfe7e6c205d6289e530745b9f7834d36c99aa4896cc7c03ec908d765 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/driver.html 09c3d59e886e70bed5a4be0b4926995d00ea0bfa68bc0c2f19e0569086503206 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/driver_entry.html d9e4260d007931adac1116d451e187a8038269cfb26866752c0ff53bb8e607e7 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/epmd_cmd.html 771b1e5e370a252284fe98cc395e9129b747390f4add9298eda551252e37b16e 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_cmd.html 5b509f5057579ab739f2676a6d1385ccf4069a05a644e39b01430c230c71da47 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_dist_protocol.html 430c16bbc768107d7591b1d0a2b30f3a1e14db4ab6bdde26d74a24aaacdc1ba9 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_driver.html 5c571addd73e15ca660a4aa1e72291c330516bf48853a6b657f419542b6deabe 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_ext_dist.html ee9c07c7abe98f1ad4e8718fa15b597de071c74ce20d27115b7af974b2a3c090 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_nif.html fc676f46486d3c2d56c1fa78c334575746918bd5503bc1084d01fc50411e135c 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_prim_loader.html f32ee36c6f7352c1e45a52e79f5499613fd719e7f62865001cf10ae646d3984c 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_tracer.html 7fca7160dfef2efb25b509509bf48c2c800122b8afb4c6f4862e2e6d2fee62e3 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erlang.html ec0d847c59b39c31e6ad138d77d32fddde50801c23cbd0ceff75c2aca731819d 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erlc_cmd.html 50106eeec3c15431c12002a88144ac041f98d61a7d302027d33966849d9bcc6f 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erlsrv_cmd.html ac1a27b2f7450c4bdf76c429d2eca389ffddc6421fb701bcae293cd30eedef82 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erts_alloc.html ad8924580cef56a5118aead0f8eb3008f69ef697d16aaeacc364e099479271d7 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/escript_cmd.html b316a6c5babe128d51a54c73923af14851a47ee9a8ea65bbcf858d6bc84ba56f 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/garbagecollection.html 9276d9c93a47c78cedd8da951becaf7bc3559a4a5c3a9417a94ef0e38294ab60 2 @@ -2588,20 +2588,20 @@ -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/inet_cfg.html 61007b0154defb5fe7dceef83e93394ad9626116c8060eec8a0529136eedb0f5 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/init.html 8dcd209e1e59bd926d24872f7e6bfacb41452abf33ada758eb5156fd030550ff 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/introduction.html 08dc465ee8596e0a001b9759e68a6d24dc36de5138fc58f94c84b9b2e7715172 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/match_spec.html b5715e44aea379dbe73b304e29f40c41647f54aa299ea8cf361d8262a38969c6 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/notes.html 02c1b937f7f127328640d95bcf85101ebf74cd833ba856e2d090a4d83f21cb36 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/persistent_term.html 614f05ee5e61601f2756cea80d0c4f69c2ed893a1fd669a962003baa687d2355 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/portsignals.html 13bef9947742650b982b8f8dde726298715cba902ee2fbf94df068cf817a535b 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/processmanagementoptimizations.html 4526af21d99697be0913a8237bf4dafd434bce400f1ca15abdbb9878d5a83e97 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/ptables.html bfac029aa9dd9f7a38607c329b288c015a78b7304f8718dfe77365fa0928d185 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/run_erl_cmd.html fdaeee48f88ba59c6832557a13d9392bcd24c6ff5d09820ac1a028b276b4bea9 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/search.html 7b60d9f94171758bdc1e0c8fb401d0140e7520b381a2ddc90259baac5acc5de1 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/start_cmd.html c7abd4eb77b3ab4e9045471dff706d34aad72bd703b9f05eb55a79c6b53ef410 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/start_erl_cmd.html 1e5a49c8b54b9565452fb6efa2deb21703b1d5d09c1d3d1bf5e898ff1661bdd8 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/supercarrier.html 76f2196a4c4fb328ef3087feb66f466cb29d8b0de5a2375177d5762c65e76977 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/threadprogress.html 08e7f0c1e66289ee5cd605c7c1a1efb95a18184750574e6481fb9bb48857ced4 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/time_correction.html d5197c02cb75a5f3b984976c520bc59eb54eb83994d6b80fce0da6ea312a297b 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/tracing.html 1a2363a7fe1f719bc2d6b0b213e2a5b71c404715086c5dc83ca483800bce2a8a 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/tty.html c2dd0f127b16068e90a4a64ea6767f4c48a562af551d49b352fcfe9a19aca36b 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/werl_cmd.html 187ab7462561b0e906e975591909dc91a7badd7ec2ed090d2b0845a69ab2c698 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/zlib.html 061a18d55ac3b319b294aadc02558473095979307a1bcf6211c34a6cf129ff78 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/inet_cfg.html 923a968896ae7630d4cce423b74de350392b3f82825a86b465c1a8e6bb44efdb 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/init.html a5c45581470bae9806ba59d7e77b112584fee898a4b0de602141599eaf6424a6 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/introduction.html 5634dff03b2555d3d4ce9176c511807525823090edd5fe33316b965dbd959126 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/match_spec.html 71ddd415fc7f5322f4a4cb02637c437af10e1df6c5d7c7a365fc77606dab4a8d 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/notes.html c21f4f823c1c0885b4cc38f9716aa5c7b60dd6da557880420b01cb2853027190 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/persistent_term.html 5d99a4cb8cef86f6032aa1f6ee0f212f0b5799b2e7eb9483d0551fe5746873e5 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/portsignals.html ec1a32513d9646e69fc731e53321e9e598e4e97fae7311fde630d63cb93a836e 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/processmanagementoptimizations.html 115ceefad66e9e190644578c3c4fb36787873edae7e5da59ded94dcb642d4854 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/ptables.html 4da6481767eca7265ffb97972b73ee2d396d6b13f9d3a6456ef53a815ff937fe 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/run_erl_cmd.html 16e162b7a79eabb4ea9a60106ae25d84597f65911bbc6ce28c0dd65847e4ecff 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/search.html 197b405160ecb99ed280d909b1451c3ae1b5172703ff6faf527ecfcf1b74cdbe 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/start_cmd.html adcff377d100e0649bf0de4a05c349a43f3e9d4da2b7dfa760e6d8c447dbec35 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/start_erl_cmd.html 38e7fd61bafa8e7e3fbd3b70f8b7c0a5adda73c1145a3b0cbaf3cef80222d5d7 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/supercarrier.html 6e3ff2a91b326226778a9cfa0ea39ff232602376f6e353a56437fdc6c3893371 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/threadprogress.html 6101b68c0b578cced91ebf8cd2ca2311b5c8e700e0893c12a66ff0909ddb1b30 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/time_correction.html 4684a76935b2f76af99f810866f66fd65de5e367914414f52e8ccfae43c00295 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/tracing.html c8769c51c00d0fa981f5b1145cba984c24cd1791ea12bdbb9bdb6a04bf596730 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/tty.html 2ad0cb95d9aa5aa54c6baf04d0bad72352a546213c69b5076be72fe36d5e3fe6 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/werl_cmd.html 1994845931e646027b13004d4ca1fb622ced0384544e5f40193818ee29b23e61 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/zlib.html c50daea06682569408418366fa89a85480403ccbae531f5f840f70dcde0898b8 2 @@ -2612,8 +2612,8 @@ -/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/404.html 46902c6bd9c229a1d2666d752924c3d6c7d7b415ae5a9bfa153997bcef02a235 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/api-reference.html 85470e8fec13fb3b7736712121102fc3edbb1c54008f912af789de77d4b7325a 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1.epub 68a49eb6a30330b5995ea39ae5a3fc2e05e79425cdfa05a614f3b163b7038a96 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1_getting_started.html 8d1b943d08ec2bb3cb5624c327eb5c0106647d8a20ce36c944dd467f2759c1a6 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1_introduction.html b569c75b474e0013b7f4f8fa2b9e58a9d75507efd53e7b793f801bbba0fa0638 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1_overview.html f0ffa31139aa698f42b398e13ee77063d7927a6426fe91239ecff5fbf612cbc1 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1_spec.html 08bd9579fdafa37e5dbc1e1e096e3ab17ef52372ce663d92c0574a222941e8ea 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1ct.html aeffadcce426a0a042da795dfbd8dc5d31a78f6d6d1ba1ef03d2ca5591dd0560 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/404.html 53cd4c77aaca7539b78d7c096eeb236c240f6ce150a0e62fe20f4a83fb7f1640 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/api-reference.html fbce71fd88bdb0eae1dd903a6cf786c481e6ac57f28c5c05708ac766398577a5 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1.epub 43f1a2318848609903d70707971837b60d6a46210ddf27edb2011cecbc86b7bb 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1_getting_started.html 1ef3b439d86b0cdd6020ee751cccc2dfcecb55a845063e57504cc6703db77fe0 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1_introduction.html 63036b042ecea936e0c1bffaa82897555bede7cd8472362995bf5d7d69c5eb53 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1_overview.html cf598d9ab158723452a968bd9acc89804a292e3fd4268360067b743f898987c5 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1_spec.html 912d982d9c35cb06112f27266c3194b8327eb215db2595f776f4eb525e0f5910 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1ct.html f53b7defbe0cd29c198df8f9cea5b69341e6fb0c222d5e00dd41152c016437de 2 @@ -2646,2 +2646,2 @@ -/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/notes.html 69cc6fdaf73ecdad615e17899c0f718bd1e34c6c20722f52aadadf663ff8ec5d 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/search.html adfa5a6ca59ab7fa0a5f8b1fa9c00326148d9307f7be52e072371e68796a0233 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/notes.html 99c99f64a770da3ca58d01aad198ba31d9c80d077005eb866c94a2150079c1e4 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/search.html b4a0dea5925ec7a5e14f67571718ea2b00ca0f715d5c17f263f89b655c26842a 2 @@ -2651,2 +2651,2 @@ -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/404.html a00370a63724710918d6ac261f43d92c47b1c2d79e496440e043cef41b43234b 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/api-reference.html 4a22b56a97f2171a57e31a4f72f6c09f5a663dedf646648cdb8524b4ea11ac48 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/404.html eed47739bd8a357c1bcd1a6cdc6ac6b6591fccbdaad5ec8cf082b27b6906eed1 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/api-reference.html 124a69de7d87b986d32d254e84f5764aa402c92327552f3e294716ba9ac943ae 2 @@ -2658,24 +2658,24 @@ -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/basics_chapter.html 86df8295cf8d7a6897d2ca91c5a56602af363a95cb6afdb48d808cd40e08e664 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub 31dee63920eb546dd0d4d3c80443ed6ffbe6ab49e91c1f51042f7629f652de53 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test_app.html c251f0f75fa6455305c2c71fd229c5fe63d3aa0fba8a77b9fea72106ac443574 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/config_file_chapter.html a7d639bf0547604a9863dae2294afb4a8d238cb9d7c53e821b3e8626fab5e00a 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/cover_chapter.html 87e8ec7e37e53f2334df35076daa041fec909cc1fc98321d97cae7e3ae844ece 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct.html ee4a72cdf656b169b04a77e77e587efe1792dda6e5a19da5806edbe3580e5012 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_cover.html e971d9e719ceaadef413200b675183ebfe95bf03e2565a49b91de8b2c372e724 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_ftp.html 0ee78de1baf62d0c54a63a1c8981931722e70f0c62912b2520e77cec5717b168 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_hooks.html 782f511e1ea8b98c16db1e7d7df23a29d8e2be70b083ef0f8da6841a121c29a8 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_hooks_chapter.html 9499aa3ec2fe19fcbb3d20af0c72e2bda70637d830c3431d16a74fcb629d52e0 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_master.html c20af4ad3d89d15d9b573b2110293715657c34a82117986d624fe24294d85fac 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_master_chapter.html 0db3e9392da06eda77a3e7a29e18a10e738ddbbabfbbb67e36acf615a3bc1675 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_netconfc.html 4bbdd00be9d4f7eef24abc38a1d32fa5782ea6ac525f28bc976c131275f0c08f 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_property_test.html cd4afa10f2215249535081bd6a5b0b555e3bb26267df3234f884013f99ca22d6 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_property_test_chapter.html d24724c29bdeb39dceb901dad1d291358104bf1da444b08c11efe40df51a372f 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_rpc.html b65c96822e0c7cac76a40e485f3aa909835fc04ae0fff1781abcc55b73eed16f 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_run_cmd.html 71b9a25a00afef765beff33a0d678c50959272bba01ac1b38521d7d0121f30c6 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_slave.html 19d8666202213d972a901b73cc0b2ff6d3df0ee45a9fea179fdbceb16a684485 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_snmp.html 30552e8e81b6e03d0ac4f50ee935ee8a9f0a1fbf0d5549483ea3c563666b61e8 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_ssh.html 98482a023927142983fdb614723089477d76911fb10355da59672e19a46e3021 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_suite.html f5a7026f71f5035fffc138834bd689c2c35bd5302751499e1eef5ec46f017fb8 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_telnet.html eabcc4ad2668c49573289d987676b7d0ce88f0ded693a4cc12b5b2615fa19282 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_testspec.html b56e3f34d2d60d494e410b38e01712394f5496982663ea3481047a82494d1b18 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/dependencies_chapter.html 29f09aed0504085efd918f657658ac1c8bed567220c3b02207dfbd4f998dc010 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/basics_chapter.html bc0907db8843e0c868160d2a58fb53e2a137b4440b380d630e9a4d3c8aad0035 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub eec2a21b2c59cdb6829414632fd60064b225927a89c1b8882870c32d72e98012 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test_app.html 9253fb8df0faa2f5d48572eae1fe2c5befcbefddc09cabd918a14aa96ee3e179 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/config_file_chapter.html c050ac07a6d75a27380e1a29fcff657f3ffca4b2f80ec984951ecac036863063 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/cover_chapter.html 28b274f846a0307f7fb50a90a56fa0a8362a6607593b8b7f7c45100f83c0b6af 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct.html 3f6a8524428fb255221674b55c5fa046229cdcf61d0a20eff4c7b01312778a60 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_cover.html d89a35e79ac2120ce588f94e8f22222c6cc252101ef29197587459835fe58af1 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_ftp.html 29a22f8a2e37c92e525a11eb6224fe2874a7d0940523d7e8f705c29f4303f54e 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_hooks.html 5cf24af1a2e0d43161ae003a291acc807f2792ae2bdf9df81215ca770fabb35e 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_hooks_chapter.html 8d00cd581fec2b9092840d5fe136776c5741b139ce8bbaa419f5d1bd654e777f 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_master.html a77ddbcde45017dc8346af84da56f88ba70e7120e3b5a7cbdc249be58371a53b 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_master_chapter.html 90941aa55cc48c0ae748f47f588dac39ff88d81b56ed6af5f80c12ff9e5e2054 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_netconfc.html a7e16b7369943abdf712d04c88a5c33211c03423bf93ac160742f1179458a73f 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_property_test.html a3b8306cf679b44a56147bd8a6bc0577742308877332fd23c7063e205b31b35e 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_property_test_chapter.html 494ca94443a12fd12e2b3311497e53b74ab1ef8c21a729e755e010a4f0bed2f1 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_rpc.html fe35e2eb67892179fe4e68fcfb2b122f4172fb0045abdd6c02d991e22fc84422 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_run_cmd.html d2ae0223e8136b5462e5dfe5a5406acc266cb63b6796e595d93aba762e2c2216 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_slave.html a8495cc42f05d957b95b782a591a7e1786ae72125c08616a010f5555ad5556d7 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_snmp.html ad7fc49704b2a8c981aff299fe96949547097920c27cefcafe172acc5de319c2 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_ssh.html 6bce763df4697fcfa8c67a85a142a49a5a8cf9d4861f1adb703cd8e890f9a8ee 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_suite.html d34fdcf60a6f60d0cb88dda24d60ceca9860cda567ddcc6d0ef2dcb1c3ffefab 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_telnet.html f1eff1fbbdd8aa35467f6da47c88fb0171c17cff5927dbb734c5863f3f9c9dbd 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_testspec.html c44177fec14539f166103d63f4be6f235d3c571a5ad98e835d396c0aff316a37 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/dependencies_chapter.html 11f017e587c0c2c9410d3a9287c905f9c04be3df2521a098bd7b431b68aeaa01 2 @@ -2702,3 +2702,3 @@ -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/event_handler_chapter.html b8509e64dd107e0204497f3e17e6fb2ecc1fc6c4349b4bad05be1da7a7cc6679 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/example_chapter.html b13e43db9f9e189edcdba82ee67da524b5d475c2d91f896d55f40868051954e8 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/getting_started_chapter.html 7f82d06db56cdb716583a77a15fd337160dfc302e0a64dfda2e81898063db57c 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/event_handler_chapter.html 2f69b0cb93d141a69c467544d72b25f49c21c3beeb9106a5f4f2351c07ff0de2 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/example_chapter.html 5751486287b4ec7cddecf28b05e58ab12d6997b1d36abe1915ccb0d887e300d3 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/getting_started_chapter.html b4f73d352ae9c9babecfd7879af08939de67804b2d409a19b630302c066be589 2 @@ -2706,9 +2706,9 @@ -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/install_chapter.html 6afb96714662daeac80823826f293bd7749305e2693c50333ed7aa2be681796b 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/introduction.html 616c53d60acea246859bf8e8bd2a451f1c13dd87f14041d2597dbee5ab37ebd4 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/notes.html dd166734c78e58f681c2184ec0f6be09d81ef1ac334d7a75e318532c747e65b4 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/run_test_chapter.html 8d1175acb272aa4d90fabb39afb9d81b435cdafc113fe29874ddfb7273dc1363 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/search.html 010f355d1ede5741d7a4b5b1daa75c161eb3acedaef4463e521e04db166aaadc 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/test_structure_chapter.html 2aa97ee19e532d0f9a895e3243e661ea87ee5ccaac80c29dfe4ae099eeeb7fbc 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/unix_telnet.html 4175facf13add96611b86b1cf8d0a598085daaae43c9bfc87a2a7b6bf9475580 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/why_test_chapter.html 1b1b0335b6f577237f934145643ed4c573732492bedc10ed739af17c3d53bf9d 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/write_test_chapter.html 95692ab1a54920228b643e4763f1f54484ba49ce115f8bdc0d7336cca77866ce 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/install_chapter.html a8215a11ddb210afff77db6aa0eb27d4284c476668ff128ccccb3daf950b6dec 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/introduction.html 43f802c0ff97060fad4ad3d794c9c7101e1dad27ad70beab0aa1405b3cc6f99c 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/notes.html 52f71c7806ea810dd5e5500b01c6ec00114e8cbd1210bb337cd32757dbb6ef63 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/run_test_chapter.html b084f424b1fbac23d5f808b774c1829abf983750db917e7d70a3a6809e9422fd 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/search.html 91c0c05e71dff80e5a196b5e7e48c72a5edeaf7d6ca262a66b2a719cdb4dd98d 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/test_structure_chapter.html d40c203900f9f1102894f7872c6fa0c01502b85c7246d8302ed1478d8c9f4acf 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/unix_telnet.html 7b598d0a255a565364a400f28d611f2fbdd9d513581f765e0017345f6a0f79e2 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/why_test_chapter.html 450c33664b79bd4199bbf464cb182385cfb88e6859bc6a4f571e3d772f3cd4e3 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/write_test_chapter.html aaf6b373ab4d1cf3535d4a820ce9a5d57305fe2ce696dd9f48008c9d2815ba77 2 @@ -2718,2 +2718,2 @@ -/usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/404.html 178d81744b607128f06aa7def9f834921a1c0f6704c1349947ea0dbd83103e22 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/api-reference.html 99c572e0dbb15ad9aa4fa4541a42e20c062257117248e1255447bc0b71ce4189 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/404.html e355c6a0f46a59e5ef262e52be4f3a2f435cdf9e2782ad47639cd6432e17708a 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/api-reference.html 150a03d099af75bcad9aff71c1167f0eb2454740a4bf5956c98ca7c485531bab 2 @@ -2722,6 +2722,6 @@ -/usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/beam_ssa.html 9a61d51790b1e0873b0c4f1d98ff24f251a19b2e71de7b04c9f62dcf560b35ee 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/cerl.html c4e15e73ff4674465fc2f839516facd823bcbe96c046a95f7f14b2d1a00fd859 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/cerl_clauses.html dd9aca18d25030e61d7508570608adaa8059efa691399de1eda2d1893a4042bc 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/cerl_trees.html 565876a043eb9c579a08b077e4023b17ae5834bfffeb6156ce4f688aea81d216 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/compile.html 1f42f44b22e5c3975e8589fdf6274df00682f595c9c770ac0a847e5142dffa2b 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/compiler.epub beba0da1360b57e22066324b34c5e5b2d40cd82f1aa94fde90da3037334ceac9 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/beam_ssa.html 7215f35b4fa6f00847517bb9906b1e7cf00fb1399e5be9331c592cae6de3d08c 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/cerl.html 3a80e6200a3755b016e8f252a7d859f7669224d6bc6d5eb7c5c4bfcb399b9d73 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/cerl_clauses.html 3d04ed60f6ad18b790650e74cf333b31173dfe011f9a4386bd43846b52debf2b 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/cerl_trees.html 09b2a0b16bc6b054f1a434081eddfc390c726566ee4d25bad3d7dcbb3587df70 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/compile.html 116a934ff4714e4f05baa24d9e6d73cc1eac13f0e10f90e57a4fd1b53f01d2e2 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/compiler.epub e74f7d18d4eae6a04688ed3eac21884dfe5d1ea45b755c77795c03d036adaf03 2 @@ -2749,3 +2749,3 @@ -/usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/notes.html 1613c4604382f684ca06600b4311466bfffa771409056e9012b16ecc79198d42 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/search.html 27cf08c35192c72ce241027ce890ece3c0d20427e17a529a320a1cc404a259b2 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/ssa_checks.html 4cd0afd04978b3e9e830fd93f22b0ee95673213b50ba4f6be09f5c8e6d9e103d 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/notes.html b73b4aa629fd27cf8d3e0c973f212bb6d95081bc694588d8bbfa100a7350377a 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/search.html 0de6a2066d5ce4a9ace4ad2dfffb288dcdcce30cf6ca00b78d63c54e13ddcbb6 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/ssa_checks.html 59d7c5ea7bf6e890dab61b60d632e16ea53426889c63fc05141e394c770afeae 2 @@ -2755,3 +2755,3 @@ -/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/404.html 8db4ad8aa027e6459560bfd4920619534688c2e02d3ded7069144d8f007d1050 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/algorithm_details.html 44c215410cc25656fbcf70b5ee2f6a0f6a80d6740a0b698793fa4c997fb4d1d4 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/api-reference.html 848f387b489e01d9161ea82e6ab25b12d342f6b1cc15667dba72208ba641f981 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/404.html 548aca74bc22bf28ffcf21f060c931db409df5cfec904eb1cfd85ff55455b855 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/algorithm_details.html 6b0cc73790589e41dd9dadc6529ec69dba0c740f357671f66926d086d62d5695 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/api-reference.html 92255d743013f7ca2f99b0e6df530757bacb1668b663a65e70d758f5b0796897 2 @@ -2760,3 +2760,3 @@ -/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/crypto.epub 0ae6ae4ff6413220d04908ee0dce237e301296afa3bc1d4f05737d71a6e1c2db 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/crypto.html d3e2a98aff77d9d146716f4a6070f7e2bb76f51db3dde0fca18e6f06e77071a6 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/crypto_app.html c10a2ee3bafd2a2b78e599ae18cfd80a1e1d3d56f9b4e732d7bcef0708fc5735 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/crypto.epub 21c5f5574a7ddfb9d69cd9c27ef163ffa4cd6a30cfb2c29be9fe6394ba79c61a 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/crypto.html 69cff0687a2ee1e99ed4627fec173fb9e36bdee53b8eff144db0ae21c52fb2fa 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/crypto_app.html 22d89bf63525c7fcd7fd78de3b4350c981ab7cbb7ee4ea894cf0c954da62130b 2 @@ -2783,3 +2783,3 @@ -/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/engine_keys.html 6c0e6cd094552b881be100249a171fc2dd0bd46070d43ecebe5bec11a3d98923 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/engine_load.html 7a367a53408ade933ef141b7306aca9671b75b706379d0bd7bf776dfb32683f0 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/fips.html 93389209cc6da95b858ae5372f0a1dcc29da74797e6198a938aa66458d8547b6 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/engine_keys.html e7bb342a75a934f0a0361c8e02a6b60075baf68be0c46e0c3b8a202184ad6a73 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/engine_load.html 85ceddb7a59da03c5f7ea584a33303a00a7aa8067fbea14af028903150a4f0f3 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/fips.html 904b2fc1e134a9f99d2faeb8e8418b4af98cd5bed5457d76bf34160ecc3c6ccb 2 @@ -2787,4 +2787,4 @@ -/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/licenses.html aef8a33f4f853350e56fdf8bde452d8aa9d6fd34d9694db75f22d0964d114b6b 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/new_api.html 2f0570d34769f2b9f701c862719a117407cfbdb606eb38b2ec359df0cd3a4b9f 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/notes.html 5582960bbd68571a10e09f12d0dd6676e7d8a150279d72bdaba1503e28c4f340 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/search.html f1640bfef70858e5d2375bfa435761a4b63ae826699a5d5be8390c1d2306496b 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/licenses.html 1350a0a1b5c9aa2726f003fb20a57221f3968d6cb9bd8fcaa07ff6a2c48ac662 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/new_api.html 53a13595bc76e55af74330c4280a008abbc68bd608bbfff2dd80925f74b7059e 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/notes.html 744d9fad8ccea373703cafcf657747ef98a6a0e9072ee04edc4aeedf8fef44b6 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/search.html 7d4f351b2f60deac0bc0c412b1bb75a113380bd5884b336472638137de20ae60 2 @@ -2794,2 +2794,2 @@ -/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/404.html 241c21c76b0986524b01d6d52d680ee3faaca2f1334aae1973c11b1d09bed6e8 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/api-reference.html 4485031000f94c29b0cf927976e9d2b648833cdc6be965a56932437c3973cb96 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/404.html bcaa120bfbfa3d1c812aba0dfb347e8fcb8f5adf512d8a12bab2076bed2f02ec 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/api-reference.html 489ef464cb221f4baeb00efcd2a4ecd9eefa17e45341e23cf371ef6c221e321c 2 @@ -2805,3 +2805,3 @@ -/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.epub 3f19904210648c8554dfd315d1484c234d0f9e4d5683f68a5f6424e14e59f1d7 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.html e6acbafd18ce369f7d9ca52bd9f9466bc8362c695de9e1820f00bb06414d20ab 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger_chapter.html 1f17fe9e63568c4cb6daa3762912bcf65aeffe0d3688ccfd59a20ce5d54aafac 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.epub aecbac3113bbf9ea42b1e11ca14e243b528a746847ce5e6872bc6689856836f7 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.html e082aa33f739c3e79de3ec6911d55498897cd0978e4e8ff2febf43a9a20c475c 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger_chapter.html e3d7f9b3a899ca8e5531e8e00334de29371878cc52909ac06280d320eedeee35 2 @@ -2828 +2828 @@ -/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/i.html e4f20ff2149cc028538d59406c1a2ca61384f51ed4d6b4e73cd8c0b5de67e39f 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/i.html 98e08381e6ecdbc6f9d7e0aeaec8c32b1062a0ff02a93dd7d61ba88e91b69d79 2 @@ -2830,4 +2830,4 @@ -/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/int.html 24bf650ee0065e1617c7cb04c43214716784a2441fdc635b3085ce60f23fe7cd 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/introduction.html 36e21cbd0d1ccb36dc8431635300b7d834e417a30d572e6b931f18b73ad26c84 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/notes.html 2ed4a1ef422d23b82f85b9f1a9a03f9b5f0327413dbf6e87293da636cb8e3c90 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/search.html 68a26b14e10b60ecbf16541c3530b5a137ead2159adabe0245112476f8c14fc6 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/int.html 9e91d6f4dc2aeb83db5cf8c2a7e9c727248eef208314e58ed5ff6483b6ff1058 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/introduction.html 196f2c668281f25e50ed8ec8f72139596be1708a01d52ce0bde159bdd66edd6e 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/notes.html f002cafaf895ba88a7e485d394c34756b9b2327a19568f1d6c0e4d53472c6b4e 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/search.html 0bf70df21bad1a16413244590c7e15be8ce981270e944b6ec9eeddeadb6c33a8 2 @@ -2837,2 +2837,2 @@ -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/404.html ec47d007ed53b5caa4f03fa3909f7d6a56acc6b4e63f46f671bba7b2a1522d62 2 -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/api-reference.html a31285e8a04320334cade47b31e5b11449dfbbf1ad76aa29d95b09ab50dc97b4 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/404.html 488c921c741ff9868076b63d958d56654eedd3e663302d1781c84aa530fd73a2 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/api-reference.html 213401fdb06ad8b7f074e3f3d6c5836b78b8c8dd034390719074a0cb649829ec 2 @@ -2841,3 +2841,3 @@ -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer.epub d00c3b0bde5acce5242d556758124d03a21f5fa0650d2d8ecc7f32c51e804eff 2 -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer.html ebbe3ab0314fe53d837db8cc0a8427734a2a83cefc20806221c5053e93e8b6ef 2 -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer_chapter.html 1072da13125785568e0cf5c1b3128258c5aa470b677eb733b186e5192209c0a5 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer.epub 07d271a055f03b96b973759bcafc9556dc5660f874575fd091125ac69f83470b 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer.html 402452ab2dcc12dc76ccb3e183ca8e0a56e6183287f1515800a4b1054caaf93d 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer_chapter.html a6d873efdaa95321433dc02ee7f651f833addf788444ece88e485f0b529e3cbc 2 @@ -2865,3 +2865,3 @@ -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/notes.html 098f186702d49e544c2b53da708b23f5e0a585f5198f74705c512ce9ded01ce8 2 -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/search.html 095c164b5cb35c1475a8580e5677b7dddd8aa31fc5e9a776ee81a4be9ea38d53 2 -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/typer_cmd.html ba11531c6a6a4c0516135a73ea13f08bf46c34f8588a36c36b7747fc47a7a480 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/notes.html 8e3d77d3978b60870c8b991db4618ee2242688d915d45ac63f75db785d9647f6 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/search.html 2ee972ec1231bc2fd00b0501559ff0ae9c0fe1c213b853e425b9f19a133f3e4b 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/typer_cmd.html 7797ff5dea360213a3eeb58b6080ee1105ca6957cb65d5e9423369ed3690391f 2 @@ -2871,2 +2871,2 @@ -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/404.html 2e4522b9a5fccfd7c01cf17b3627d623c180448df20ee70569d96f6ac99a7d74 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/api-reference.html 576395ea32ca1e5a7bfa96b15dcff2b1cb675dc32f3933434338fef37f6e79a1 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/404.html 79c45bd13fbfc7e7787968d52f0311ce131c07d562086398823107d03acd55b2 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/api-reference.html 65e2fe07d78d055e1fce30c951367fd0ff873e168140207fcddc0b405ff57b63 2 @@ -2875,15 +2875,15 @@ -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.epub 51c940b524721aca41f283e32eda196b5b27c6d020b542ae71dd7fe8d29fd045 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.html 73262ce4f3ac37bae548785c85e2b9e8ef01eadfc6b7c3588f3e7e7cab1b9de4 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_app.html 9419fb5c42d91904e54540e7c3c759b647585179742d98fccb0290f1ebc09ea6 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_codec.html c9b2725fa0e2a6e8996c37c557f6c434a6195141550c9f7cb2d5fd3704bb1f83 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_dict.html 904fd9721e8fcb465c017600d3bd03985909a4eb1b4e1b06384d7ca4f8c32581 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_examples.html 7dd6cf8640f52eb24db63768bf471188dcd756dec38c15a89d6387eda0a2af55 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_intro.html 3b2b4e11799e76624cb8ae100f2c5fdc195f68f854e043a9f5582e3705091958 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_make.html c058e938952b3d029c93becfab78a391ac25379e3361448cf668744861d9c683 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_sctp.html 0d34d291749b08de36b03ddb447926070ad6a7270c2c5c7e82b2bf1efec074aa 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_service.html beedfe34d07c9aff62fa3f2ba03b5932ae034812e36f12c3e2ee86d236fbba5f 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_soc.html d5b5d0f68fad195a8390985f19adf4c5fe9d7460ef07a661e1d30f1e91df4388 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_tcp.html 701c965aa2587ec4f2f46c2aea7561c3f16defbb8e911375fdf26202e3ea34b0 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_transport.html d350644e609edf9cb44eea17b464282b39f508ab804414d7e4ef3cb726acb0ca 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_using.html 42e7fab85c7c976c339e18673975943dc99288cf5db6e9a667853c6fc47a92f6 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameterc_cmd.html 891e93adce895aa523e7f915415d2a5040edf04467c849e8ce75cc06baf6f8fc 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.epub 541af1741246d9162a158ba73f28fc7e7f705545e6fd920756c586980a679f74 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.html c1ef28c939adf8750184301341728c34e9d4d1784bcfcf41c02a5f31362dfcca 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_app.html 6d926bb4a2f821213675716ebc2565b49af77e04402723528662fd06a229ddbc 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_codec.html 59d6848f4c0b51876cc9674d5c3aa8a0f5e100cc309a922484e392a037ae5211 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_dict.html 861ddf73eb66553df3d93c969ebab269c72f21faa32aa13a8c75d73891882de0 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_examples.html d1348fe16200330d9115565f23a026e54492ae301dbe6c1b4c35b0e85ed80103 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_intro.html b8d73ee2f38503e1df7bea52e252f59e5859a09e137acbc678b67bfd135e0153 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_make.html c3c1b7660fede287d0b6d95fd8cbfd5a86596f3db7424ffa64a3a04158b080a5 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_sctp.html d651b3a5dccabd91c481bc029bfd07a81abe3d5139e124aedf52d0a289949beb 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_service.html 360c1292293162cc25ac0d35a1cab10305ae11c6c9e625c79a785fac5662a6ac 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_soc.html 55fbb681573b73307f14a3961e4f1c8ee28e478f4cc29ed249f3a9aeacba4d0e 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_tcp.html 0b206ca0ac39cd780c38d3680460f19d75a2d46cbe1cf47415e282c771769265 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_transport.html f0022eae7197811b1f5b83a2dcc7a43ce020fe664e3723a2d99215796428d196 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_using.html b8335ea6e101f2e76840c37c106aaf75aa1f623ec1a4092d5308247438805002 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameterc_cmd.html efc12a8e8f9c1efe6ecf1e14a61d6b058c1dad1ca5ce072003e7236b6e9dd1db 2 @@ -2911,2 +2911,2 @@ -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/notes.html 969d31ca2a554ebc26ca982054f19f93bda3782e699a08329ed5328863d0a3ed 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/search.html 6d21f0161fb38cbd5aeaf5f8babd72fc46f5659d3ed9eba076a3cf25a356b1c5 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/notes.html 351d352b980c4487bda908795136e59363f63c0cf6fd7602b4114b3f0bce7987 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/search.html c26a38a11e6ab58664834b9ed4cecd33ef61c89fe7829516b248b3f6b613154c 2 @@ -2920,2 +2920,2 @@ -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/404.html 5daa4443d8cd0c0c0ea0966d797ef090e0c7820fb4db11982ac3a5678cd8982e 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/api-reference.html f4c374d153a0ee03a39f0c4d052f697cbc1a2763d6e67cae0ec49e4b42b2230f 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/404.html 0ae11d3cafbdbfa08815bd2042d0207162a609ea21b48aba58eaffd1785c5c07 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/api-reference.html 144dc4f0325fa5439a0075bc9075cc1822c8859252de70d6f850560fb1402166 2 @@ -2926 +2926 @@ -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/chapter.html da23c592df1de821d280b7ea87fa12e1cb54c8bc847e04bed02f3feb82afa7da 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/chapter.html b663929781154269b8b19d37e116bb332c4b3ea1409d2aa640c9aa68937bcf8e 2 @@ -2947,12 +2947,12 @@ -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/doc_storage.html 832cfe3a38d0ed155a65a25a538c86ef147161e7202b8b351364cf1c33385672 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc.html 13e1449f5ff6db146855c17b5bec15dda7c480fcb69e828796a253104255dd74 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_cmd.html 83f63ec3abc1137c7bd8f1053a0e12b9de117efcfe5bb7eff0ad175c7585c89c 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_doclet.html 9280059cff0d548f1272818e6cb28d9cb51c85ee52191812ce5eb73bbbfb4d90 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_doclet_chunks.html d5c35a58d514b2ef1b5a598b1558f6bc5d693db5089b849eb9b51f05056a782e 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_doclet_markdown.html 8657cceb649f197a24ab81e614f07f91dae6b165a44e90ab0cbf00cbc1285e55 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_extract.html fcd89237e28717bffb359bacd1a4501f115dc6289f7e6cb5aa1724db198ba501 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_html_to_markdown.html 9cd884af94e189821ae4ecf8ab3f5d4a2e87c39eef428124e13dd0aa958071ef 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_layout.html 9b403f6245656e3ecb3c5c0e47012514b22598e41a43a707c713fcdfb087006b 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_layout_chunks.html a86d5c73613cf8be138aea734f03ce8d33918587950f32f674eb98615578ce8f 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_lib.html 8317d4dffe57f11435e1d146bd5598274b9809f5875b436c8674b2ff6bdf567e 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_run.html f65f7fb92118b61085e502c6330db2797faa7bf263427a1e7e22773d081a03a4 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/doc_storage.html 9bcc4dc67d4b088a12b82de5b6dc6cdd125b573332b2cd2eccf1aab1296cdbce 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc.html f1f593d7921a0bca03780fb1b2f057249321449d51e127c31661f309080a5c86 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_cmd.html 032dfaf4ee9ef7c5fa9055667be1c23e3658249314f39684136cfefabc0e19a8 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_doclet.html a7136d2de7161cf3b9ecd304ecb3dbdc53eaa276cb006259ba1d7ac74c49bda6 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_doclet_chunks.html 675d296069864d039be1d0d0082324e50799ac8f56a134f066881bac68881e96 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_doclet_markdown.html 2fa286a938f7a8de59cad25b7f6983decfd065aaaf9f7e943ad680f0cc974620 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_extract.html 7d2f2c234508e449d6420f175187210542e9f2effe152620d9db6382b0b73fd7 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_html_to_markdown.html cf3600ef8b5a11d67318d32c9f2b3c7b8bff6231556e3322b077c464a6f8eeb1 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_layout.html e161d0567d52a968c80050cefa3fb98a4db59f29237b7815735e7e67678bef45 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_layout_chunks.html 56eda887d8ec8025c7c573360d1c0f9959996189796fa05f743d0e88986c32cf 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_lib.html 6c80a7a59abbe7d829d0fef046fa63878a77eca034af7482c5d46ae74afab120 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_run.html 22a9475a050253546bbadb6c730d854af228ce34dea0d580698b52496f2718c2 2 @@ -2960,2 +2960,2 @@ -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/notes.html 37eef8ecb132082c34699f18c39d844c18492c49718099442c3ed03f5740063a 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/search.html a384329c21ed33ea840d6ef9c6745ef3a6ba1169e0a707c20c3347107fbd40e6 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/notes.html 3731118114d94d1c97f1e582393553fd3737bccecd6ea0c3265a7c3abb6e7897 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/search.html f46fb1d5fa4229f346e1820885f3f16bf1d1f4bfac387f8c599cb1a024ff9de6 2 @@ -2965,2 +2965,2 @@ -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/404.html 2ddbcce6d4c0e95e47850543ca1ba92428e0f7af64b936ecac93ec95686a21a4 2 -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/api-reference.html cc71d0431d936d76aa9ce61190f195e77e6476cea572ad34bb758cab0a065514 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/404.html eeaa2fe24a3e8872c2745cb3442e6aeeb576a37ef80ea595bc493465dd751bf0 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/api-reference.html 37cfaf8c1ee893586d4dc739aac31c77bb0df74d999923d0e9aa0e7a40235fee 2 @@ -2989,2 +2989,2 @@ -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/eldap.epub fa342d1c81e8a12a9c7d04e44c5a1f60cc4bbf77a2c1a2d38661c4de555f6132 2 -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/eldap.html c18850cb7e63733d9d84afabf879bd0394d73ef8baedf7d6d3a9d647af03e520 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/eldap.epub 9a1fa70e91b5f5cdd1aac138c7c0c6703f04fdaea1a9db2d6457f99d78a9ae9b 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/eldap.html 9e491369d1511aa31e00abbe0d5d0744884cf559631aee4948417270da87883f 2 @@ -2992,2 +2992,2 @@ -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/notes.html 76cd2f528ce8eafc70d503181e8e0309dc61ed12ff9a98b905c21941da12eb91 2 -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/search.html 9b4ad08db729fb727cc743453e5f35884ecc9253fe180221dc83de8ab92f0e88 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/notes.html 64815498ee51bfff53c36cb2a64d3cdb478f2e14084f15b96c8ce128bcd7e305 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/search.html 65e11fdcb5bc88a2c29b6a0e474e6ea46f2a4d2d9219e838df4ce931f50af17f 2 @@ -2997 +2997 @@ -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/404.html 9596a7d013e03baa7f60d1d76c9bb2c576e06780d6c5691271173c7e362662b9 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/404.html 0d90ff071331704a8e09f4a11927389e028d2697bd9815ccfe0f7de2a8e0a576 2 @@ -3020,6 +3020,6 @@ -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei.html a68ef919410bb1a480f1c8e7ebb13d8c184e9b50a98321d80cf6da3ee9633dd3 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei_connect.html babcb8c56bd055260bdd961eac66991865f2af28453964db8916b9bb551c3acf 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei_global.html 17d75038e77ff5a8ff63d1a7490fa4112d40de7bd12d09d28e2b3bcd11da58c7 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei_users_guide.html 5aeab58f8b1100052e1fd9ef6fcb2c005e86bfbbfd0973cc463e56a854a926f3 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/erl_call_cmd.html 6ee7bba0389139fce5cd1374ae54a0926f4119ba5457ac8ae5f5e8254f514e67 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/erl_interface.epub 25cef0a9ccf76be9281c2854ce7d4ed2207e90c4c30ad67d818c1c8f56ef94ec 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei.html bef656078c1f8c71776599cb73ec4807cc84588b011f22d5f0d1a49e13d6ceff 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei_connect.html 54369349f7028dd33d188b849c784106d71de08c8aa80f21bab01fb06241e857 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei_global.html da9b932e01291e588e6f6edfc7403889137ac2cd5cdda2b6956cd2a3493a6f70 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei_users_guide.html 1fa0c722a4a5abdf678e2ddf0c0aad01426c311b23ca8f08b8049264642578e3 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/erl_call_cmd.html 09561e2c7f9a78a81403c9c817d2928b9bd443cd4d57ec7c4ea5e5aec9c07044 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/erl_interface.epub 7682d32f54657a1af02782529879bb0f36fa0a8a559ad136bc328ec63ad5dd5a 2 @@ -3027,2 +3027,2 @@ -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/notes.html 4d1b8946ad7f7554f41cfbea4bee1974cc4fdfbc7a1e14b5bdfddc91f6e64ac4 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/search.html 3c185e2e348d1325b6bdd0bdbfe7a2b44118dfa8122ebd020d4497400f852691 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/notes.html 1069e38b5a120f1ad2b1df00373d5d1ba83ebf299c5f41df437dbb5c905d15c3 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/search.html 31aa7267160af60f83a10b27582ea29793792cc06d3b09e6b63a8380d95e8444 2 @@ -3032,2 +3032,2 @@ -/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/404.html 1a317d75fc07f3db2fd9c6e617fc3e0b153d633a0f69fa7dec5f43690551c44a 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/api-reference.html ea41b6cc199a4a62babedfc4109832ecb259cf14427652ee6346984bf4c1fa61 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/404.html 26a7dc21c010fcbf313b11bc0190fc58b650eac1f5da2de7cba53864913e025a 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/api-reference.html 052a4cc27252e45558a9a20ec2a9da0c93577d0dde6d2713d244a2894affd7df 2 @@ -3067,9 +3067,9 @@ -/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et.epub 6aab62c1075e1d2ec9f22d724f2d0594f902e4789a9ec1b87c6642421bfcd3bd 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et.html e9d1b684d58647e04fdbf6da803fea16bfa03d9f31fe5e0970c5526d1f3dbcd3 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_collector.html 0358b154e2158a94c7ce717dbccd2c5e544ec25d26d3917719872f441a63464e 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_desc.html 66e07c9d3ad13ae2b8825c97e9a7ecc861cf29deea90115002557e403fbf11d8 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_examples.html 57e08e405a176dde750850dd3ae10a97fb61709f87639464674bec34aaeb4d25 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_intro.html 53e5d44b83e09764dfb8dae146ad4fd022d8904885abd42fa45b7368f37d85ed 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_selector.html 35f6ebd44dc275e93ccf4a7e004c4b298a0013b913f479b02c8edae6cc4ce8df 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_tutorial.html aa08524389022f2ed1818c0ebcfc680a8c383c2aa6b614b1429048ac53ee4cc8 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_viewer.html 678896df762f8124704f86153c89eae6f63229353c1c8a64549ee6247128ff0b 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et.epub b4d1c445ccac33c4197715a10819a1b60085182cd3e02d74a7632a03a8f601fd 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et.html 83ccae4c13070a7113679d8b4723822ff2ca7a2fbe2225ccfb872d3ba78fcca0 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_collector.html 091e1d9565b87de65eb56c0c8e784c3db8a077028da3d0156b0b14ff2dc8f340 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_desc.html 277583afe8b2357c94cdc1467e042e95c456d59eef8e74a4398df78eac466477 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_examples.html 7e42d8879dc950c26f0a1d57fd7f6cf188ebdbd444e6a8a6dcda1a1b3aed3f0b 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_intro.html 4e276fa1e9fea06127c7456c63f2eb126742e3d50c635386a1fa90e9ea61b239 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_selector.html 919b07a4989c071c7b8b740f30b856127501162cfc78f507719e0d5fa0f03a57 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_tutorial.html 3765799d52fbe974773be88b530cdba2b992c77a7dc25f6c5bb0b97c0e16e64c 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_viewer.html 9607c7aaf099f5f021574972382d5051230faef20252a1e907f7c67e78db7147 2 @@ -3077,2 +3077,2 @@ -/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/notes.html a0757777191989bca6f1304993306f8184dcf68d6af8b2946f91cb927bcac83e 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/search.html 8ef48d605f786dacb46f6e4a52406c2d19552dc947feb5547faab3714f061b30 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/notes.html 3511745f1b2f2fd7680c04750074a2033c2e4e557dc0d8071bdb1ba74967bdb7 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/search.html b5448dfb0b1ee9da27a1092b5216cde78ea0cebde46ad831b811d88715a489ca 2 @@ -3082,2 +3082,2 @@ -/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/404.html 8aeac9321847291cd61eac07e3be7d8e0b51e7ddb96150f94d782d32d9ec650a 2 -/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/api-reference.html 9e4f0582759dfa396a0e57ea631c3097836356cca618e38ca3e154801db7b441 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/404.html 02824902d6084a6f8587c245daf74149df423e1db271377dc9e76d63de0173ae 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/api-reference.html 65b2035cc6845d6804612509e46010b82162cb7d29fff1db327244194f558927 2 @@ -3086 +3086 @@ -/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/chapter.html dc00f105f284dd74ea59a88e2689bd5161d86e566ffa3b5eadc90009d7541c63 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/chapter.html 2c22dc5408aff47f3b97ccc64eb5db8b8f6daf73baf234b68873e4ce050f4022 2 @@ -3107,3 +3107,3 @@ -/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/eunit.epub 75b078b0c2cc9d042d09dfe641030b1209dd2a8797ebe68b254bd3aa9700afdd 2 -/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/eunit.html 3de2c2a160f5cd4367705e02e37232a2c17cc70e7a3e3736d0321ca71e41043e 2 -/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/eunit_surefire.html b91a9bee245e5e2cebdb3e3ef28f87f9601ca60b388676bfbff02f7953a8c03d 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/eunit.epub 80ed73dc39900bb49672ddd5e7f1d5f9041db43ad1ec6868a95cb879ee53529a 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/eunit.html 6859ae05ecef1a6c0f37d8a20a4f17aa05515bde6c155498b83918c680ed25e5 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/eunit_surefire.html a0c8ecbe7bbf4f51e1ad0de58cb167f5d109caa1ecff444c49d133bf4e51d4cb 2 @@ -3111,2 +3111,2 @@ -/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/notes.html 299275c5171f6261e2fecfcb9bdd789e0c5c9e9337d379a69df6d883cf6dc7c2 2 -/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/search.html ee4b979422ebeee528ab15314b865b54c2919b7e277367218c54e642d006ec11 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/notes.html 37ce11f2ae74fa64ae6fc3ded3c6979923f51d381e8508ae1ac53f4b250ee22d 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/search.html 278af687fa6791e3c37f6395f797f0a52ee409e8660e0846b7bb7cf2658072da 2 @@ -3116,2 +3116,2 @@ -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/404.html c2487da127b51c2b81dd0e9608de5494bfff0418f3fe5d2daca02191a3712bac 2 -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/api-reference.html 3ea73bba364a10d15d778a34b11f0739636d775a4c5a2f1f849861c68359cf5e 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/404.html 80cc320ff658ddfa82d7a234d05e0fca69378f6eedb029dc6f928a38331c6bd5 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/api-reference.html 5ac9fe91de62b87f0449604bf74381295cd901d72193ce523ae969180e944ebf 2 @@ -3140,3 +3140,3 @@ -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/ftp.epub 3ad3a5cea31193309ab2bdb4956cec740412feea9aed8bf759b6590c4caf2b0c 2 -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/ftp.html 570542803093e54f18e063f8061e9dfe021ffce66fdb165bc87d39fa3a3d62c5 2 -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/ftp_client.html c8b79cafc82d6618da04734028b4177d633b7b6e2da4d9650a1a63389083c244 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/ftp.epub 33cb18838c824de4f7ed5843953a6a81fc96e88daea6363a12f568b6b871cdb9 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/ftp.html bd1671d78e4c457f14c2f7be88645f04b7361a2590c9416181b015267fd49356 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/ftp_client.html 8332f61e7938f01e11d122ef118589c33dca1497a85fb05b016933da94efb090 2 @@ -3144,3 +3144,3 @@ -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/introduction.html 15ad6774e1fb0520e65e76a9d44c225e4d3e9096872ea066b2b03b116254e5c7 2 -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/notes.html fba47f316bc7c85577a1a8323beec0f297d8d11d4b273b19706cfeebcf19ca59 2 -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/search.html 44d1a5f9d72c10b0c61f26e59ce3963779d7452778ca071ab30e79acb56c86ef 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/introduction.html e8129a8dea597c9ac2d31541a556ce4202904dfbdceaf5c9251cee16124219da 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/notes.html 66a5577b341a811db81681cdd9c43beaf56e2b9f4b99f73e615d0601996d62f1 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/search.html b7842aab17652ac1f526c064ecd0655fe21e440f0a8f17986864d6ec65e4bc59 2 @@ -3150,2 +3150,2 @@ -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/404.html 7fb12049f94ae69cc9a862bea84d79d48f67d99897974153e06cc8eeb785dab7 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/api-reference.html bf2fca1fa8548b90a0346734336843a54622aa64a06088333a820bc2f93f01ec 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/404.html dcf16abc4838060a0f8cc56cb8c724f78a04a394397779170073522bfafa78a7 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/api-reference.html d4ae46bb6fea8c5513ba0261a2de2f83072f265642a1e2d966aa2649dbd6ed14 2 @@ -3174,8 +3174,8 @@ -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/http_client.html 8bd33a8bf9614271506c64098f06c3fae24ad6a1b28676597547998cb132e919 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/http_server.html 9d1b3015ee0de65e5ed8b5ed0c6bd4b1a6e207252ba1e7bf01a2f139d96b2449 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/http_uri.html 1643bf89d3e69b8f22e22761c641f832668b509dccc4c805dbb980080b8973fc 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/httpc.html 9497ee61d863da3821e5120a8f9d1a6d97b89373085584923d3239f277c5c59a 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/httpd.html b16fa76ae708698a31ff160a89e679fd33d44f3d02a351af934b4a413c85314e 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/httpd_custom_api.html d12b9cc2613662d4d56cf149bb1dd1a153ab21053d24c63c13c11e5ced68bd53 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/httpd_socket.html 9e75d7593b62d8b6aa26f691b39c08e95af6df39a90846354249a83a847c3867 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/httpd_util.html cbf8470b6857c0a0575277404e35363eb828f3a84c9e3c32a32ae951d8ee8005 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/http_client.html e71810f591601aa62fbc49ee250f52b7f82c38a60bb99c0b741ddc086e6a4bf6 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/http_server.html e8efd051ce821c51215791b5119e2120ee0a3fa40bbb68ab3de9efd1751bda0b 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/http_uri.html 85f8c8912ec0ebc21b052623a164e8ec8e95c03bc7d54d45740a7e4edc732c94 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/httpc.html 1957f48012c9efab19365d668020645f0c7db13dd6b5b777cc089bb9757cce0e 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/httpd.html 06d8f3a94e81d6e0006d8804247129004d44bafbad048fc30309c0fb4ee5965e 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/httpd_custom_api.html 7e9864eb96c593d0e5e4115f4dffa403b9b0234898f97e45db3edff0e1abf652 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/httpd_socket.html 39644a7e2da90a46b44e98fa6d7c7c322fe64051030b315d24fda030bb686ab9 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/httpd_util.html 9b4313b81ba70c1cd1236e4575b85a097a771edb03de44a923bfc0ae86170cfb 2 @@ -3183,10 +3183,10 @@ -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/inets.epub cbfb373cd09e566186202dd762f138cd9165717acb516add2a985fcf5cd1e3ab 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/inets.html 15ce87e0f80d51c9c030d950601549d59352ce0ae8d29369c867c4264abb303b 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/inets_services.html 4c1aa89e8ea7d8ee3a674ba299e85fbfe75a862742a4ba0002340be3abfcfb06 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/introduction.html 34efb8f9e0a770052ff91b8f00db1cb52dd7f58bbd0ef9fdf565424320301a60 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/mod_alias.html 5b8d92c1dd5f5c99906d84f0254f36370ca919b56ff3569d3aa50b138aec79c1 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/mod_auth.html c369b95e77b615ca03e165bc143723365afbc078245d53f8acb87fa3782a7647 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/mod_esi.html 85387a522e3b07914fab29303933ec1b147384d4e4f6ec311438f52b2eac7f16 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/mod_security.html 5cd9bd4b05a1f628800946cbffa0956626db834981709ff0679771c030e6f8d4 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/notes.html d294c46bd37218fef44f13046ceb4ff3eb2cb6355fd3a348da71c4752633045c 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/search.html c80c7fa20d2d8c36dcc947919f603f38b5a73b10802ff7c95a053c07ad2ffc0e 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/inets.epub c858e4d148df8c44c827580ebe7dfad6387d803151e4073592be9cd97c4d1ffc 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/inets.html c8654c3e4b4375f56b355ceef548267bf41399f2c640fcedb1b873dcc9ca2a37 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/inets_services.html 4930d26891cb49664d0c2dbf1275ff7984cb1c754205948e22359d68e782daef 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/introduction.html 2899b7dc8d6c9efd17d57d6ff7079c5d53770e43dbe6840258e4cd04f5509b35 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/mod_alias.html 6693942789ddff7e22aafe8dff3d42c616463c061d71a1a91575d468a0cbcc8f 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/mod_auth.html 3719a6a3812aad3b37ce83880733b015e95072ac3e6cf0d959a0444636cf289b 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/mod_esi.html 93890c6cdb49383506e6623e897ae986469db79e1298b494efdb77e32afbc7ee 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/mod_security.html f4ad8b0cd4e0cfb6f2bf95dfe47b5951c31c30fb20285d36e411df0ab91aa4a0 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/notes.html 9bc899fce8283f370c6ddb9f364b7febc877c0b9f666dd7e992dc30ea5466842 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/search.html 753034fe336e2add6e572cd28921ac15bf4d07f49f57ad5cffaa7d6b5df6178a 2 @@ -3196 +3196 @@ -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.14.1/doc/html/404.html 9ea698dad17f89f17ea1a945b12b3ef857ac823fec36e5d784c7b7b881bdd838 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.14.1/doc/html/404.html 29190dd4b5590ddb31ce8d746a8f2e2d2cfa4ad7622f4e28ec4a6bd6cd9e1245 2 @@ -3313,3 +3313,3 @@ -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.14.1/doc/html/jinterface_users_guide.html 645c8aee89636d2d221ceee988792a3cd047f479e00171f6331e453de5d3ee46 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.14.1/doc/html/notes.html 250cfe885b624cb8f9dcea996307f46cf241cde7eb00d6da7666025435f7e7a1 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.14.1/doc/html/search.html d0253a4ce6af319563ce2e125d307cf116c67925adda59db2640fad926a7382e 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.14.1/doc/html/jinterface_users_guide.html 6c2e06b97f9fbc4d522cab5ea41f27864538537e25d6b9436857e87375398661 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.14.1/doc/html/notes.html e5f7e9ef3343e451f14cb4b9c1da72430dcb60ea5dbd2a3923230de95be7e7fd 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.14.1/doc/html/search.html 267a193ad7215eb5525c34c8d3c6edaa6f3112c193f1a4986c1de9604f36c36a 2 @@ -3319,4 +3319,4 @@ -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/404.html 6598f7c117ea95aa21c4484779c74924595e655be242ffcfec1d43bbae395dcc 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/api-reference.html f254f6be9640b345b547c7a9d93a00311783e1a1fd2c3a4a8111e8c7ebe32cb2 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/app.html 5c7514d9dd75226b3fcc4f400306fcc97d68e1780dda3c20230b4444d0bcbe40 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/application.html 308de2ea953647f1375b1af33726f8d3a8cf8cfb8ce1f58b67e46e4e12eae3fa 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/404.html a71733e57f147bb62a40b563c96d78321840cd272d9f59c66b26bc942f6bd6e6 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/api-reference.html 444d57b69d521b8aff22a7e46c67aab37e1872350ce241a923ce84d5492baa88 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/app.html b56ee12710d387e6fe02a6d8b56eecdb5e61b9a0b5e3fac357aef9f782189123 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/application.html e0b3419c4d790e84f2e3c76db240d2bd00d72df191953367ee4541c6443094d6 2 @@ -3325,4 +3325,4 @@ -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/auth.html 6c538c8c195d3b6147d3c648c28d5c652e93f5fe54b8ee08aa1cb99394c9b597 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/code.html 90be588bfcd299d730be5515906f4daafa7f2ace132db4d81864f1392f15201c 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/config.html 87047bcf4a9a4dbdbdc930a4b6c84016526abae9cc1c061a4389b45f2733a7ba 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/disk_log.html abd3dd44be6a7d9ab48332f9a651e85e2b68bff4fc01fa99a998e3cc1c2b245b 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/auth.html dbb65646b5868d4243de6557bbe56f967ea74e323a85113f05c6791348b06cd2 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/code.html fed5c99ea6f35d34aa7e967be06494a63158236ba2e643f7d88f70a5cfbceb30 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/config.html 5f583e80abfadb7b557da3f6de68c2acebc270858870d5ef55df12330936faea 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/disk_log.html 90dffdb0b5d5ecc9ae3c9effd775ce433dcbed85fdd5a66b9b2040542db5898d 2 @@ -3349,14 +3349,14 @@ -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/eep48_chapter.html 0c845b78018b26bd5312b0971cc75945ce248531418ecc91b94d7538ab454e64 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/erl_boot_server.html f2b4869de4facad221b5ec9b90a7042f7b46e0b6e70f93e863d69b915ba71d72 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/erl_ddll.html 3ced0804b1a5276826ef6983890bd881f9cd70b188475f3df1887c5bad67c6c5 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/erl_epmd.html 3f81e00100031d77dc881244b5fbc7f6cbcace043fe49697cbdc34156e5f0730 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/erpc.html 05b72f69407eb78c07af1350070378422fbe550d93151dd1e5cde98b30d3997b 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/error_handler.html 6cb2118f13d8c18a58d8481bb126296177aff8a5b6e2c5e539afbf4849103bae 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/error_logger.html c3103a5e6cada9f6d3bba764ba56ae5fa5fc4b5b9ecd7d6c8b00c09b3463d95b 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/file.html 7effb9819d3212d7e598f3ba63a3c981a64505c5c18b4825b0c35a6e6fa66414 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/gen_sctp.html 0605d5dbcf12a45557aa9a0f07bca2e9943060585a675f735edcca38c89ea721 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/gen_tcp.html d18e5f3deb0905c730a7abe307dd26f783cbc34b21a7f1212ed309b15fc2d05f 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/gen_udp.html 9b27679f63338448e0a7bb5b5abce466dea617792790c9598964e3baee7fabca 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/global.html 93e9a5127bdcfe32b3724cbc7231bcc36d3a397fecb80e1d7ccfcf80ed5a4702 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/global_group.html 557e5d8a3aa2554ede9c5cff4fd9c39f454c213dc020613cd402a3cd5a522212 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/heart.html 9ecb9b07d74c5e9a9a87c4b8840293a5e5ace13c6f45c271957652dc370b8e07 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/eep48_chapter.html d2c5fdc127244548cabd789e85e5a885554901f17e17c6fc24075bd9e90a8105 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/erl_boot_server.html 6b47a876933b5e5587e18ad75c749afa39b6a6d065fe6d16a8e031a942cb134f 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/erl_ddll.html 235a2f0a8f81b0e0afaa3aa4355f84c58ea522a31d16c178487a227f01f911ae 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/erl_epmd.html 09ff6057882c55173a474d0592b1e6674819dda994225d6d9b218fcff46a2d7a 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/erpc.html df7368f3a538ec235483f236528a74fd71af9d14a3492511e0a3a34df96b24ac 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/error_handler.html 06a17c4cbb2acd5a8ad4bc8a8f3ff95bd4572e7b7a47ac3b65affb55e570afb2 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/error_logger.html e4f666b2ca25b6ca894d20171e31b79cdca70c6f3c9173c03fef6affb5604b42 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/file.html 642d7ac71f28a73fa0fe35d5cf5ba5754f4766084124d5b542b8366633f92634 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/gen_sctp.html abfc161f5dd25b5e20ab8e0f5069efbea3773592a664cd041b33d5d6d49a581d 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/gen_tcp.html 5b51790f8fdd5a86557415ffed3331edd213f0f79a0b4be1738b041ea2bfad54 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/gen_udp.html f8521e32cfb68bb163de31684595f7605ea58ce2c564281d85bc28ee65618eea 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/global.html f7145832d8790c9bc1dad57dd6a4ae2d59e91bc71164391646fdd98f166d7787 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/global_group.html f839c8f754fc9c203af4644f4a49bb099e528b1bf97e2c5c5a5954820e0f9185 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/heart.html 6f9dc3cdab4f3e5c939f21f4af5c8fae093ac6489c3ab03f9a4c5b236e86bdf7 2 @@ -3364,26 +3364,26 @@ -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/inet.html 9d6d4a299a7ff586354ce8e398fe32dd8c0f10668325a9befd91c57e3ccdafb2 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/inet_res.html 77a8e703b092f8b2bf3ef13e5a0189e87c48f458e2fcca43260bfcf7cbcb5044 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/introduction_chapter.html 26a18bcb748376c4a11564913e4cdd08b566af6e7e5179f9bc0249e0949ef906 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub 40afbe8a41e070af7fc49814771da9ab15d4165c9a07a40ea36a49a81d23ae46 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel_app.html 53c0b0adfa7199b2d1a1e88c2d51f62524ed492f73642d79a0c7b4fc4a7890d1 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger.html 5d5e92a47f7203019221741864907090b876bb07a930cd70487c9b55dea6e7a8 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_chapter.html 70073540ae165c025a87d8c94da34d4f8d6d2f1a916505dea80721f243ba69f3 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_cookbook.html 7b70187e32d7003bed0f178f38410ea43c4a3a62fcd1ed690e8297016b2e0525 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_disk_log_h.html f8595b84237698228a49ade1049382b78e1183a8304a3485a1928545e4ccaa5f 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_filters.html 6b13b27d4e79250aeafd88865b61c8345cbfcc59555b66e7c683e05657fbb05e 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_formatter.html 3e0749551c9401315ebf592be5d07a2a1afff0fc9d6a0b947c49f3aa57f44837 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_handler.html d892ecd5b4dbb7332becfdcce3285497a9b53fc3bceb8e6981900d6affed03a1 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_std_h.html 1b94168c1013a3c0fed0bddc7126fb7a2e9e1e2e7cf3bc4b3cf1c6c046a1cfea 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/net.html 8f8b92e9136016e026e350254e844327235b43a612199cbb95e8f6df7080790c 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/net_adm.html 7de02b18609cd555f2a1c0ba4156970eff8d73cd04275ee426e2692bc52793c0 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/net_kernel.html b4d3e706d313336f5239dbb5b858183dfa0fe8ba8a2d2e9c5d6f8bb36af353d8 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/notes.html a499f69f3914447020c7a84c6d6219f76ae67600a96359af6cbe6dda7db4c79f 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/os.html 34b2d766365bf719e3bfdc46cedfaa3f92c1fbcf639aa7f81b2465886121fddc 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/pg.html 74773c305d682e4f7f563d3eb05addd79bf6d25b513919f5befba16f107105cc 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/rpc.html 162a51497da6ba018bdb3d6cefe4a8b996a0a6b89f2de0b130818583ce77059c 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/search.html e6df970c77114285fe6fbbf647827c307fe14c365fb81c4e468d0fc5ef1339f1 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/seq_trace.html 9150179cb72402ded6bf231dbbaf5c3e6aea5798448ae9b7705fd1be1d4cd0f4 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/socket.html a5a8be9376a7d1568eb17b78b374e51d4fb1168d3d4d1b5f8bc16848bc48b654 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/socket_usage.html b194b4a1f86a1922cef8418c6a6b2112efeb9193975bf5c2cbea4bf708af73f9 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/trace.html 887e657fc3e3d29a3a942b603d8600b5fbb4c802abbb3f4806af34da6ff8c8fe 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/wrap_log_reader.html ab186142582edda21e64c353f69395054f040629b3c8a5d5993be95d06193dd9 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/inet.html 3fc5f0c8d5a06f462aa83b777e26025c61011e08d0def297977d5365c954f1e9 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/inet_res.html f965ad152270fd3b5b82c0e626dc83cfa3460005b0a2db603d30a5dc927ef75d 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/introduction_chapter.html e317c5ade42668a6b3cbf41484469d893b09c3b0b8cecd8b0279b27155779821 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub d71190f1f01fce9a8f6f9b19cb9a8dd8ffac35ff0fb64ef0739830cab9702ad5 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel_app.html 3ca7eef4576081f78d3a0488b7d9e8bf6f8643b64b96baf81786289556a9ef89 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger.html ac2cfa5e9b6414ae511e70686992617104faa5415787020dc4e5dc7e112f80a6 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_chapter.html f380d4ed152c32f4e0c927f17d271a8f06025b03e361e8f988f12e9d38b84391 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_cookbook.html 7f4fb91de6ddf1150d285fc8dcc31acd4a4c9fd3be6236aa344d229ca1d316bd 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_disk_log_h.html f608a4d357bbd95cceb349d43c586fe00de88ee1b4405d788189ba8014452c47 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_filters.html f75ef8558629557d77fe7db73caba535f4b8ccff6f9d20ccbebfec219a30afe1 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_formatter.html b794b90948901840ac2ce4ee68d30abc4c3b1e7b6c9e1d64bd52f623a57fa4e2 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_handler.html 85727883e85d3e4429674329fbbda3bcc33f9c3fcd4a7a5bcf3601839013646b 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_std_h.html de6d7ef1c8a4f69a438cf82fc30ce981466528e0e269f6fab67ebbc95b9f0f66 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/net.html 3d59949a3795fbe0ab798342edfc2717258c6591e147be28c5c2e869014ec3f9 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/net_adm.html 3f5d37332e4f8bc8d7acc0b8b38ab657a6769f72694896df0fd48242b1164503 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/net_kernel.html e0ab8ea7b6e44c69addde7a5fb33750d07ecf57d91efa88f7c9427ead68d9f9a 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/notes.html a15ec4c22be57fba50c72120d0f8cb5880c9dc8c8b4ddb8e960a3a6ccebc808f 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/os.html 854e002d0644b822bf1fb53379e29550855e9428d2dac60be073ae47857f23cd 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/pg.html 0651bb306852e6c0e339106bc3b545912751584bf105f18259a6874047a72732 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/rpc.html d165470297c35ddebb545e5275d311106f2ec48f55d5f09d3a5b3e29b4e2f38e 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/search.html 454b5835d2b61342fed9006e37d218592d07fc6c461e7debc2bde53e7f121b5e 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/seq_trace.html 80b976b7386635523b3f51847416f4e26e0402990f5eb305f5d196e29599a885 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/socket.html 01401c38dc8ea47128d363954cf01b26f9cc3d3685765f890e8ad7827fca45cc 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/socket_usage.html 98f1863e510f8bb7d2a52150720c2e1305d2ca079701589b0ce324355d2a690b 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/trace.html 4daadd6d43fae4aa9123fb9430de6e51f2c9f6768ed030eaeb2cfd4491604607 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/wrap_log_reader.html f823e592a3f68ec116acbf429a48e227df8d31a7d2eafc7da4c4ef466ed36c99 2 @@ -3393,2 +3393,2 @@ -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/404.html 4992d3e7ef6f45a76f0e2678f7f350c1e5af60ce450fa5f0d914d7315d866587 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/api-reference.html a1150fbf421082ec0281b4f33543d1345f59154bf4221596f4f187acc0f76885 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/404.html 6a7840b7434cfccda0c60bba749cf38bf6e5a267fc5598c3bbc10dd0138c2908 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/api-reference.html a76f014d0a648fe4a4383db288c556c1f02782a50d8a210104e3ee13661331de 2 @@ -3426,26 +3426,26 @@ -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco.epub de649c8dc6dd5cb7ee19ff357fc7b1f1cc120b82fca4b41fed681b4131bd0aba 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco.html d23701d171bfd427108fe4bafa88f5d7feb8d54a25e0cdf98df6d36738bef98b 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_architecture.html 54066558a36588df96eaa6bc21daeecc30a8f536c20fb8cc7ddbefea10368c4f 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_codec_meas.html f631219cbaec31f1cae4843c65c5fdc2df19b6e2220afce28008d02cdab726a3 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_codec_mstone1.html ecb74da7312f9113e1186fc0c5b9edcad493901d4403f0e6bb396853004c5455 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_codec_mstone2.html f29e8de899775bb47056833898312d262c13e1cb2323755b9f4aaf805bec4789 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_codec_transform.html 708ea387b282592b0376ac28c0c0a3a9bf9a25ec5a46760b846e9870ed808090 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_debug.html ebbae05487fac861f3e6dcdc566ea64686d0963cb2e36d4be1be1d27595497b6 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_digit_map.html 1a76702ca9ba9bd592fafa04a8245e63a9d38faf507c7beaa80e5d3de6317a93 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_edist_compress.html b1dce5ba1f82231a91290fffd0b2a44f0e2bd673ba60477d35bf2fa4f41f45c8 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_encode.html bef32d567902d63a6d4d0502101001e5fac97e28f796f3373d62cea82725d24c 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_encoder.html 9ddfe0793367b5e40ddca78d66f50ae477d4977312743f7bbd634859ab3470e6 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_examples.html a5bddcb12ffcbed0043c3a95d02f21dcdfc8c3f05dfcc5613541e4cf855ecb0e 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_flex_scanner.html fa8048a20d3e886137b08f6d953f9eea8881aab03df62dd2b9f7ce4f4b23e6d9 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_intro.html 7cc0aac42da2c5567c448db2b51cb43690fec014caff1c22a05ce8f5c00bc5ca 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_mib.html e5441839a54bad9f35289dd4dfa1c1d8fbb964ab996dfafb00fcf8b54919eee3 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_performance.html e77f4e268d8bca465cdbc6217a9021d33533a9672a7423184453e664f064abd4 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_run.html 337210735bd6817303618cea1896e03cdc698b1b81e4ec64c7dbf985776c40bb 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_sdp.html 27df2e1ae75fee8a79c6c581ef8cc6a162eb40910f0fd41a842ee649e8f87854 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_tcp.html e73e6b2d5cd7ab777f684de82bb019cbc4cdaaa31855dc6c1e64b0a6e24a5fc4 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_transport.html 75cbefd94c4e1b22318721fd7d555d9c0cde669827a812f0128e23158869fb3e 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_transport_mechanisms.html edc8edc001602bcf84a8acd60dfd1fb8823ab8335e9472452efe7f2d6f16ab4c 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_udp.html 4670c041a7412a944ae0e72e7f14066d15fa9d3bd43d2fece4abfbf4ad4d7326 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_user.html 6b74ba1e9864ca28fc827602f588e475f85b065b9a12a7e609413f52491e1533 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/notes.html fb8454cc567ab26fed2e37dc5cbaba22d28ef1c5fbf1281e74610cd534c27807 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/search.html c190fed1ea578cb2d4ff89e4d520f757bf993a57d6b6093981c008b68a331cdb 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco.epub 27c99e0df962dd0169c57ec714dee62c27b8b66ffef58d52b227bbe8a73c593d 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco.html 9e4aa5001e986c603f2fd68980eff7407e2a6adad6bff8e2adaeefe34e677ade 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_architecture.html add9f99b8ebdef7a6457cc73c9facf795131a5356471c1e9c5a1f3b38def137c 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_codec_meas.html 144eafb5fa845979241b6f14b67c412df913b3a508fc1442720f23e861198711 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_codec_mstone1.html f10e058055553a2e29f3d6df78e660ab378d43db524734546f9c7cb8d21ed3c7 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_codec_mstone2.html 015c3f1d4f9f94742490f913a2baf1d6389c150b00eabd289307ac3483195c9b 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_codec_transform.html 73b7a9b98630e94d13d6bdd6c9ef876bd63f18ec52f225c3f65b781796cc754d 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_debug.html d2e2aac07ba82b4722faef9874e69a4f9466aade1cde5ea27760434b5ca0f8b1 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_digit_map.html 7f1bc1b0b08fa77bae8a070ca1d60444993f6ec59c91ef8b6255e30146de48bc 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_edist_compress.html d76b4d5626e93b3ac0e9fded9fc8abde71ee09327da4a39d4d86d98f6a46734a 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_encode.html c0358cf88b1494c7e0a40b0b2c2970a72986d978ae304338e40aaaf13664ed13 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_encoder.html 9702ce9b751e0756057d2bd2d3f290b0370ea74319b37581993ce8a01eee6e34 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_examples.html a5aa76fe9d2a3ead69145bf00080599e48ec50c919353b9a382b3f690c780bc4 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_flex_scanner.html 2eec4456703889263edca1d1c3f1ed4fe8e5647794bdf93676ffe1a0e4898b74 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_intro.html 05d7908805177fa1c7f2117f685e9a3d14ead62efd5a40bc56419ca7f211b972 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_mib.html ab368f4c3b64111851b3caa7b8fe631158447d24180e14f349a89f104a60e880 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_performance.html bed013d167078c4c22da5bdcab19110b6c16e53482aa10c77b752ab91e5e982a 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_run.html 020a1ea6ff5ab992afa074eada8357fbdeacad411a6d0ada5ab2b20b44d8050a 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_sdp.html 1cf826c3dfb2fd6569890fd5011e5cafb1ff497a947ed1143a83f38d86938be0 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_tcp.html 1c4e611165958ccf096a2cffdc2370ff30b9869085c49a4b88d78bf37b0d09b6 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_transport.html aa3bd736dda9ad02af108871ace9a3527f79e79a5f87e1fcb5e3ac08a98574fe 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_transport_mechanisms.html 55bb517a70906b0ef5b3382735053d523828e5f123b96cb4b58d24e7b0a2db4e 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_udp.html 7e1f4c4e5ab2314eadf8e25903bd09ddded5c239e95574672465bbb0377358dd 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_user.html a4184926eb657304014a26f53d7ee9edbcfd16ccf255a30be99e79e361353351 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/notes.html ee533b98e489b66d8bca6e7898ea81fab2e084499ffd55954feb49962432cbee 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/search.html 4c067fa7b4b83693bf8ad4ef2f24fae314ada5418138c8f85efbcc57c40711e6 2 @@ -3455,2 +3455,2 @@ -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/404.html 97ed4d6b7f63ac60f4281b59822a1549fcf42aa919cf6c53726a6e7e5cec12fa 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/api-reference.html 0fa0a04bd0ecac475280ed791b3994d0d5711375deaac35699e6640b9fc81b1a 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/404.html 780dfda3904c44f7eb9eff33e9cfbe6d3614e40c687fd7788e3cd5dcab488edb 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/api-reference.html da6dbb4eaa4953a60c7d343232e24716d8b650423341e2063c2c071b5e70d379 2 @@ -3480,17 +3480,17 @@ -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub 4911b22cf9823d617832f31cfb6f6719a19d964c83db42f80e6827acb789aaab 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.html 38318693329e847794399f4366f2a705cd4a97fb8a43f7843e4b0680b2f563f5 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_app_a.html f8bdf28494403805251e49b81c4926d2e7a691e0b65690c1090f079c60c8235e 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_app_b.html 1537ebe3b8598e542c245b202ee18bab8a3879b8f1a5a6354004dc018b9f841f 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_app_c.html 1c0823afa723078975fcc510e0d7396e34d293dc4c1ad8022dee92ce0eae07dc 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap1.html 58dd342e1ba2f3f1b90dad0481dfc45b5fa17d8c5398110e0a9a2426e84dce9e 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap2.html 7bfa12eea9f5d307f8119eb841b798ab951febb5c0c1090ef8bc5b1afc613482 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap3.html 37e2a7f77cb5e7731a418c12845aae0b737eb73ea4f93f7a0dc479c315ef6da3 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap4.html 4dc9331ddf05cb7d729d41cdcfa9fe22ac72ac780f5ac7b87d64a699a7330eaa 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap5.html ad460c211f88e10be4c7d7c876b55b967970eeba1a87c8fbfd502affdb8ef711 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap7.html 353b92b704228db806eb2df653df11f385c53208a92c8f307873e47139cc8087 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap8.html d73bc4c53368ca1f99504ee13ac3ea0969b4725ed2c5940601a2871850875c51 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_frag_hash.html 25662f0d7938f8735131c58fef39e56cff0281fc6bf55ad79d713eeb53f2a78e 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_overview.html 64bc96a7026de9a74268ab0887fbc7b530dbc369ab177b7f966a21dace74cbae 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_registry.html 879bf6cb20af736ff830b673a7711dddbe4c852420d7ce15a87a0c45ad367579 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/notes.html f50158f0729685b316d601e48b2f0330551010a122a9131285feb1710efce4b6 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/search.html 0da9b9ba59597ebaa9f8ea094a461370d302ff8dfb5181432062ff4df53b198b 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub dbc8eb7a6829723e66041c5f97a3d9fb67982c5c5e68ec0c28a86f469f84c415 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.html 60522f7414cbd8bbb74c72fc8d2b8c072ce8e36ad01a032ecc9c179e7f0536d9 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_app_a.html 0c9f924a9ca4a49f69cd57bbeaa84ae229a97ef87a65f81f2e2552d6b51bc980 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_app_b.html edf0144cb7afc7958945d351be01602e9cc38b9d515ef39a907c4c68d2870e89 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_app_c.html 0c1647ab3e7ff0019a6ebd1ffd294bcf58c7f8d508b80b125a776271cb1ccd30 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap1.html 92aca28da3229f3c889ad8e38c61b81d3c4e80baeffd2a1cb35ff678b09a7ed4 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap2.html dca55b56a2b8ba5129e79fcad35b4d8e464567047b25fa439d1ff6637ee45b14 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap3.html 174f57f02c58a32fbced88241882acac58110b9bc07740d16dd810d02c6f8cae 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap4.html c5718496d0553b3e15882b37e73a7ddfa4c2fd28fd6cce417a2ed5aecbd77434 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap5.html 827a2657db8475358223c4b0b39e21a2661671ce39f6e9d42a0b5a4c24387721 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap7.html a11a05cf1133b14e2342698ac024349bf0dfdf52b1e681dc25ea0519afa2de77 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap8.html 873a8da2abb3b91639031217260aa6ee304e7615ea208c8d6b5501c9e4b4fd83 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_frag_hash.html 57b734f23dbbcb74ebb2fa03db2358aa626011e10a7a10223fcd07d80c165928 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_overview.html 281e0cc9b5c04b70e1624c3472fa96024864b704cf0efda2c8dec0bafbb958ef 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_registry.html b94b8f40e7f2c10a066ad7a502a643c0855c22e238878f1800b9a202c5aa1d3c 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/notes.html 5016a4ca591f78c5dab600fc4aced52655accb6a6c06ad84b742249f4e50f333 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/search.html dd5e707c750a5147d21eb7cecd302f2720b09295f54ce98a06823e874ed46c1e 2 @@ -3500,2 +3500,2 @@ -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/404.html ddf8bef8f10e7f6d5d8bbb252a2c717ac4304af72a6953c67a0fa6d029af06af 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/api-reference.html 8fb1dd78609f6b047d6a29baf79050be08dd90f90882e44d9b034ebdad06ac35 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/404.html 101f9984e31d1efbec8cded512dae697d60a35a6b996a2290cf4fd2a13ea11f6 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/api-reference.html 22dfcf6533c11821791630a41646002f922991d4bf098d302cdfadc9c5f8445d 2 @@ -3506,3 +3506,3 @@ -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/cdv_cmd.html 2fee9dc288dd1257a7ac93024f344b580e148ab30e2d9700c617a05d56f7f7bd 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/crashdump_ug.html e32dd0c624e7714485fa71c21600cbc2f53bb0bb0d8c7548816d53c05078407e 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/crashdump_viewer.html e81c3a73a705574d4e621fb54aae8e17df4d21e0d5d0ed4f31360807190685dd 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/cdv_cmd.html 3be82d150f01758bd058f25fb3856030ee1b7edde4f4042ce3a3ca146d2ba8bc 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/crashdump_ug.html 9af0347b7d22f175e0efc91ff58164dec8bb4b2a4a30e615a6a343be4a0e7ef1 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/crashdump_viewer.html d5ea1414d056d91f5dc40a30aef93687c297a7bdc29924a9344bef0d67a1137c 2 @@ -3529,2 +3529,2 @@ -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/etop.html 5446006ef56baf5cdb294bf217fc57093955765762857a8e44bd85991b7723d5 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/etop_ug.html 9784f398d34585f19f2eef9a2e1e849b26e06e155eebe84c10b954141c6530d0 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/etop.html ba27b963038ffb6dcc4743d12c951370fc3f809a5c9ce03bd75876fee7222c64 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/etop_ug.html 2adec1972f8ce77918ed60bb938be7eaa81a0e245f56e33abfd69d46d5d88a53 2 @@ -3532,9 +3532,9 @@ -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/introduction_ug.html ad151ed5dbb6445d3e837ba006933a5f346461467059beb8ef32c9391a002a9c 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/notes.html 30d98f84b96c69595a580c35cb22896cfc4664cd2c59f63c0f87bb5c0ca14852 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer.epub 7e2bb62a1ea8e83f23099839637a04b97072c3173a9f152b7d72a61d52259f3b 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer.html 4d7aa26bcc8beb4dad23ee04c4435b86633691decb6a057bfe76c00fcceb29b3 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer_app.html 884875d6ad22f1b1e15c725b576995e81dd2cd173a96b268e68592a6270ed27c 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer_ug.html 154d9446cf09ab6ac14ca65f772022cae2ec3b93bf3760577fe316d257532043 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/search.html bb65c142739b1f2a1a4217ea20da756313b3b263be52040b2eae0a04ccf794fa 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/ttb.html 39a6056cabd524f7fa975a2b6f8cd9b2c52c5371f7d1aa954fd6372344be6868 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/ttb_ug.html cd552e860cc19dfbe926867a2810825ae1fa81ff56ba5a0e877ffb8b94da8b2c 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/introduction_ug.html 8439edbad7a0e03fbbb575ef0bcbd742885f230ac14b55c81e7a2756663fe322 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/notes.html 98a8470bc9f203eac0af77e70791bda6cab36d3a7b4d76ea331b3784c9f79180 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer.epub b31608ff33fba14d9dea7a54dfec2ad09702172abcd6d510c600653e23ba6346 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer.html 2ac393c968e0d600cce93a4375a39f3a83529f0f1989c460d8f6c02ca2b53c8e 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer_app.html cfd3b36ef21719685afc5f1de9743ac73a8ee79c48e7143a39a7d0d406badd5c 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer_ug.html 20dd9c60598f23c5874b4f4290696cb6d594226d1068a244944387e6f362f3fe 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/search.html 66cff753d87acb7c9fc89bd35c3c82a4aa786f743c955584bcf92ab06fd6cd38 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/ttb.html 14360f92449352bf33026eafaddcdfda3bba4b21e845561ebba93d697334a922 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/ttb_ug.html d79e2d95db271e5dec36dde60c3ad499a95d3e907a25e06234e659b7b31543df 2 @@ -3544,2 +3544,2 @@ -/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/404.html a4f32a324ba9c7901f412b81984a147fae63dcbe0ac87c386043c7564ad1ba84 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/api-reference.html 84500f37e5bc1679e0b92b899fb6b179c5f1442d87a0e415c57a52805c77a114 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/404.html af10d1fae687d84a64793e50022483da69631f381d62c381c2128f4476c8e447 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/api-reference.html a4747b3e9fd88e5a2173a8a408f58319c2d3346b7515d97b46d713283b7ace1f 2 @@ -3549 +3549 @@ -/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/databases.html 8393b02fa0f19e8fcf09e065774b1f04d07f8862ab101614b4dd0ccdd26ce7c1 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/databases.html c6c8225a462ce4d5484827af34256f9d67b9af17e543b473e36cc9c8d4b3268f 2 @@ -3568 +3568 @@ -/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/dist/search_data-5F40933F.js d96127756e906dec98444fe589c19f490497cae42036bc6ba889751c8e76cde3 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/dist/search_data-8746A0E5.js 33de74078c80c05442e23aa410ffc315d847252edb22cb9a2567082a6e6cf0a0 2 @@ -3570,2 +3570,2 @@ -/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/error_handling.html 8f810517e7215a532a938371085e4d9f42d9e9bd8d1d9af4597e462f7c6c9985 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/getting_started.html 236d304e9ce2d7357229072da8df14cc01dd81d8eeb9a228810dca5d87c84050 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/error_handling.html dd132979e5b0848ab7920155542131b200300e259f1ba02d4dfed180e9b8324e 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/getting_started.html 9f7ccfb1df2c210c72f02267a9a3fa57adad89059fb6db5d4b6bc9fc3e56bfff 2 @@ -3573,5 +3573,5 @@ -/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/introduction.html b75439d934b8ef48375e77a08ff2551405855e737df479831ab0170531cc7a8f 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/notes.html 07fca452403a9934decb9310ab0a3fd8e9d9812ee96dcd6e280ccf20bd3b679c 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/odbc.epub d43db2aeb32c2d61f55663cc37591b428119929cd9efe4429d9b0cb34db3c682 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/odbc.html 9393c3608713c3bf79a41756de252eca87d0abfc5f4a97d63fa0e53aa6e1f479 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/search.html d732ea1211215f09a193dd5dd5d1d920b7b72fc1e98e5fd0afd1bf3250434742 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/introduction.html b355e92bdf3aea8d3f843bf02234c3da9f98ef070cfcb1eacb407010b3bf00ad 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/notes.html 2b4846d9d24b5a672f57c08ad63e909df15d7e1d4879562e551719ef231a9a65 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/odbc.epub c13d6fa47ff52773e32a005b101e72c21c0deadbef2e7cccd46bd4cb1579d27d 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/odbc.html a90d676583b731a27c71b0cbabb12a1ce3c041f949302461c7b87fff105fc7c8 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/search.html 644f5cd0270ffd82b057582c50e6af45fae5ab0a223792cfbb757a65b70b1f60 2 @@ -3581,2 +3581,2 @@ -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/404.html bb0429dbce4d278e67d82dc73a491608592e39d09b41a177f250e2c15dd11a9c 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/api-reference.html 152eff973b61753a5629c5a57414e7d5fd181e07e9f9456918cc6f52985caaf1 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/404.html a5716c71091be7b1be8277b9fbb227b94c7f43e2a494fc3a47260ce325c37a72 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/api-reference.html 30cfe056d3dd2970b69b4d1ed46b21ed2b077cd0741a4081c7874a545832627f 2 @@ -3585,2 +3585,2 @@ -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/cpu_sup.html 46e634fbf0d462409160ef19ac6c9d1974b38eb13d5f1419ab5afc4bd49f005f 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/disksup.html 1e56089197c4ce4b3fafb06b1dc3a270774810b71c17681a51ccac3829cf0eaf 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/cpu_sup.html de6b5c76a68a0044ebeaad9cd320e2c213008b5dff8d5eda012d5b605f129315 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/disksup.html 7ebc94044e82bdb8e83cc45be23a292da0cefaaceeb505c3c15f9d8a2702fb84 2 @@ -3608,7 +3608,7 @@ -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/memsup.html 8a7f9f965e974b63345cc0094fa0f50af20246b0ec4cba763d41d985f5370628 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/notes.html 6b4190ed4a188f994f7bea9b2b51dc34ee38c1517dddd29d6f3a6a3e5ca551dc 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/nteventlog.html fb683dd39e2380d6e13f1774cb7a8f9223599a1ccfce6455d4fae3230420513c 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/os_mon.epub 9218b8137f67e6e773a6c62e9ae2b95381e321e59a0bdd036a767e94e1a896e4 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/os_mon_app.html 4ca5c7d0bca89d31cc4de9497fe6d399e5bc808171a267c779d874e9d49716e6 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/os_sup.html 1c2963e49dee61186661bab825d8a64a656642414b0cb3fd8726b442a1ca5a1b 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/search.html 96b0ce512006b5df78f5705df0f6ddda3748dbe9e4043a807bc54950961daadd 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/memsup.html 6911da86d9b8d660014587ee63f78bf24c5e0d11bbedba7e577fd66b49470d0a 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/notes.html 2b2efae4a8f28d67c6dc3cbab78a949ecad1012bde725de5e3e9ce03a56c93e7 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/nteventlog.html 6ed0b879427d622d24cd9e12f867ca258b484d9c656eee11d55eccc2c7033ab6 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/os_mon.epub 1e56ffd00008d7ec505ee905160fcc7d202ef121872207b0074191461da8d03d 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/os_mon_app.html 054226cb97dbfe17af7e14fee309b6e1e292eca7dc22c1cda2cb738e8817f16c 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/os_sup.html eb305ed275b99bbd91e721c1881313a9b2fdcea1869f8bc370ee91c288b9a643 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/search.html 68a4bd85a00eb6aecef4a0427f98a1d7f7bc49b01528672fc4aa3d311f81cd9c 2 @@ -3618,2 +3618,2 @@ -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/404.html ca1d233e1edf07eeb14f7835467755aca8a73585162bc59f0b6556d1adc14856 2 -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/api-reference.html d3d3dfbf32ba729e055e06ac83adf34926fb0984643b89f8cca7a60d85d5ebe6 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/404.html aecd6ace1117b61ec913d22bc137fee811c70743ccee841a1af5cd96f83cf7c0 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/api-reference.html 060a84eaf341a7ad5f397db47df20254858ce49d21a32bf346079b573b136c04 2 @@ -3643,5 +3643,5 @@ -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/leex.html ac5c0d5e675d86ed854e7a4c32c493e6131cbede8fe98361cbec9984a2d0ad8f 2 -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/notes.html b2bebc0f27c0005eb0d7a2dd4ee0c6c50b2584411db9043dac593480e08d348e 2 -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/parsetools.epub 582de88d2346ca6d1c04d3c14ee6abdecfa3384a7b2f5a7f7875b6cee2051057 2 -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/search.html 3a4a59121bc9c3f0f414d92ec61c9e30e39e39dfe0e8aa35741815a0124ffc5b 2 -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/yecc.html b5c9b85ebc9c14052054494b619ba1d1984a4a4c295446d1c76ae2100b768016 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/leex.html 8707b3adb6f4e7ec4fcacd9cdd091910eccf2622b1f20d8791f3be1ce72b5c70 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/notes.html d90663985746c2d9cb6bfa86b825c1dfa2a309c069e67510461a404b176203c5 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/parsetools.epub 3c2fc0cdb458ba5d47f2eca5806c467af95de891257b6c940cc2ece86e0c07a0 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/search.html 90309866240eb65ab6ac01d3b591abd68dfec30127c1382403b94bb00d324a4e 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/yecc.html b74f66e98babcf803a8fc7a513563e5ac6f5c46beab0a19d51b4214faba5a754 2 @@ -3651,2 +3651,2 @@ -/usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/404.html 6e932601751604d6e70807c1e526fbe3103aee7e433276867873d20bde11ce8b 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/api-reference.html d19ec7216910cca221b869207a50ec6d36854ece85ce69f82db33f68d41f77c7 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/404.html 3ca003a6ec93d7bd0007e59bc1b4400b1cfe1fea6cb28ddab4fb09b0c26a00fa 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/api-reference.html 7261b46ad14e957cd388862ed67a2728cd687b6b0b36d97b8253250df89c8fd2 2 @@ -3676,7 +3676,7 @@ -/usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/notes.html 407af1b7e371b408751ab25e0b701c43e85ae6ce44bd6491779600e499390467 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/public_key.epub d40987d9b5da523b6f74ab1fdd4e9cfc5c26e2c7fafd9558595ceaf14447eb8f 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/public_key.html f16199f81b8055d4e0f53b593fb62991cffe39ceb8d7e9cb7fc7da65f0fcb9bb 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/public_key_app.html 73557bc9c92a1178b6f99351bce580c9e74b3023c198a135eeeeb69d08ec38f9 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/public_key_records.html 5567c6bf5b35a447ef7d098c766335a75e8274c9d1ff3aba178d79598141745d 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/search.html 7dec37bb2f8a076d293bf678c5c9231de33211bb9474afe402c14c8c938d0de1 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/using_public_key.html 8663e1c2e692c2f99a0d667d5a80e423655d0c4174910e8a1835fc48cec1a7f2 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/notes.html ad0cac0283e1ac4223799403a9f93448deec0d66d350ff9d656f2fb0e292427a 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/public_key.epub 62ae5a75f5df29f1ac580cb121190f361b33d48cf1ee89cad6c8ba0415d3b9d5 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/public_key.html 4c7f7d60d596cc000563e6c5775fb78bebe9e63666719a2af1e34e3759e4e227 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/public_key_app.html 03df0685029875b194b3b8a0fae2acbc54f6a2fdfe524fc2f36a07a08aee31c1 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/public_key_records.html e0be287389c313f61359bde8237ff5194d40f97032e4961bf8669d89f7bf1b1c 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/search.html 0a5f31b2fcac6a680d74a0053d11793af75e783b78f192289201c70d888d4434 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/using_public_key.html ed19d168f7ac8cef4a7f5a6fed3bafba3986ec999482666d2aeefb0aeb3bc05b 2 @@ -3686,2 +3686,2 @@ -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/404.html 52d1ab8907c5c3f5d5c1f0fcaebd4ae9d41b7b48b0923ab67702371c3ad6f911 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/api-reference.html b45029abd6daecba0bb9644d7982380a44fee29d9b1bf6c830e2d8194ede013e 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/404.html dc857b3b4a15ba040fa2a85289460fce07e0ad109b0b2ac7246c6596b2a63132 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/api-reference.html 48524de5a0f8485b555e20d1cb67f1824d9eac8b20d859021ae4d0cb24fe8941 2 @@ -3711,7 +3711,7 @@ -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/notes.html cb166ff02a34e87caf4b2412719b01be75a235bbb0ee66de8607cc2adea27a7d 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool.epub d67850a361719842ac23b6d3e1bd5441ee17e123d4810d4e7e511551c386d95a 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool.html f2cf5a92b86cc9d192c444f3b921023b1daa70404c446d17faed895753f248dd 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool_examples.html 4ca1a9eecbaae18ccbda211fd8e73c9b72fb5f3ed7e80a0d486e67c6bbc213eb 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool_intro.html 792f66055f0bdf8df3a6aea972df3a50e9edd8112e6a6f8c47aabe802421d040 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool_usage.html 5a01147cdb7dae92d752176b3d45454e87d72dfb5c2df81e9f74e05b27b554b8 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/search.html 132eb107b1f139edfc9e602778865a2182f0af9db35596f858b3d8fc951872d1 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/notes.html c4a3f74e0411be5d11a108e1ae943b14ef83b54d620864ef3fce98cf1ae32cac 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool.epub 45199c353d6d4f8347493ce9e6d56a2b82732702b095be9875439f55af293563 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool.html b940c39e57692589f5377009c3085941d0b4fb0ac351002ed35833a65a58c203 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool_examples.html 8a61cc4118d80fa74747a2e72a8df316a08ad72e59d2a142a01182c3a125f362 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool_intro.html 12545a23b5afe0d72985e28cfd29527981bd98f045b2f5fe0ddf677eda00a101 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool_usage.html ecefe878f278e924494e5da628a920b0147136e279312927c561fd1e53886086 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/search.html 5c723e90f7e20d6b4d0eef9b23df42ba34ceee713541a6b13f9f6b8e02ce9177 2 @@ -3721,2 +3721,2 @@ -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/404.html 34e28e4c6768b4c8278ff8b447ce79558817f6e44cd8e63e6b481bdf106792a8 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/api-reference.html 9428b1fa684192eaa31fa842a35f552d80bd95f241497904c1cc65d222f576b1 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/404.html 4d7c1429373bdebaf12e6fc7e36efcd9a6704d8e20f76f45cbc5a7161b2becf6 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/api-reference.html 7a865f22df6d0affcb5af25362fa16cec656ffc6a1077feafcc5bdb78a411217 2 @@ -3725 +3725 @@ -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dbg.html 5dced638a07c385477d406d852f00c37416b38bf32a9f54a159f3dacebfce4d1 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dbg.html d5ee0e6e35bd6be8f93859fe6b350c466faee3587c9e0d76a157c942138b607f 2 @@ -3746,2 +3746,2 @@ -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dtrace.html cbf7491d094e8bb7985c962ccef6874c928a622ab1e2e11d05c0b1bb2e09ca7f 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dyntrace.html 4ac5eafae121e051deacf0e0d9f446498cfc764730510469b7fce4856aba8f72 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dtrace.html 00ebfcb45d7d9dc242175d5e99bfeb4e180ffbf71206afe77f6383fd39ef003a 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dyntrace.html b8f1204154899c40ac36d66bbf97ccb2facae413cd3a283fdc6b9e689ff5c87f 2 @@ -3749,10 +3749,10 @@ -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/instrument.html 1e17bd60ba6f60c8503c196edda7cda2853ea52219f6e92a19466a0b64371c20 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/lttng.html ac74f7bafad164ce5f9004d980be81cd1b475b8df21e59f25dd6d9d977f2ee01 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/msacc.html 559a92a53a4a1f835962aa137d2255701371c6d609cae92323eb29ca82f0dfd3 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/notes.html 948ec1c5615844c9060f1369216441ebd1a911e1334dfdac8fc777f38f5f2db4 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub a6e0fc1d7f175a994625bb38a40b75ee8b1cea1f9cf7969b73ca50ddabcb800a 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools_app.html 9b58df46f9a63a9fbb477bffb773075ea538365e0aea048f891b8631886abf85 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/scheduler.html 1d09edb6f8742794ac5e481eda2ea733970d09a087d7145c536ef4be0068fb8d 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/search.html 257d464f1dae1dba10b92ed39975896592a29105c1397f75eccbc403cb9a183b 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/system_information.html 7e69d1971c4b0e542855a074953854a25a5d504c7fe992d3166bbd1c78b734a0 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/systemtap.html eeb1bf97c9b0e146520a23290069991639852ff28528557cd1b95d64ea67d3f4 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/instrument.html a49c7403e084b8b06df8712cd25ce4bd260bbb7b82d72ff0584e3329fe8d3fa3 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/lttng.html 3ceb1f46ce82249b000e4cbae0dfb07c5b7bdfd36326e0f17b8a50c6e2f65af1 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/msacc.html 885b3364740f2a69a37e403e81e25068832c706b0ced6cbcad10e78889678193 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/notes.html 93319da9c4b3603af148eb2936b50172af04f0f35f00e93193350e1230672a66 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub 06aa021e2adc3996fab23c9d8783133cde2f0e48bfb18cabcfc2eebf530f02ce 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools_app.html 17c139097bbf1a9bcdc129d456778f8b4cb84e40cad461e6acff169049e160d7 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/scheduler.html 8a0e2e4dfbd065033d8ae38dc3ff1b5625fc1cc41df08335c39ae4591eca1fa1 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/search.html df47c0f5d5107cd8a33124df9c34ffd3d5649a51aa5c9f065c0d1ccd362f191c 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/system_information.html 07b68b63010a0fc74788f97bc8e51cd00fbba5ca1d7687a2ed910d10601cd122 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/systemtap.html e613cdbd6b9e3af9770837f7b376673e3c7c9abc2582c6ab4586045eb264dd46 2 @@ -3762,4 +3762,4 @@ -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/404.html 2acb6ccc1f58df4e7772400143bae225e5db8802cbb6debcd96701f04971c11f 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/alarm_handler.html b0cae7be4d0753733dd7b5f949cbb8f239c8f1e683f31a08e1f60d421ad7c5ea 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/api-reference.html 76cf8d9fb873aab5d4a90411d259874d5bce3473ad1ebf820cb1b482ca6187ea 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/appup.html 375f6cc27e5a66a745ea0afb06f20803574dba132a5808615c984520ce565fba 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/404.html fc23163ef9bbdc3e8cf24f8c5ee5e14cfd9086c15ce8d3b4cf53fe086b3af8e0 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/alarm_handler.html 523da59d3ffbbd8af3e20b395424353a9a2895e0953952aebea77cf69e27b71b 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/api-reference.html 2ca6a75eb06a764eb8d0cb5e9c878fcf90224839ca3f0e0b5c7c007a332499eb 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/appup.html fe74e458533eb98f14e68447afdd43e709450645a631b0b74406228f60e737b0 2 @@ -3786 +3786 @@ -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/dist/search_data-D2253CE5.js 678b50e9092253a4c186068ba31c5d2c2ce327f477d5475f52a12ca7381ae2d1 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/dist/search_data-12AAC588.js c23d12526231e2fed3940ce1b97b6a11060ae38065d0c1b0cfd815fc3f4f6d99 2 @@ -3788 +3788 @@ -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/error_logging.html fe5a1172ac3c714f4f0e906960a358e09fa894750016f68f1f3bf26c07ad3c75 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/error_logging.html 52bcf79e182a4c017f50f7d3da6d1b9b94b8bfcd4f2e04110cf8434f6044a131 2 @@ -3790,11 +3790,11 @@ -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/notes.html 603ca8e36ddd76e5cf40feed1fde8f7334e178ef35793ab93e90827536e700df 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/rb.html 5dbc692a1a790d25d388f177bafdc1f35e720041344fb1babad52841651441ca 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/rel.html c28e8d42b0e9c8f98b7df7a14a158807970135428503cfe38e2f894114c6e796 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/release_handler.html 6c99c19ddc1867c9b8ecf2135464f79d9ebdc010f32fdff034c875a03093344b 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/relup.html db592bd1c28342bdacbd4550d0d181a5753559513d3688d9d2b426b190fddcf0 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub ac4963f70ba9c8d4bf3c974c1ceed4332641e41da252fbd766468b2cecd0729a 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl_app.html 0a33c42db4c97f0590028ce83d299e911d317831fcb22a529b1019a58d556123 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl_intro.html e8ad69dc1f4830264d8dac82ee2f5dde40c7a0b2479613a7b2a1ad0afb1097a1 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/script.html b8df285044de528ebdc521fcf21cc0a83b1e57d2c371bab506268412f9289bd2 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/search.html 7ae40d07300bed9f5dfcb479c6df8d1e800e585b61ea8ceec9e21d88377c1c58 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/systools.html 0b6e8f073ea58b0ecb5dc287bbdc679de6f2011a39f2ad05d4b463f2b9051a6b 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/notes.html fa0d3188361c4233831a8372e032f65fbd8e204b7b05824aa916868f851067b7 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/rb.html 0e72d5fcd938f0c142ecf6e1b18f197e79736d56ac6ff25de55f7ccc76d1ba13 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/rel.html 40f9fb228eac15820968df81992c96f26b5bc5400ae90eebecdd28c9721d09fe 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/release_handler.html 29a673e30ee0c9e113bc6f7c627f55c1e33a5e90b2052d8c7ea7c7a3cd7e23cc 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/relup.html c8b68c9a555f42f1c8ce74c1b0588d3a973259740ffc1cc6e4f1539610165707 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub 48f39e4fed46294f1c2b8f0e7dabf35323f72ebf91871bb071c7c3dec34e4e8c 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl_app.html 231e39ea234e1de5670cbd4ea3287eb7f4bc605ef06819d74adb6768ba24bd8c 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl_intro.html f66be5e1255e257d6c394dec219d43438f75bfe71ebee2e6f3beaf02ca02dcae 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/script.html a72bdda5a99028f03d74f54f57777e4ba7ee5ddf6ea9a0ba2891d1b47414de7e 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/search.html e1a2a1c36d1bf065ebe6768c56a60ae7268b229a072f4db0f4d21f2f286e4b2a 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/systools.html 7c6d6407a0b3b6c28e7e03ef738a0273c6461b292419dc949307304cc266c91d 2 @@ -3804,2 +3804,2 @@ -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/404.html ff816b80f253438449b2cdc2a2f060ecd1f94063b684d6736db934e17dcd39dd 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/api-reference.html 8194d7107dfcddc400b6d79b33459c5d115ccd6f788477011336b02718777baa 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/404.html 733db2193e9addaf0306fa122e5847ee525272a6c0187c96ab5cbadf30154b77 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/api-reference.html e7d114f6b260e74b472e28cc3d97cb9d7f5830d9310606f09da8e30698cbf1cb 2 @@ -3839,57 +3839,57 @@ -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/notes.html 70aa050b05b34c039d4862bf8ff9ade06af8960e768c508f3b359a62904b82ce 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/search.html 8d70bb4a6597c9d0ced4254b42115e35a0b3232bc8bfd1d19a2547115e2e9837 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub b373dc6f075654c45f0acd56f1d4ca68844ef6d49c9acf7a59d1aca071c937a3 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.html 3e4ecbebb805befef67791a76683d57f450c6f8f13fdb7bfd12c637fd17e4c6a 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_advanced_agent.html 5810a95392422b285fc302e74008bb5861170eeb04677c519b9386ed98440e74 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_agent_config_files.html fa10d18629424ac9a05bdd30b8ff626af6439b97c07d700270c1b5fe772ebb57 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_agent_funct_descr.html d7d57332cd614ef8f034c45628694de18621f2eff0aef8ceb27b0398e4ad54cf 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_agent_netif.html 387789da2ede1aa4208066b0e7ea4d74ae836f328545b77eb44b6419bcdb248a 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_app.html 40b1cd3ada110908adb955e21b013c23ed52a1386534b403d474b251e30e9d87 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_app_a.html 0e563f975389596ca0a1e050aac0768edb264b9f12986fada03dba376e693ac3 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_app_b.html 8e07f82c80318bccf883062e5b299bad8216fdb0d417f2cb51442dfc65b078ac 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_app_c.html 372c3ef9e79d56e80536bece68c64edcc27141742669756f0139be4f2ade307e 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_audit_trail_log.html bae4b5deb082996938d68900aacff9ee6c7e133e83692b473a38170f7ac00232 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_community_mib.html 7558eefbe4f9577c41d37a4905fe6b7ed68f15016f3b3d8fce97ff078b98e3a2 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_config.html 5e48a6b33e0a56bbe62f3dc8c84a01a6baa6b7564dfd09fe6389d6ac6a1bfa19 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_def_instr_functions.html 9a0efc216d853b24d23d9354d535b4f57d7a5ff4f646e40fc68431cb69c87ac4 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_framework_mib.html 4cb4c29df941234d8a07466ae8e44e3e80971f9c18981f2abac68e4a13bac284 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_generic.html 0011649f03a2ce5b3f7d378b92bf1f6e033abad01d93ecc5fd3457e5dfa53b26 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_impl_example_agent.html deeb5c1c5eabf1896699db3040c1d36ade4a3c07bc0bb3eed3b551b31c7b8a09 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_impl_example_manager.html 853c640d507e618165128c1e267004c82f4ef4b85699863fad0dda600b47fde5 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_index.html 1591222641ca9ac231e791321d33c12ab08a878e315755d8a5fa346ab7764f1c 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_instr_functions.html a1ab7bea87713d8cdd7366b843547653f98f230dce4b38bdad937e5a664eabba 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_intro.html a99821e063653af50dc74e452aac1222d278055843a42f25ba212bcb440a4b9a 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_manager_config_files.html 164d20c7c9145a6638ad79da4798c4ec4541f858f717d466218ab83b360ece37 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_manager_funct_descr.html 3667b3e9b9432532deaa38e1aa1d6642da8762e24acf9bd8ea7928d892fae5ae 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_manager_netif.html 18857a6268dcc6a2e3f9029076d87aaf81194153bcb8cf8ad09fcdf341820c3b 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_mib_compiler.html 47b8556b20802c45a14c9e5892687e0a85162867bdbd3eb95e3888a5bf9dccfc 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_notification_mib.html 8cc40a15459b2c1695b5e42a9cf5adc804aaae8b6c5199b62a7d10b0e774b836 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_pdus.html 8c0dc6371d6a471d11ba976b04825fed1d68f81dae3e1cb6684f91fcc88ac76e 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_standard_mib.html 7285cc79e1ae83025e511ebeec3e4e8ad002effddbba158506a59fe458bd3301 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_target_mib.html 2e79182a31cf5ae1be3b16ed40d84ba092b00a80ee5f9c4932e35f4f753ecbc9 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_user_based_sm_mib.html 34c4205a4c99a78cb64be1bd619840b7107bbf47c0cb40b1045cc34e4c1b3512 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_view_based_acm_mib.html 8c7777a7a21a0645c47f17181e87b80d0fa61178357fc4d21958222d8d8529c4 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa.html 3c6907076f1de247e647ae418d80095129832d114abe251b7cc5ee2952eebe28 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_conf.html 18cc4da671b5f4c2f045526954eced9ef6da3731098c3b2e34fa431ecc54e091 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_discovery_handler.html 4c01fe81f0d423f1cdce1b11b6df480aa6cd003e333a174b796cea7f778fa088 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_error.html ee43b149abc132134cadb496d404782bf1d2635ed21651c4612fccb98bb7406a 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_error_io.html f02ea2a92cc283f2f586a5c2f2933816bedcda6b6ccc252a13b561fb2bb61bed 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_error_logger.html c7fbbbf13992a7f91604443d89b487b304c97eb448830befcb3b3cc99c9ab556 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_error_report.html b391d961099fddb0d6c3e47ee77813dbf0cf4209aa6208495dbb356dbdd52e1f 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_local_db.html 9c47e6ffd54d7c4647819a1a81883987ef6be38e172aa2f0aeb0230da5d3240f 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_mib_data.html 45da3d899130c84b10c4875ab2a42dc5c6cbe42823456c52f5514b57d56811a5 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_mib_storage.html 8dc158ff26fee92e6d67d1d8421033a23c50d19533c56dd34b58808314e94822 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_mpd.html 079e0654da596a5197bb714a254712b17ba5e84aa1c31099cd925a4d9c997c3f 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_network_interface.html 7ea63710c4f72be796ee11489850e614c6d8a8bf435c4c18b4fed9132bf48588 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_network_interface_filter.html cc02d7895a4713d865d04eb2ce80e214886782f75c12cf9ebcacfddeb32afd57 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_notification_delivery_info_receiver.html aa6d36047e3096b54c649891c2df11af5bc73694f1b96bf80e3b29e650c8df8e 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_notification_filter.html 1cb5d40ac5be5d0014e3d3aad89d16603a14b1b4a5b90681bc82316fd64daf78 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_supervisor.html bfe45d8da72a3fbdbb546e4a018a649e733798af95e2e4e20d71879350c2de08 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpc.html 32c3b8714da293bb67acc22c166ab8c7bdd75216b89f029901dcc03af2094c4b 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpc_cmd.html 55188b5ac191a4d12e70acd077f670cf85c75a0f96fb7746cf907e46ef5ed9a2 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm.html c6fd2fd163c90038f15d9a699cf5d4358f8e23fe3f06a71a7d149e453d21602e 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm_conf.html fc66c53ee10cd2a7b92a3ab99152e3ed7ed92462e203eed51690b851f79b055e 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm_mpd.html e9c340321ace04ab002028a510b9b7cfb0dadd02df6a59d38601fc6152015830 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm_network_interface.html 157a1617f56054aaa41dc253463e69c7564e29485e91a01d6fdb1efcee014c3f 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm_network_interface_filter.html fc186f13419dfc8cbea2fa45b4d9a835b974fc3a0c1a61e8a85024511fd78407 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm_user.html 09970391ad77796e06cac7d027767fb151ec29f9613075c16992230676c40d51 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/notes.html 206d1354e03b22c02aaa5d2b601317ab5051ddda2658734d968b65b9f338e3af 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/search.html 314e8de0d0745b39842918ab69c3c5f41b79fd6d7140224d2c40aeb512fe6965 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub 0cec81c0c214a64c8c4060e2af0c7aca1fa28ce0cda0e50b7fb6e217b054953d 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.html 98ec3defd05ec58dad6acbed4025a6d3fba5d294e8ded8dff04b37ab7d2ee972 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_advanced_agent.html 8a90ead4ef8b1d64bb090336fb3a52ce5acfa9c064f17ab53d88bc5eee3f9223 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_agent_config_files.html a56f74b74512e2de4a07aa23439a2b8ced863e8e15d522c9d3de5b9da64e6576 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_agent_funct_descr.html 0c0719c652b290f43093f78aa83b9650af0b524996daabf52bfb3d2ef806ec5e 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_agent_netif.html 41adc97aa791236b6c9e1f626cbd3b63cdc3d0f499883d45f3a28364cd0615f3 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_app.html 722139b889c9f6eef8cbb562b5d77c18d8f69536ec62e5cce6a8ffd1587d5d71 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_app_a.html 39b2d006987a0e600ab5de7ebc6c99a315fdacf6d1b82105d95688747c7f53e1 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_app_b.html dc42762006a51e8a8831598b0a2fd2e042e9314b8e0a5740779be30248f6c605 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_app_c.html 4fdb9c0146e35753a611af8403c48c7fc926b19f5a52eb4f2a639166dd4702a3 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_audit_trail_log.html 441fd639db13299af0e95d7a9ee8b7512955e9a8a76119ba7956fad67452ba4b 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_community_mib.html 3fbdedb4ebb76a0836c8e3f56ddd1e9b08e860152bd61d80d1e788873566f03c 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_config.html 6fa02ab644876e428d7e16be558f4224d1754cb27e8015b8218d919c2fe0e57b 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_def_instr_functions.html 1955db9a4bbef61c29aa2c74177df45ad3f770524e2840bfa59f0f7e2a9a8659 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_framework_mib.html 61699a3f225a8b8d84baec6d016ef725ba9c339fe6bbddaf924261fa85af8a87 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_generic.html 4813f52fe81d8abdfc5216b28c95a8d16f59d9ccfdd94d4a929d637446fa0d31 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_impl_example_agent.html b53284debc3ac2a25646d747d7a0fa621097d3cf62725dcfa8c5cd70c5163c2b 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_impl_example_manager.html f5b1f45cbeea6562ccf701ce1f8cb7033410be92806abd09d3d76b22b18e4f22 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_index.html 0d975c82164765760c32b32e38620df342968bb1fd30425af06341a1115cd7ff 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_instr_functions.html be968a4a71645701edcbb3deb15138a431b286d634f198149c226c3d14d481b4 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_intro.html 99f5bd2e9bbfaac5decc42b699afa19b7ed1bbdd3dc36dd3f683b82721188951 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_manager_config_files.html a1a9ae9cade2a28a31fe0cc541a11c752f3fefa8968e09c5d6b2076e0fe96f29 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_manager_funct_descr.html b30a18fd7c63bd8a740c379c58719dd82e0be4fa592176dcb080a91f7aeac945 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_manager_netif.html ed354942df6bd42b3751ed0bcd39ec078d4980e1f0f1eb88f2fe4487b721a58a 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_mib_compiler.html 0cca209fade12f34e754dce27a8eb36b3d7798b744e83c9fe68e9f24a6f77088 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_notification_mib.html 56b47d3b54161c55cfda187b81ba50dc6a2bf93d1c7cfebb1ecf6267234e721e 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_pdus.html 7a43aab9c6721a6c5c8f209907c6c54d839568d60de59b0f5afcbe313413dcbe 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_standard_mib.html 0b411c047ea3963835ba0d0afcd0347cc989a77ef41c3db57741a0abd0c6c199 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_target_mib.html 5caef842debc15148d1ba9a578f96c8dd066e94a5f10fa2a2ccfeee0c3874965 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_user_based_sm_mib.html f4f8c79f8ed886201807dfeb9e56e4a64369432c6f568c7e8ef3860837a94fb3 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_view_based_acm_mib.html 6cf6f58e4ce0fe18c99b3eb13c9270ac43de67f52ae7016cdd3962e914ec01a3 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa.html c99b1af7599c6584126c6f4ad09e47df73b59418219f16012c8c10f76838ba27 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_conf.html b247b8bd7eafdf4f7b696e492227ff25256070932b35f8de8d52c45b965de1c0 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_discovery_handler.html d993b6d3f3b8886ff3c7d8fcf23f190ba9bb4ebcc92554148634c359b8efd406 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_error.html 35b44edb12f377826d3ecd3460413b2b691c8499480917afa5123d05ec95a152 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_error_io.html 1a96111af3a2dfd6cda2b5ac15aa536b4e48d187c74aebfc27a2541e3b46eac6 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_error_logger.html 3724e6f39aac4a1b501dedd977baa5e2fec8d4fc64e2f0fe3820de72f7f517f4 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_error_report.html 98e95833f60cee4d1bef0bb02595eb04790cdfe545f3d818c130e6b52026ae04 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_local_db.html e04f3de95ac988ddfaeab3521865730b30c21400d2a89807f70b88f4cc3c0025 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_mib_data.html d6b7015fbbae6c76d2f7b47daa2b174086a3ee2d5846028f2a91ba9eef09f149 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_mib_storage.html 72b40fbfc20260821fd1376fd610f745a25313d7fd3fd70058f031ad0a27e824 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_mpd.html a2f776d1d8d9818f14f4f57351c0450c978d5f0a8264880f96d6953756803f64 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_network_interface.html 6e8e6b408a0ad4d39bc20ec2da6d3b023506254fea6633a7f0d7c253057ff148 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_network_interface_filter.html 36eac696ec7a00d2398eeb286c8728d7eda5a7fd744a5a0eb0395c7b9a74968d 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_notification_delivery_info_receiver.html a3609c4083f29ebf1e51248aa297811f5129559682b14109b3b8c333439afbf2 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_notification_filter.html 5435a8ffa8840cdbe01e54ec1a73a2ee85700ed0011693ab7b5cbd9620f3c30c 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_supervisor.html b875fb4077b725095f121c81cacc7d536f121dfbfd7be573a0f8d9dfd32e5105 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpc.html 68b2583cd5ce7aea96a8318bee58a672480f7dc1ea4fd679017db4ab3f353a89 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpc_cmd.html bb43e640b257186fa5eb8e4a1bd0bc0e2876c45766409a056fb502f05b15e8fb 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm.html bb87c6a17151f0f403c67de987c7ae93ed913d081bdff9ac8d03e7efdc0349ea 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm_conf.html 63fbf89c8c789572c84e0907e519736e434fde1173cc7f938a5032cabfeada32 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm_mpd.html c6ae57311b09418dcacce1ba50ac81455cbe36d2d61f4593fa7c8c8dc51a0a11 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm_network_interface.html bea8e9872a729fe3e1d10a7ae5d802cbd0427bd3c57835dd0d7363240cbc4d50 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm_network_interface_filter.html e9cb47c3cff89f23f99ac142f200f39869c9cbcfc8e2e5d5386697ce41948f7a 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm_user.html e9f8033f7c69e523128b053c8385181d83615d2bc934f784132a3c64b285660f 2 @@ -3899,2 +3899,2 @@ -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/404.html ffc650dcda03c907d17b3d3882845e054b91e687668d13779f60690bb076951e 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/api-reference.html 0788b8efe595a17ca0af0e784eca2b92882ccfd5000fe64507fc677c8b97d412 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/404.html ff08f1d643fd493f11d62c39ba863c5eb9ba7bef09d544fabdbe1d406f2f8480 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/api-reference.html f29044827acca00d248437babce0c20a9a3f49e4e761441232ec60e4e61fbada 2 @@ -3904,2 +3904,2 @@ -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/configurations.html 389bd9721c4f5d09f57aadb114d133e931836cbbbb391178f513f7f2098784c0 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/configure_algos.html 3b241aa06b85559746416b6f6675257bad03064348b71aba02794f6b5a689cd8 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/configurations.html bbab37288d98286f8aeff75f4c74953a4fdc72bbd8e3af11c52f30bcca2b2ca4 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/configure_algos.html b751d8109a359dafa3b9c3f4c4b930ad1af559f22da505a95751d9595b40806f 2 @@ -3926 +3926 @@ -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/hardening.html be50630def72a9dabcf799c8082f1edd749070d672cd2732585c72a83639d857 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/hardening.html c6fc13e295ddc14cfc1956d9503417176dc6ce65e36d9bf6598bceda2b6972c3 2 @@ -3928,17 +3928,17 @@ -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/introduction.html 0deb165f7ce48dd0835f7192de962386cc73dc0ec67305d32ab97267f656d649 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/notes.html b4f942f6af9f90d8ea997ee5354f9edc441eff013b3dd0503e1cbfa2ed87a0cd 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/search.html 2292726715662f2b55a7f1ca560ba808e19b0aea2b4da10b1a5b011c3075ed42 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh.epub b7f1f12f1816f3c8e77cce7901d12eb8a693b2a7f203a2e01ef25052a40925da 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh.html 0ef649aaa47c7f23abbe8ca937f6f9667ffda86f25aade1a4b11a956d9df1914 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_agent.html a3078b50a85fd120c586547e04e9dd3aa3657b4c25310a37a847042b1bf4a702 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_app.html f09011623276d5b5130a1bb110bdadc9d05988506320c3b1a641865a5592cd90 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_client_channel.html 09fcbd3b26e57ec755b11a139f794985b790b1a13c8b6a025d4c43d1f942ff21 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_client_key_api.html 6cf2664c93cca054d9faa5c98ccc2d9847dad5d2ef88c96d3d696a5db2b61e8b 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_connection.html dec954665aa02f9bb564ba5c5ee97fd334d5709dcc6cef78d30159566e4fbeb0 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_file.html d32b2415a236e8a9fd94a70d4b3c93ebb56866e296a9fda437e7d164a2cd43d5 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_server_channel.html 97165604e1f7e3fed99648f70e6a7812d68c66290c3f921dc16a52a9ab114498 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_server_key_api.html dfcf4ccbe8110fbab0a99bd23887466e6005e115e00c8248fe64f8907a404cff 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_sftp.html 4ee922529f3869c2cb23acc45d2bf798905365e5fcc82b5df869b3096fdaedfb 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_sftpd.html f2d0288496513f58df429b5056db6dbd45f17b0518207e61249e445939c0c9bf 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/terminology.html 4c54433ff16b05fd04730715e80f6d2233b063c32e41f1874dc36eda9087c5d2 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/using_ssh.html 62370288da32a47c199719c1897e869796210bca50595555efa6143ffe635cd0 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/introduction.html 81d693426a3e39866e788ede19fb007811f41de452d5814d12e17787a5895e20 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/notes.html 0d71244e47f20b744b9be274daccbd21fc5ba0f0a9819cd681e82fcf7ace720f 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/search.html e38571f8efc3dece86f5dedf6e205c86cbd05344558a499e9cc8484c2731f343 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh.epub b9c832a99145954e458b50e18d230a2a450a0cd9bf1bb51d8948a2c312af8b01 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh.html 6d1f70714f0f8f16c0af5e962d79575be20bc740de7e8c4f7242d13415013026 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_agent.html 5e0ab638ef1bbcd845f5e4aabdba6114d8b67b813114b58f62369e7853bd88f7 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_app.html a4161594ac63f49c67747a92b0290f6880e853dc1e406e2aa8f900689bfd773e 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_client_channel.html 5926fa61eadba7d5d3f4cceb3b8895cf9887d0ef63bfc91d4162d529c885a076 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_client_key_api.html c2cfc9790c4c23e4a97b2cdb76fb1155d3dc65f8285b2ce36651a816a6c354f4 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_connection.html c6e069d9060d4fa7a79fb95b32c8af3442410ee8a5b9e84e489b5bdc8ebbcf07 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_file.html c52de07333c10ad851ce8ea6bf45a57284dfeb85bca3d21d465064553bf05540 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_server_channel.html 0c9dd8c3bdbc51a14ad2053abd99f033b4d597ccc80fa5938caa685d29d87ffc 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_server_key_api.html 03e1444ce3508c359d62a11a282f064273de68abcf67824dc1fd9997d91e0074 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_sftp.html f451c1370f3a11a7436de955589a6a9bebbb6e6d0703aa3e724a31111b880abe 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_sftpd.html c9edacb918fe57d817c51856c27591ee026a769d817d2b351a4e4a08ce467838 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/terminology.html fc86e5bfe9b238fbb8cc868ac848e8ca10dd244aadbda0a61aa15787c2b3f4ae 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/using_ssh.html 4e63edee84a3c409b9dff6de722456d733fd7f92007ee7a6e420584a1bf1f771 2 @@ -3948,2 +3948,2 @@ -/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/404.html 5c9a71568e5ea7dac8aecd4d707ff4642c18325a9b8a2f2afb47b482d79dbfb7 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/api-reference.html 4be463ab77777852d6122253cb858181c0abeae596dba3a4aca63f612eddf65f 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/404.html 8d20685179328a2445fbb6d7b500e557478003c948deddcfa5cb91987b8a892a 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/api-reference.html d79ee98c0cf5e2aebc550abc8e6d092fc00cb4f4469536e813d8e6ef5e83b3d0 2 @@ -3973,12 +3973,12 @@ -/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/notes.html 812142dbabb53aac14e405ff01c9de81786a679dca61fc6f3811bb6ac80726a1 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/search.html 7fef16024560629e68af3ad9aeaedc34efc99741e233f36b32845d6ded2ca206 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl.epub 192ff9425d4d4704af44c1103d6d6458205973b351b7a9023f1774971c63f78d 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl.html 939bc9fce85389c821f6774c9374d8b9903c57767318dbf0250236b79691e524 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_app.html ac842060c2aab838174359ef39c69720816d619ac93f5194ba5ed4e4db1ebb8b 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_crl_cache.html 4e67eacc794befa94d55fba959e720bfd646e6bd8467ffeff2de293187005dde 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_crl_cache_api.html 531e32b0f05bac746202d54f9e276d8c02572af9228d8756bcbc6e598fea7b56 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_distribution.html ded4a6fa77f67602861f2c45789f3e2d3697deab701d2918997eb135825a3157 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_protocol.html c5938761b3e410be2b3d4a211a64ea4a0d048632ed5ec16325e2dd1731a88b1f 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_session_cache_api.html 73c3c37ea092ed5766c2f09aec4123c4fe8e0d567130a0ef8ff61c5524d5151d 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/standards_compliance.html 89263d981fe9e80405b00e7c0b725da9767bec86f15484f56a6c85d3e03ebd9b 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/using_ssl.html 371ce2721a7bb86ede9ac437280e8b62017243adfbd3f507840250a350f066e7 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/notes.html 5704733a631c457f3b7c357809a676f60992f673458056707c8ba60ddbfdb82b 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/search.html a678f3001eb37b4d1aaa6bd63858ad376b4dfbdbc61710f511066e689c78d40e 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl.epub 381deea12a0ac4b2f72a8dc4f319a7db9922456143026528689c0f7241c84aab 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl.html 28adb84e92b927dc86dc7a63cc7f3f51bbf501df5d026c3daf90d8e46a56d11e 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_app.html 0be946f230501dca885d83cdf9fa7cc4db5d45364809018cdf7626fae2778a87 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_crl_cache.html 5eac4f3e1c44dc953a9c9ba1c38c5ccef95ba4232cbe618ff6a039050a77ceeb 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_crl_cache_api.html b52db7a03b3795b6925e37bd50c07dc76ac1140e31dd7b439be316a64928f69c 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_distribution.html 1322d2fd8b6b3da777c8f5019752a55d0fe265a3acaffa6ce3a276f34e8303ce 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_protocol.html 5ac0f03f2f62377e5d439e35806b729d4a55e1344ec5500cf96825369ae9066b 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_session_cache_api.html 203b0c2b4c9f23271321cd371d40c5004f18d54519c174c28e3930d45aa3d62f 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/standards_compliance.html 230a480059341e4cdacd10e4421ebfb71b180ff92bbcad46ff7c715206b52fa8 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/using_ssl.html 67279598d5b5fe4ead0265da585a349b43b61cce61f636b5f32ead1a7531ec2b 2 @@ -3988,5 +3988,5 @@ -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/404.html a54b2a67dae41357d1e6d57b05e5b5a4d1952584ba162666018ba64150349ae7 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/api-reference.html c3ae44361feb86afb04908c22359743ca5e4ef4a7c4727ca88f4748ec7d979bf 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/argparse.html 3c35c035432833772e88793ed396e0ad8d191ef674b86dcdfda120a5a5772b6e 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/array.html 014adfa0273ed588c93bbe912712a526fbf044f04280d317cef39338c7d21b27 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/assert_hrl.html 0a631b31eaf55cb70ada2efc762b405926dbbab0cc0fe0aeacfd3afc0ae72ff5 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/404.html bc7b8f28d99626f7663c01ac0430c1da6908dbb9f2725371a6cf23d465d58165 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/api-reference.html 32fb81e2e031b15960c2e14385dd5b87c354d73da27d5bf1a2476da9e5077259 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/argparse.html 2f23e297ebd97c8ecf27065f41f095ee20a1e83d240a65790131cf76166b501b 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/array.html 987d71bcc9e4f5417df175d84146a881b8fbc4178a91d608575b70b80291f0e4 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/assert_hrl.html 1da2313f06ec4cc617e83d3a641c293154c096da0343eb5ba2938c1a2acd18df 2 @@ -3995,9 +3995,9 @@ -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/base64.html b2a819826cf2506f3b1e36570834e4d4e61377f7f98e1f9989cd22809c83ea9b 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/beam_lib.html 0d2590682bc1efeb3473c492d3ee0f19a1b9dd57c56565e5625ff2e45106be90 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/binary.html 6c9411067f53153ced1b1bb47a421c38170c39477a170089432d874ab3c00b18 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/c.html 6d74a93b43c92e5e8df66dc217be42548d1a109aa5d1fdc130fe232075114362 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/calendar.html 340e5441cc708bc11d43fdafcdbd1c0f3405d9cb162cc3f670c10aed2d965f98 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/dets.html 3432750134f9e586c4804e9088838749d64f31ebb4aecab86354e31a2c1f58ee 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/dict.html 31d04f85ac647655b048bf2383a2ccb7efddeac1f46fe70b0b22a6beef678bab 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/digraph.html 3a4c40575a4b9239630a604e5eaaf49eb9926f8d92d69b2b2ea0d01281edea09 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/digraph_utils.html 32722802b2c20334c32334a2de30a7759642648d6a9b17b169bfc0043f6dfd44 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/base64.html 9cf3105178e422c833917253b502bfadf7c1a756df95ac9a0b9cfc145bfb5a38 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/beam_lib.html 872758dab3ee6773179a65e8babfe929257dcb716bc317c9e23fd7471656a682 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/binary.html fbd00679416f127598139d4bc4d293d9e7d06412f32f73268eae8d0936052073 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/c.html ab1fe59a41f91c14567b3d51a7d67de3e94955c68fe8e9bf0c33fa4c94af74b3 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/calendar.html f26ef6aa9b383b1df21ff16a451fe729a0eb4dd576c25a485732ccae62946850 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/dets.html 8ce5920d779b29309861c6057f20d40f031ed2f7b7a1f1d9b58d675a5d5a7594 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/dict.html 01e9318c7f1ab8707d1e582c30e0ab6e67d09fb43cde7ee757cbebc5104b64b9 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/digraph.html 4d0e1789ac4043490f0d0b5265c490d9bc84e284b4c33f92fee262574e2b12bb 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/digraph_utils.html e7029ed2a076f1f2c08ffacf9429d389503207a538810a9b19c062b7202407c3 2 @@ -4024,26 +4024,26 @@ -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/edlin.html 56309038849c3d7b2285343ed5aae7afb7ee14440022674718c3eda678c3ea54 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/edlin_expand.html f4d01b001270b4ff4ce6b94d18a3c425203898b476d3864181276fe95b0a9615 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/epp.html b275f3fb0339d1795b135682190a2a466f04a169de4c39b3993b7bd64b19ef0a 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_anno.html 811da41ae12f533314d99376b87b8f9413b00b9fe35216bd524751887b7a9f99 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_error.html 0282b53c73a4e732f377950c23121fd2356362dc5bd44ea233a602bc2c7ff183 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_eval.html a38aa172ff80153944b39ad89a8f37cd24b32a252f1a85ab73f3b52f6aba1b4e 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_expand_records.html 346b97ef000072a04496afead5e7c35a3c6a1c30c0f74376ee36369716632f55 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_features.html 6dd7516128a616a89318c108bff9e6f234206735d9641d5fcf168506210193ef 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_id_trans.html c6fc6307d55f8516395247cac56314c85565a69118c1781e49b509384041a6fa 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_internal.html c9bbc08ce32c001122aa4c672b90a07229b30df17ed4db4e23a908b10ad580c0 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_lint.html 86e38371f7be7edd609c528a4848535ff86c65c1345abd7f06832100c991b7e8 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_parse.html caf262704405f72fa54e204b97e02594feca12134beeb6fd3d2e261a7a1d323f 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_pp.html d82ec2c8bedc96a3c8afe99ad068e4548dff4e34efa95e5dd4be82a3b85cd8e9 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_scan.html 2a5e2843b3ced3cb497a90e437a7e3c345fb85954e1ed60111e2ed0a168a674a 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_tar.html ebf0be24114cb5da819f31e9ad942d530600fec895bd4e42e77f654b5bf426de 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/escript.html 8251aaa17930b16bec9041c5bfd02bcf1f717dd55f133f81d00290c843745c94 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/ets.html 6c8a3d3e0dc5f61458df30a343a58716507098e93be63b219e5fe884958e191c 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/file_sorter.html a6cb9b24df95c8158d009460621767b477266c38cb23624c7b276a0bc925897e 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/filelib.html cc72cb57865b0cd3af89a8926b1332ac7bfb5c261aeaa43d22dc872fac564e5d 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/filename.html 715e7bda1b812a07b0e38bdc0f739329e4081512b3f240adf043bbd958458ecc 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gb_sets.html c8a397125014f93526622b2274833f5a2cb4a0a61c02bfce6e422b089e4dc333 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gb_trees.html acf571df33f92672ddb3fd0a878a57ee0f74621df51a581d16e3d666941af709 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gen_event.html 0639e47fc7b842b02f9a36a1c0fbbd0b3372a073e6f04c960006ed7888fd8ad6 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gen_fsm.html bfaaaef0c315bb9da420e0466e4b635b0f5901463c95e16c7b7714cddc146f90 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gen_server.html 6387e85fb1e3e0f053959ca782bb1b5104300f91cd5e6fb57d4dc77239a3f63c 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gen_statem.html e045a1bca5c254d232d15885d2e5aa8f22277c707dd7a795ecb685653f37338a 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/edlin.html 27a04c4775ddfe2f01c4fbe3754230cab392e67ca09b2d88ce97285a2db878cd 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/edlin_expand.html 628da4fa2f07a84b9331a0b8db6845e611addd7865b1314aac7ec7609ca970b7 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/epp.html 797b000ff88d85261d99361915da955138b5530b619ce3028a9c8bcaf0015642 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_anno.html f5c4a0db83e12ea38cf8d5691bc44511e17643fc2a22621078c72d0c736ad30f 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_error.html 356b9de61813a868fd56df1fd4a3222a19470d4936ac5419aabe4ad9479b754b 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_eval.html 5e8ba06cca1366c15bbf769ddbfd2c7db498a6fc560bce39950777bdd82a71d9 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_expand_records.html 2d7c194195b0fd5e7e650d02a23ce7893afcde1c0e1a6bc1dc4c8fae72250522 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_features.html a9cf99cfc7795c84476bf080de4018116a2961124622605d59e21da8c2a79592 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_id_trans.html d9062adb6296e106fddb21af3f484fc7257f6496702c1c0fc3ef54a6a2c34936 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_internal.html c3be3ed89edbfde71fa69fa8a75e3da4afe47680d8ba57e7b48a17702829e335 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_lint.html bd81ba2e3755f9b8577d81e7e4b2246a8297c50f1c472e5b757c50200fcdb8bc 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_parse.html c4a7efcbac9f9113239eec36ecb0963a228175d6c45323d3b6d8209cd5e9a24b 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_pp.html e1fed9f02a60a4f1755a8c6049a73c1e1ec22c649d8a09df2908e10e80401b0d 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_scan.html 90cb07b0c4e200166473ea4021038a7151d78270f934aace41fdea7dc81a8dae 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_tar.html 4828356ff39578835209ba64c867aaf5a9284db69285db2ea2fcfdb19cd8dccb 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/escript.html c2b27acba4f009e25665b6957029168b87ed31c5b87c80013e26bd3bf53ae7e8 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/ets.html eff2bbaec43227a014f331027b4b9153104877444953620f63ef61341d353a2d 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/file_sorter.html 0cc72d761ae77ded2305157319cf426fdea3500122c77b09a1e91dd7df075d43 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/filelib.html 02ef76c2dcf5a91839ce3d9e527fcd59f48e29a4be48a68ee1376c9cdcdc40e8 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/filename.html 557642e31def4cf105151a784c6597b11b79b60807c1a5c8fe77e8d7760919fd 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gb_sets.html 174dcc4b7ed28de756a9ce8cba2942001c540f1cd55384c8024a36d9bfa8905d 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gb_trees.html 5d4dee6521bf2e4b53789e7b44ad36473a5c406bdd5889fde5ffc80b7ba7b249 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gen_event.html 4023ae19d6798a367a9478e91a17967348a3cd433768ee7eb8f6889aa050867d 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gen_fsm.html e6c6b842a19e5ccd75070ed2dd5f63b2a5c305f51ef5b62a7a2f75a8c5e958f1 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gen_server.html 365b0ea33a57ac6f9f31866c9cc853c28c587668757691c65a7683be63e4990e 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gen_statem.html cc794b87f0d1d139571d563abcc9c8206f7a2aa1348eb6a4a509589d93511dbd 2 @@ -4051,42 +4051,42 @@ -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/introduction.html ad2c43db8a497334a41fb0ae717ba3dbfff2d83f29b52198a9d1e11638f00e06 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/io.html ca7f9fc9bb6e3e796817e4b7d6435bd951ea7009cd579ea9dc065c59b8855949 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/io_lib.html 747946df45311aa79e70c49c0f5fee7e58b703463b662b4edd3639dada622a12 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/io_protocol.html 766ada0612b07e750c00203b47e4ba19b196287161dce7df1e8ba52cd5d68ff3 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/json.html 4609cabdea57f98b4e1eb6ba1fa709a13b8472d63bbf31c5a6e66a378097f1b8 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/lists.html 881641cf8d2f78fc153998a95fa95a60ef264493c6f549c45c20431c15eb0c59 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/log_mf_h.html bc221753a74b35e0e9bef0da2608ff12f2a5e0dd503852ad5c44d6c6d9520bbd 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/maps.html fc1bd03c1afbc918005e060532f7d45749a7b681549f644cf0baa3d860f0751f 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/math.html 4b572873e3d31a2781b975623da389af5926768dfb5063b4f60588944aeba2e7 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/ms_transform.html d0b5d2bdb0eb7caac991a22842d87808fe61978877c24eddee8f1c15d4d78e42 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/notes.html 9bc2be14154ee3471b0ab15b2ebbf01e58449a4ccff7c6b7adb0a5d69679b034 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/orddict.html df25197627aa037e91844805122547d3e6613c82b03dc03c19bacd0af43b0e7d 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/ordsets.html 988df8d68b4c8ac885ca7c05eb132903c0a18369da94447cb7267e6ece4d2cc6 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/peer.html a8c6cb7750c27cb827d2316033e5f3256db37eaa60b34b940087e622115cb214 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/pool.html f021b6822193e9cc6f8f3910b59eb7a2840b59b74bb02398f423562c9ef5884c 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/proc_lib.html 8f45ce8cd8754c5ae082af0a0dca3e7deca71b7ee0c2cb6b99ef148ffbecfe42 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/proplists.html 06f18d5c1ae2bae11c446df6e720aeab3b29e1a392d27f016e64ddbc710343e8 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/qlc.html df8e9c8d3fa26704c8d8654132ac65d9d81326cee96bb282356b632bb8363d80 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/queue.html c9faee669b1ca4a0ba59cfb99ed5b6c3dc14dae8652ed173634e4d12386d632a 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/rand.html 68f6f0082f4c61f92da32b0e7e172bdccd45aa9d966b9fa20afa760080ca35b0 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/random.html 88228e8c02e2f8653f42ca93722030f678681a5a169aedc06224d94396b98b0e 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/re.html ae9f642eb98d9b67e7b2ef7a5f4829f61d393c173a5c03262c5561b089ae26e7 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/search.html 7f1a762917cc910e557db16fe3efd35bb09ebaed8c80d0638ffb3ca050da69ac 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/sets.html 9981bcdfef8185ac57080fcc93b951813aed0abf4d80263d9b8f668990f3fe04 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/shell.html 3814372dca81e9c9e484c6a8dd1c61eb75b5d7e81fc251f32d68e35d2143b568 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/shell_default.html 4470017f3cbd030de0f6dd4d31ba273f061966330273dff795bd960ad51fc8ed 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/shell_docs.html f1f7b4c730ee33a9a64cc775bd1c2590a4fbedc2137349e4464ab504a7582b79 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/slave.html a8ff14f05726a21e6fc05bf1c382fa38ff81436b356927d686cbc371d8f48b43 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/sofs.html 0b3b2ffe043a9e8330279dd374a99b469da9c1b4b9ac1293e8efdafa990826ef 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub 07ebdec745f71a70c64e5af232dd1da4ea281c8ec9e8a2700720e22ce1b89f83 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib_app.html 058953bcac5bba06221456830d1cd62c15442d720058b1f12481d6167cf8ebb0 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/string.html 209caabe6a2c5bbc0810049add74c685b98c96fc80f5893cbe586f4ebf17f744 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/supervisor.html 2e3c593816901ff5951c0e21a0afa232d86109b3e376ee2a1170bc8989eb9e28 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/supervisor_bridge.html f8fa5221a91fcd3d587d75be581fd49ffb524faa399ede82b4d3fc03c97b2b36 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/sys.html 10af437aad5e0d74a9804b47d069690e473acd312f6397a81887bb9694995919 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/timer.html 3110cfec4e297e35429ada0ab068309a3981eb37c18669a097a5daaa993f219e 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/unicode.html 38e4fb3498df3569b9f4cb1918b3082cc2347b0299df0221507bb8149483df75 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/unicode_usage.html c735a8dd8df2a38118af385ce152b300777a6375b643e89dc7e14009cabd9c6f 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/uri_string.html b4ebe557db12dc6cf7e73452b156bb542e9561f1eb6c57dc7ba78bf096a6a07f 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/uri_string_usage.html 80dacfe7188abfdd03adc354349ae44711dde6ba927632f25c843a4aef17686c 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/win32reg.html d9464c771466735b50f636490cd7828f0bb88877c0ccd077524f2099a4450f3c 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/zip.html c6581306dc845fda795b53d65ffa38285cdd6ad21f3be0e84287af6aaf3031c0 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/introduction.html f0f3768e62cfbd5fc1bd13c51f1a5113c6d2b00f8ea1bc09240aff8b62460c41 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/io.html fc000cba3a1c06fba95eeb48307910b0d84cbdeb855156e9c61e939259dca691 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/io_lib.html 9ed359cc6a98bbd05e95fe156fdf17436c36bd97130004e7ecff8d1a059126b7 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/io_protocol.html e31757512970e9c7c1d6c9ba7db6a78fe8d827120364ceaf4a3a34db42c274ba 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/json.html 28e6f3c4c209844eb0b1e9888859d98fda5de8bdcd36a494455291fa9814f3ef 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/lists.html 7bea7f390b9f977fec7e10946144399ca6ed58414a0471d8bab340b9e5235293 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/log_mf_h.html 4bfbe49c7b5bf3d3111feaf7f1b832e5770f29561f2b3d96f6b7d18e0d26f4bd 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/maps.html e610a33da4975495d50ffed2adfe3f665114706c3d54b524f1100d16c7989351 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/math.html ac304d5ba9cde815818b8070d68f5298f3f1fbb719a2aed448ae84aec3a88ebd 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/ms_transform.html 6aa12a52d11da212d374c1b812148f661193a5cdfce3301cdd1853081e31231d 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/notes.html 720a8176031744db21266969b686ff06bb19c95d1cc5de86d6af663b7172b20d 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/orddict.html 79d8ab65c1b7dc5efb3dc182c17b5f749b5b012a7deb6a215b8b5d88f6f04969 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/ordsets.html 3a4de03b99dc1dae20176f40284a192f315632e7d2539e1280d5fbf410b845e8 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/peer.html 21a548e2533a75feb47a421d958979af977bfd67400969161cea905f670d1221 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/pool.html 8f2a73b0d790cf6eb9330fb0ba2aaf0669a8da65e5b91c0dcc91a2a26d216dc1 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/proc_lib.html 7e5f9bf42f04c7b4f4becbe3c4fd6198679de73f327fc8a95dfe2b6a343735cf 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/proplists.html b361decbdfc403e2529abaab2cd58ae4939c8567ac364c5bd708e94285aa3d8c 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/qlc.html 2fc69bd1b76878efff7878df96baa42c1ecd10fe65cbe9b8c84ae84c38a6f910 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/queue.html 61827e09000de35012c12690f38cf226c84b1416ce628a8631ccf58705c38c65 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/rand.html 367d9216af4bda7e854cc95bc09c4da2f1f45cf2ca645dd06046dc43eefa2968 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/random.html 1eafb601c8e986cb8fc68bcdb5dc6e1bdb71b64799d382a734a5e494a1eef28b 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/re.html 6238e04bd28001ed5314f38b01ff861545fa3dea4db5bd10c0c12b7d6439925b 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/search.html 4c7138eb36fdb64e2b76e3e45b978031070ef88f0aac4633805ff4919bdcdec0 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/sets.html 628955c7c43c27c1040bf95685ec3e9ab97f994a1879ddbe37c5d3c524486747 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/shell.html cea8dd566630963c85a7257776c905bd30645bbb56665009949a46cebfd430ee 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/shell_default.html 94455862ce893b3d600aaf4c872acdc4e5ca3624c4221ff6c4b9e279da499313 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/shell_docs.html 2eebb4971758ecc96f61bc823a110014b12b5397b85eae0a3d55724361399b69 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/slave.html 7944b9e68b64cce144a9ee023b1277a1bea4f0a6f5efc14b434850f0f7d3e553 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/sofs.html 16329d00bf4b4aa6b4f07f3e708073ca5f16bc4b0faef59c0109428e084636f6 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub 438a3e04f4fa840df391358296e258c68b5cbcb9ada705fc232d163b2a5239c6 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib_app.html 6d93665a6c787e006ebbff3cca3840fc469e56194f6a2e7ebbc77d9bd17a6a0e 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/string.html acafe7e174942cdab6ff157fbb1c1800459bd3f5e398358c70a806423aad868c 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/supervisor.html d0e0592c8d967ee3c991d00300786d92cfad9e6a729078010a124cc82edcb876 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/supervisor_bridge.html 21b06e29b2e95c758cb7678c80491a3531d01122ea09ee485f9b4515af8a284d 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/sys.html 66ee32e699806a49ce2b0d8916cfde21a48781505a9a4c10295eec03137b7f84 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/timer.html 7ff9d7271488e1254de364a467cfe247f38c750df1c8739e7f5eafb0e62384cb 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/unicode.html 01a25c15e21471779931c0426db8f0c50761a67689236df7e8a48e5a30e33055 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/unicode_usage.html 992cb5c2fce5e5593ebdc4fd4fe9463adc99b4176b556522e832c3b55f2e40ee 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/uri_string.html 3125f564b9673bf1dbc661a3f63d63f3222f2cd8ca57b4d1aca79513caf1df6a 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/uri_string_usage.html 6cb99031e245352c4780e1282427df7d3ce5895456344c97ad7c134e89707325 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/win32reg.html d18b4a8e4856150ecb6b0f7e23e4d09e2e4c2fb55c36bf50ae2d573df2d16636 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/zip.html be411beca235c940e4806ce5e90ede7be4e7bb070bc46ec6d4ad2f91fd00c0bd 2 @@ -4096,2 +4096,2 @@ -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/404.html d57cacbd04e9a0dc839d05bff3e27867d7fe3f8f0ccce5c30ac7862ec59fcdef 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/api-reference.html 90ac8f158522699ebcdac6ecc49943051d0f860c0c2d487ec9644916302f29f8 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/404.html 5b2087548a6e7a1454c76f29ed14ccdef8aad5c090fa13f4ff2660e2e8e71cdd 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/api-reference.html a72a6124a0c3b639fe325c58ebc0dc2aef740a6de49b010093be07216cfa6acc 2 @@ -4101 +4101 @@ -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/chapter.html 552ce7540fef5009ec77f4feb7ba9ec1998949fc923cac7737d8523ac928145c 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/chapter.html a630d0870db1344ddba83a5b46d9a20b798c49703d77f949863ccadcb0c93dfc 2 @@ -4122,6 +4122,6 @@ -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/epp_dodger.html 58699b924ce0e34c8e6a1c2716a7b0131210022cb8fa18853ab547307bfddea2 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/erl_comment_scan.html f5a65058c65e553aec70f9c71224c32f288dc758ae71b05be573fbe716e72a7f 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/erl_prettypr.html 963ca416fa5a63d6b319d68c876f70e2258b7901bdd751a517a337e16dcd87ef 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/erl_recomment.html 92290008a7af961e83f74d7d55460fc117745d374eec447b79f089f5f2132fea 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/erl_syntax.html 3e67f418b3f3eec32fff467efebaad4d265c16f4f3862f635f3cfe165956ec1c 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/erl_syntax_lib.html 18ce4c65f81f965ad3d4d5fcc45a05aa4a46bb8d2311835f095e9a6c718794bf 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/epp_dodger.html b4c98412cd48e5eca08106c2cdb981263c310252c7727a6ceefdad31d3e8ad64 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/erl_comment_scan.html 6e0f7f5021429c9348b189b39b63885fcdfbfada6d4192db1fcfea0d8d173d28 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/erl_prettypr.html 16c804c3e7be16df4db08ebab52dbc238ed61b9c5ae45b0956b9ec467ffb3e5f 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/erl_recomment.html 180d9aa7c9780ab9c48b7fd75268ed0ae69a749cd8deb511d3c98ccd7d527cc5 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/erl_syntax.html 1468099d9f81f995ecb45160f84e76a1e1ddd10020514c9c6448b05cd28d844f 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/erl_syntax_lib.html b3b842291e388e2f1bceec452438d1e7a803221cf7e388964e42d629813ceb8d 2 @@ -4129,5 +4129,5 @@ -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/merl.html 43a11505f518fb488d3c159a3b3b7c9bc4a92659c85ad24fae4ef9bcfe848b2b 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/merl_transform.html b4fb545acaefd6069d4af017ba4b011b71481ebb32dabb747ebea255b60904d5 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/notes.html 63901605fe0591af3fb1e8691ae56627dddc3177fccd2a9fff2a2e76bf968040 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/prettypr.html 8171973b08a3f2d6a6268408668fb1cd766c7c1a3e2291f85a01c08edd9d1bd5 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/search.html e9088609e02228929e90514b2b726951cc4e1d763a32c09be2c78b4e7c9ff5eb 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/merl.html 12e131f8935143fce071af63b67262290e4f1f0b5e186b9453a03f89d697914a 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/merl_transform.html ea2cd70465275374fc76e4e092ed478bc2b0f22ff3b80a970865df76a82baa81 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/notes.html 8937ac322485ba07d9a16f6e8fd982ada43dc7f2bca9336e30e7b54413ce3d61 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/prettypr.html 158ddf1c40182660003bcca2a6e794f0675a34543045973d08b6b178814b9117 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/search.html 910e2e0080fbd7dcd486b45bc7a67ee16c4860d37e85deb9196ace5862e69b07 2 @@ -4137,2 +4137,2 @@ -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/404.html 0a5b79a7d3515958bea5fa2b54e6d6411443b4a12113fc5d377d970d0a958ab9 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/api-reference.html 1966056e04e1e63e839620d22628a2a5b25b5aebaf275fc9db5b2d1b56fc5602 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/404.html fc9c473f6a91ed6b456cfba2d34bc1e5d95d85d28d7c454495a1a2adabd32bce 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/api-reference.html 81bc246909d84e39f1515545b701fc7433a0659a6a94d70ac4365dd0defdf348 2 @@ -4161 +4161 @@ -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/getting_started.html d766b0ddd677596ccf33270953c265e1faf53c36f7b6f7973e50d2e4f66f320f 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/getting_started.html c84b1c90d2d4e7aa0354b54a5529426773691f5728cc6f5875c9da75581ef9ab 2 @@ -4163,6 +4163,6 @@ -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/introduction.html e082a68194fa5f9051b2c0a3ab073d42fe5cb8012116fee28e2547f656822f40 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/notes.html f7fecd8175d475bb56a12c249691aa42c49c27d1e3a342514c00b3d022c53603 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/search.html 58727dd363aca6984c649244ebcc7fcc16e64a9ff6de69df3d838622ff61212a 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp.epub 3c2146e020e8aa07858f460844a737f31064dbe2287b294e1a982b1c42cae20b 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp.html a9417a15f003ccfdb1c7457ad7904e980b0510a198c742f01d16072313d5d45d 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp_logger.html 95f123059e391fe09f15a267b7078194210ae65040a98f1d9358743e71cb9891 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/introduction.html f9d603a0463449f6f59125f3ba28579977968827d49e29646845cc2f7b28ef51 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/notes.html ee1eb20929b222824891f7d97437e42969efd47aa6ac9fee88c19457587cd445 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/search.html 07899ff26577b5a589eba22be2aa632288b5c53d0e78e89d41c2a693fc690c05 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp.epub ec5840a232fd6ff0a7bdbf06a1424c1fb74170f892e5ab32c3b00b64640d5989 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp.html 161411f62087185153e3a5307dba2d3ed951557d3566e657b224bb207eedce2a 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp_logger.html feca4e1205c7bcbbbc9f04101c23b8423a0b9ecf3c62e7230ce7d3389ad1a372 2 @@ -4172,2 +4172,2 @@ -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/404.html 4906f54689712027031d3f05b9f296c4d7b341fe07e282c1b883d0541736cd69 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/api-reference.html 389637c16b5aeb9597a3aaf596cf61aff0f2da9049ac0b03177bf473044c23ff 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/404.html 68aad152a2fb8a3f3f4d5d514da723e7d06fa454aa14ac64dfe4d1a2ec0aec8b 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/api-reference.html 0efe61b32e1eaee69c0dd67ac45b16ff55617594571423ce7492563e733d900a 2 @@ -4178,4 +4178,4 @@ -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cover.html 0e1ca836f12736c43021a32a42aada7a621cd71f1aae09c6de5b7c4611f5bfeb 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cover_chapter.html 1a5f123d2a28f266438f7589c54848020152bb74be8291e4a3a269acf41a5050 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cprof.html 02a86352feef420b815b1743346c6b77137e51ff1af98cdd38824d9101e7074f 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cprof_chapter.html 5f4997f43b689151ee58dd9815f85859bd68e97d3e2b2e56519b43a31c8dd91c 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cover.html 9ccfc8e781c7325b5e9fc9390695b14e3f4717c4b79f56dbd7b8b30f66721db8 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cover_chapter.html c2ebbe25681cbb28de7f4b64c3b8e5574510a2ea9aac57c6b635441a57771964 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cprof.html 91543ae44cc8061f2c1d72e78883b8b338143fcb25057bb6340efee5191557aa 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cprof_chapter.html 5fb3fdfff09d3b1e0486183601437d32ee134cffd22a6017fe09ca8f1e9298bf 2 @@ -4202,5 +4202,5 @@ -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/eprof.html 24c699e55be3d813afa5a1b9d19a2f32891ff42683e14e9c7b81d2fe1cb39122 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/erlang-el.html d2273003788f1c110162d670d3f1aba77f744f77bf4f6e2ae7f25628ef10f319 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/erlang_mode_chapter.html f7d74b3552a05e694d7f0932037cae2628d06f290de5ff8006e57ea5892fb649 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/fprof.html bffdcd7f376e01730df7fc519eeab60ac0b8c5568935b216e17231c352d0ed9a 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/fprof_chapter.html e21e80568d4452252ac085ea0d95ba76fc7a2214df9a51ee143aa477e8d62f0c 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/eprof.html dd8c4f93e7cf66f64eb9b14326ed43f1a8bcb2364712ec7362a7fefc72633e28 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/erlang-el.html 59ab0c3af1232353855915e3f2991e587bbc53e4d61ced37a8c14521e305a734 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/erlang_mode_chapter.html ca9de9ed5c6a3a81f414b0fc1c4e5cfb037ed01b23742bd19d2751ff85a6bce3 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/fprof.html b11797f58264786c9e206b29d2558e5cf93df1862a1342c2b1a4368b957cbded 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/fprof_chapter.html 141340f7fb9bf25c7acd559e345f729ba88bfe0eae8b58c3286040e1064e7d83 2 @@ -4208,10 +4208,10 @@ -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/lcnt.html c311b476b40f8bed377a32d629fb0285778b6dcfaa072b7b6b1ba305dda44ae7 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/lcnt_chapter.html 2683492d0ee8a99ee9dd7cb534826f409ecc0493a871abce95d38e478dc1e5ff 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/make.html 282a0b0dde0bec0a44a5272e9077277f9cf428cbdd43620cef5d0893ec8d8034 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/notes.html 4eee5ae4d0c7ebc482bf17ad9c83fceef5c412f88cc67c40c8f2fdbb3d92bdab 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/search.html 1bb7f1142c2b88c0057016ca7751e25b170391c872f0e9a65a3960e395cedfd0 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tags.html d0819659980bce59275849606eec1dc98040a22b2b769f37c917311de502210c 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub f43e3c80c6bdc3a4952d84bd634e6d68c1d68f968bafe2c13c0a79b133db659c 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tprof.html df20358c2a8ebdc9a4fea29e1452c1501f9ba4f840bfd4a766eea8cf80407bbb 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/xref.html e16d0c355c08791129999513d0375ec0410c3c86165fadd0cbff68ba5fddb547 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/xref_chapter.html bc5ec7fd3077ce6880061ea2120aa558b8e2a150d1a1c7de7b8b0a623bf594b7 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/lcnt.html 00007c3b7f94746798b0203d2ff3b7c1662572f86b21322f4442440616a20e3f 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/lcnt_chapter.html 7f984eff9931fef9e3bbfdb2476f49d29df00c95ebcda756fd9b5fa6372aa780 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/make.html d019e2e31c93a80526420b8d2e10878bbe830c974eee44f5bcb4f603d0a74ed1 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/notes.html 221c2a1b2f48b10537c5f153a4d9559e7976af919098cb6f4109d1ef0f6dbad6 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/search.html f697ef27ed2d79cce9684d2db9f401cbcbf22b2b26f909d8c3f94981ace53cac 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tags.html a866beafec0407a5b151b96eabdd67b52b587bb2dd87d9e40f5ae3ab1cde04ea 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub bec28a6f5ed45c7a1e1a1aae6ae62e9ff5d9deb4b949291af54b94e411473185 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tprof.html dcf4bcc7210f2ccfaed9fd9134951efacf2532ac4264dc77de4c594231e3e275 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/xref.html c4e90ccc21524f0fa9b9b38069c95c330b851964e7b38bb8f1c303c5a3f39530 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/xref_chapter.html eef60a02b2e727f18eaebe4b743891b7b10e8faad4381232c4b66287de3a5a86 2 @@ -4221,2 +4221,2 @@ -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/404.html 9bef37d2b1cbac3377e4df938cad9c0442a061af786d0d0f644cbf8dbefa3752 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/api-reference.html 23dd9945d95e1ba106498eb14d8fe5eb636a7b87253e67b5eb9f0fc3d83fed22 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/404.html e83a9f277eae18c3f096cbcff4c7c5587589b15d1993b3c95a90a3b4907dd910 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/api-reference.html 9139915089fb12f68fba665b451ce83e1f573ca1c729c054b79d04a9f563c53c 2 @@ -4225 +4225 @@ -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/chapter.html 6e5e8560cbe3332d461bbd9d81d22d3695a1b6fd523ddf694f7c23f9b32f67a7 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/chapter.html fed884d0c6522ecb45f2307b41a585a845349c77854ba017a360b6abee2682be 2 @@ -4246,2 +4246,2 @@ -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/gl.html 3a15406385bafc931efae3909309c64a7c269f92321de4b7f932b81a96a6035d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/glu.html 976cc77572bcc70fb6c0f827010b9ce3be0684f2e9b0be04252f7b06658b88ca 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/gl.html c870faf626fd3870a26fe560e28a5c2eec4d06648e7d8075fb24b2e80468b091 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/glu.html b32706def6d38be58e2511617153b75e2266c6045eb0a98c613e6f796f86cebd 2 @@ -4249,239 +4249,239 @@ -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/notes.html 2711b0f5525d4caf1e28eacb260fd03a205f7d38f6a03f09da8d458865cef375 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/search.html efe67e75f7aecff95927fe86d0b72bae6629516a96c64ea116c094d7441e2396 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx.epub 183f4ea94c264f5b598c45f066c203cf2d5360de52ff3b5af894464be857d6ef 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx.html 0775fd51874e61210099e6999e7bfa93884386caa6319c9d282e92d5ef63b523 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAcceleratorEntry.html 786d20753196626f19ea277ff7047343c0d1a17fba80047f8345ca9952bc1c9c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAcceleratorTable.html e7220f220faf4a65a34e0a1d9719dcadaf1bc9af301844e66490f81bcbee7e41 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxActivateEvent.html d6a5d475a1376ba250ec54dafd5b484fff51033c3fe3dbcee4145b43bee98a10 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxArtProvider.html 78b1c0a156640975db2e84d1711b011316007ecbe0a3afba76a51294708015d1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiDockArt.html 776ae7db711194dc2247c65b1dac25fba4d945fd74ab0cc2c4119cdeb2d5c13a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiManager.html 8d7915b9b3617fe09b330625dd59ef6b08c6b8025d8e7f87c288222ccba23121 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiManagerEvent.html 1661cdce35debbc707f731d9b2501f68b996a97a3bed3ef070bc8c23b129e262 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiNotebook.html a122fc02e79b2562f5518e27c9b2941d2c22cec496e91e808f5ab65aba37f5df 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiNotebookEvent.html 7f3b6026bbaf7a8f5d3f475736879ada41cb7624093f496713fa55855856e21d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiPaneInfo.html 7a3c2ccf5c2fccb9ccbeedec6b1fe7daa3cc021fad446d9f2b0eb8b8dcac879d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiSimpleTabArt.html 7c4e0388e39092f37c2277d4a6718738ffb2789363ae8a1d6fa02c2ffb87de29 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiTabArt.html 922de478c8b38ea94e60f87775141317e6f8e3fb85f76c4d88ceb09dd7296425 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBitmap.html 337ee1dc9a288f8114dcd2ecd6d8dd3cef92e7cc230f4865ac39c4245a712b98 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBitmapButton.html 17d77a83df03b7b1fffcc65ced5eadf936b2c5323df95235daf50b575a2abb21 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBitmapDataObject.html 0d7582ac2ebe3e417e9c8502296f8285c38cbdc05e7fd1509713ab54b1bfe12a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBookCtrlBase.html 014bedee5694b01f2e00a58dbc5a4b1552a0208a276670e10c98f3b7d263bd79 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBookCtrlEvent.html b32b4c903bd93ba23be1d8a3f9dde68b8f2c04b546039cd8ff6ffd9459026df4 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBoxSizer.html e9ab43f77a86a0103aabc776717e73a8a583173f715d3fd118d195b2ced6788c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBrush.html 14d323619ef6841f08debec4bcd38d6cef1704a6bdd0558789c749d22d4429fd 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBufferedDC.html 7988e4ce84c191ffb6282b0789f4af5f3a5459ce6dcff07662919191a67ee458 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBufferedPaintDC.html af98a9aeb3d3d2092763562252b71243c2a46ad4c2d692803396eaf64082ba0f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxButton.html 3f8215a68274ae289ec9bded50a74b937602086a93e3d2e6b61eb12b0993c53c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCalendarCtrl.html e1e03c866baeb4197af4775c60ee82df753fa5d28d537f31772761ae4c23ee92 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCalendarDateAttr.html 64517287c4935d6b700cd8b6b2be163d533109a21126ef1fcb4113d889798575 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCalendarEvent.html 0f87fb4f25b4c8bf8e863ea0d2af0b5baf807934004b07115ce285ebea42165e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCaret.html 2aff57e8d91812fa5d86625b35680f90e9c7ace0ecdd90ae3748268c7c085c30 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCheckBox.html d89810acfb4b7ecc1d1854294d59a992623915171cd078e1d27f10663ac837eb 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCheckListBox.html 22a95d4c19a56e7a84154d80fdd05ce1df966d3a927bf6a76fd46c44b6f20a90 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxChildFocusEvent.html 70dc943903c1de879b4f740721c5cf282f54d8a12e3df1f388ede5f8848cfb86 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxChoice.html 9db590b95d84f64a96cba2517360cab8930a91297bacefc5640b2c4400bdde49 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxChoicebook.html 43b35bf0d6af09c78775b206ee6498f527f117382f8533577f8e9ed2d47ae452 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxClientDC.html df5f8ae8ed77217a6cff3e03fd433d68efff34df5171ccb385e9efbc61690f32 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxClipboard.html d2d2f935445eb9844cda4aa5b80f0966bb5f0591d4540ec66e1edea24087b156 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxClipboardTextEvent.html a0ecd9893ad256feee0a9eb7ebe087211cefbbfe10a8de776df4373a323db36e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCloseEvent.html eb68f6e293e295fd79757720b346f59982f61223725d88679c94ecf640f1cf0c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourData.html 384ad906ce1c4ad79515415115f9a8c3a2ba66ba28645f3a7fa38c531d3c029c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourDialog.html d7f93eb74aca641efb23438a6e3591084a1ecc01810820f3ec3b6d9fe81890da 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourPickerCtrl.html 39b0e6915a74f39296dc51e8c6e6143ffa7e575105e3679ddd686e2880f8222b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourPickerEvent.html 1f44904253c55f505b68096980af7c7c9b2ff760a3c0962af8b262f00315e3b1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxComboBox.html 4b70f0c04cedabaadc917a0b4250283ae1603c02f73cf4d937bc4485d4d16b0b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCommandEvent.html 0e43a12f6490c72cec0bcae79f703fd603e4866285d3a84ae1cc178a64a5cd1d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxContextMenuEvent.html 0178380fc51a22f39d74981174ee19f251a6fced2be2a8c76877204252fe81c7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxControl.html 49e33b64fc98bc3d56427d22092031037564fd4681af3d883b48a5706c2c0c13 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxControlWithItems.html b42e7557eaf071f71a119f7a9ad36e2791fd6337f189fc25af65dda3c6afc06b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCursor.html 04a92edbd89aa9d9b2d71fd5a929a3c11c35bf1ea2526e5e49a65e02809b7af2 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDC.html 833fa867d18eeaaf731e4eed0baf38db1cb3c1323462ef3b8705bd0cbf9335ba 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDCOverlay.html e8031dcf8ee8453983069ead3c61ac739854b9173ea6d80b869f2dc3ec0899d9 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDataObject.html c01b827a4c687b4f9b8b3a7218d2cee7701fbf258436d8820c00bfbfbdcb2f66 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDateEvent.html d2b0798a05edf8eb636e133be7a94b955ec5f07ffa1e210c337e42c19edf18de 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDatePickerCtrl.html e96ce89e8dbd8f26b87355451722f7e9ff8f30a24c8ec09d2700199af50d7762 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDialog.html 84b9052c48c02cc0aeb3eb7df44452b5958a956666c6143c9aebdc97eea74d85 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDirDialog.html 5e1217245a6ff8d6082baf4e357a2f041ae58f634b40274cfff4977d8fa040cb 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDirPickerCtrl.html 717f1258d2d1a62e6de5b5431f1fea09834fe5db2ed82bdadb6bd2792d4c3dc6 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDisplay.html e1d607df6936cd7e10955f6e2be147fa86e895e25e8c3204408d4ca6c386eff1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDisplayChangedEvent.html 8028be3e6f7beb9287dca54f1a7b133949c815f5bfdb66088163cc333089704f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDropFilesEvent.html 36e89a7a79d4360d43f6d54af934d74a46d576013961c83aa0211962c667935c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxEraseEvent.html 590cd45ad92cc782b377af6cd273cb83c91401e176788bd1611a864bece3dd2e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxEvent.html 5470b8629099b1e39582f7194f7315eec3cb697c7d714cc89da851d30baa943e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxEvtHandler.html ebb88713bea0b7c183b668be93aa863eb4987ee68c40aee969291b50bd0872de 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFileDataObject.html 8a2d5f5bacade6a7f6c028155b3e14e6f2b555847834f853651a1eeeda05ed9b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFileDialog.html bf01793a384158826baa4d61ef5fb3e4282866118bef1059db01ce169fdfcda6 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFileDirPickerEvent.html 663ffd1e15e42f71be90ca8f218b4fcf1addc7750dc81a95f5b71c6023ede7d7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFilePickerCtrl.html 1c6a0161273dfd3759ccd9811df3aeab9ceedb6671017a92c8ffc6b5157cb296 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFindReplaceData.html 9ccc7fadf833d04c5d40be8a841d556328aff926cde0994acf8129b35ff130c3 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFindReplaceDialog.html 8b12fe835ed3979d04887c78a0dc037fca3e21c466ae10163e89b2c990c88534 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFlexGridSizer.html 140a2cef2db838a6e3cae1c8693254573f70785be16248220c48d6ae42d2a08b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFocusEvent.html 255820318baf4dde815fffca6c2f53a02ba99a16edffd90562c21579031ee147 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFont.html d5d5772eb8671164ed23052c557da492ec2845449486de04b6281af280323825 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontData.html f08c2e9cf9c694d7d587065b9c3c73008bad148c55d237dc8c1cd808631e1851 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontDialog.html 6b78ed9af07dc424874af821335da71534c7e817864ee7f9256a003a461efc75 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontPickerCtrl.html e365fe89baafd0c9d037aac390ae25d1b9d3ff9bcd9e1de3b29c074e8b97ac09 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontPickerEvent.html eb5f48b038cfd0252725328dca37733dfd21780f12b6b8edbc840e29b6127ada 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFrame.html 4243752d8e644be01808933cc23bddc7c8d40865d9dc915e3f74793886025f92 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGBSizerItem.html 8c50357634d515760c0b2bda318d7383a00226c955d3922725473d1195bf4e6f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGCDC.html c9b61dd1cbe0ed1a074545d98405bdea18a78e8b5c2623a50b1b8bce81e98f8a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGLCanvas.html 97c190b3b175dec6957a4f079ea13042167fdd6f3c30805ce08584706889a3d4 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGLContext.html 790fd489afb00afe0ad0de712f9ffc4be2b6bbfb5dbb7bcf5c497643601ef7a7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGauge.html c688dbaba1f415f28dbb6aeccb988552673c915c411dea91efa43a07b2f7bf42 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGenericDirCtrl.html 41909b8fb0ef58a1e87520632e296fdc8eb42e5e0775f859b9c6cb05bf3901c2 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsBrush.html 68f08bad2b9f89d23798f4fb01cb43a1b9e969a58748aa35175cca107f5d2f5e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsContext.html 233573c9626b26442ec7d7e3dabfc9260a3fb8f9a38cc8f2885e452bfad4e04c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsFont.html bf35d4bfb35553d877666b0cf68e6a4c25cb87311f41a95350834506c8ae813a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsGradientStops.html d529aa33e19baac0986ba42defb36f09e62c6123d12dc9b0495a6ac7d5dd3ac4 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsMatrix.html 3e784b3259027505a7f8c40effa795a248844b7574905f7227f5155680d2bb66 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsObject.html d8d17f9f82d61e5b356cfdb123c7158658f83485a3dae46b0fdd83ec5f353d92 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsPath.html 8d20865f45e021a5dac92a44c15a7203b8d0c602673f536fba5762bf45256abc 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsPen.html 6eca7529875d9c66e4dd05f92c5ac9cd4fa969bde6632f84f38cdb5f22b7cae0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsRenderer.html f22c299f6e6a309bbfc28a4f22a3790187d0b8f79f4220366f4f0e3ad0a94d49 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGrid.html fa9486013cad7230ef0e95bfa5f76f821421731499b1103627302b7dc58fbc54 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridBagSizer.html 3b7c99227dc8bcdf3b5f344c76458c98a3246150c116791c7d4d69914db09647 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellAttr.html 40464bccae77550bac87ce93e28cd23169cbf4de4f99143a85e116e2c97e161e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellBoolEditor.html 61918cfa3801e9600625917362db3ce57f297539c23702d776eb45eedc3adfe0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellBoolRenderer.html 37d0c43dbf3b0ab95c8d2ef6cbf6b750d140494a02b9be292926ac2ff5ab1ae8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellChoiceEditor.html 58ee3fbe778a8297ba0f5998877b0808c85693d0737008d4ada808899b0f4d42 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellEditor.html 0b25b8b485f2375d195fd3f9b448b720d4ce750cc1d3f54359fb3c612cad7998 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellFloatEditor.html 19a3c51ca396da71d13918637f024905a0e51bc880ec4eecac92b8263fa0470e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellFloatRenderer.html d13e698c683db2c88401e04ce550115aa31fea3ebbf86f9e6fb41dd33a2e6a91 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellNumberEditor.html b7ddbf43191262e6d80b518e5eeebe4a9e9a8b8959fd42f1ee72ee3b83773878 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellNumberRenderer.html de5d5bb575d4f7b95d0e814cb524b20979186bbb3e4f3238a87d18a0e7479ef2 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellRenderer.html 9dabf56979828ab548fb6274b05450c0338ccd437e6aa25779334bf8f9684727 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellStringRenderer.html 5821a98e1678f1d3d9fcedeb46bc1e549be3efbc99ce1a5f8b4779fefdd56062 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellTextEditor.html bf9dfbf3973db24811ecfb67161b2e8527520ca8a143d24b0f13c6f3e253079d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridEvent.html bcc1832047af6ae2aaf2a7dae0cbe886dc27b9d9639b6cb74419b5e6076f3711 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridSizer.html 85f5a2996bb871bbf6a3a949391000c2e36fc4eda62dab1af7811f693fbf3028 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHelpEvent.html 45f7807015d2bbfa1365503c05baa8cd8f46c24ac01df95bddbc7162eebd7b57 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHtmlEasyPrinting.html 2ad889a30a59799ea9be364478c514e0edd538654f19bda6fae5d235b0e08ee0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHtmlLinkEvent.html d99ea5e3faf636e15cb9027aa8f8c234b3aef636daaf560ab8f45bc58b442eb9 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHtmlWindow.html 461875d6b9515ab61bffb94c5084bcd3bfb863b833c76bdcda947f3e2f227849 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIcon.html adab2ee61bc4d2e63681c9d2b368964b3e11fe210a3d24d0def2d8879a58ce53 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIconBundle.html 3509f38e3f0008bd2c6eedc15e17a5d3d320818bab0a47d4a0228e3a34dc6f4b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIconizeEvent.html 7cf782fbbeca57588fde06732f47066b312b9ccf3fd9537d0b3532b59ca162b5 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIdleEvent.html f8b418d15ef51bccb3618f4f1689aabc332eb5cf97e62e5895da2a9360fee3cc 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxImage.html 8e9a40e3c8d73f0dea95acd3831a7043defd67a68dd5f723fdf7283b3fcb4c8c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxImageList.html 6924101540c0efe38a1e461efe2d73b060cf3aafc2b21ecf3e06730a349497e4 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxInitDialogEvent.html d1d18fc9f91d771a845cb068c23e355ced08da58d210b2b09a341dcafa967176 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxJoystickEvent.html cc2090ab2c3a6a87bc0ab7a9d978566ee486de96a8cfe085ae567fb749269ec9 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxKeyEvent.html eec3f4ccfeb30d186201390d79f56963be8863aef2a70a2b81b8b3b37cfc04b9 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxLayoutAlgorithm.html 0a768f13920b75d841b757b11b689c5b3fd4fa977ec12e7c680e6a2001411b83 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListBox.html ac5036609af577d1f9a5ec5b26e11b910fcde0493af1a290275c8f09546a3a95 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListCtrl.html ed44f6646a6eb8ebc9d90ca1250e070d8e081d49b6156cf8a6274878a0a4346b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListEvent.html 07b5e806b1f1553c913c4d4f16839e6ec1f43f36f8bf5af1b225d877e28ac7fa 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListItem.html 77dc94152e9378d13b3420f8a64222220f353bdffb7d5234615abcb0764d5cd2 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListItemAttr.html fd048c7beed5497ca3fcc7a9b5aae44bb8aa46a56a81c40a61c1a70ec1e4bc07 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListView.html c70438c2dd8eb732a5b3ea4b319f9439f8dc2ad80ed45247b6d7fb852d596ac2 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListbook.html 9ece057475ec8777592aa065014efd7c63573d8e65834d62f2bc099e74d9bf81 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxLocale.html ae8bf59be198ec4c9f647f52b50331e81b75d62b4437d4ce146bef1a06ea05d2 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxLogNull.html 682e26e7f50547454b3c518cee6b38cb048538b8993d3d7a19f7f931f0d5e80e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMDIChildFrame.html 02cc1251a4371404a15f9142bdce84aa04c866214f71f8ee24671e325509754c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMDIClientWindow.html a55556a7a3f6da447e13b925423a25cd8f6081f12f2c6831d268e7f08685cfdd 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMDIParentFrame.html 10f465dcf63faa0325eca42b5dfc40540e8f99475d0d963d7d0b0915053e0d0d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMask.html 4ebf05d396c454481240298c2df9d6930b85e4511684b5242d666e971c85e145 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMaximizeEvent.html f84382cd54c06a811464d22ce63e0bfcb2d7088c665d2c1776f2ba0970e12e98 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMemoryDC.html 45bdf817c07cafc1337eb31e71a2a519732b3c814c87cedba4b7a244dc5c91cb 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenu.html 6099909b365e6d4d906188f680de688e4a283f5d9c090262e365148273826a0a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenuBar.html fcb95430c8281d4a71d4ccf9be3daa4217601af76cd3fcd389ccd9824f34f646 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenuEvent.html c379c10a3d193b27dce6ba46b84d118673d8041e749e6a22a5da1b25f5be40f8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenuItem.html 13371fcdb8f57e3f48bacbd90a1b9fe19a729d1d1575ebe1a4e756e8cda75851 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMessageDialog.html 89a99755b7d3c1ef25609993168cd13b289ee299b5306c71c4778dcf53fc0894 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMiniFrame.html 1b5102f9f6358a1499a05a6948f0b9e5420963dc396e3a38b75e0ba636563226 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMirrorDC.html 0cdd12d7019feabfec88b2de5bbdafc32eadec0d20b6dbb4285299e4b30ec67a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMouseCaptureChangedEvent.html bd0d6dee2ea177bc48c13448bb0211147c700c5f97da1a390eb4ff5f226e1adb 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMouseCaptureLostEvent.html 04f3ba4c8b500444fa7fc87188baf8f4e91ef14818a8df08d82076cd133cfbf0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMouseEvent.html fb044ec22be76d1f5377b2b82bae205146002fd8f0dc3d117e6bf771bb6c3de2 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMoveEvent.html 876b03d6ac7d048e066e637cd25bb3031a35f2fdba4fc042536e615c2603028e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMultiChoiceDialog.html a2777ac0fa6484c851b2039047cf7faac31df70ff7f9bc155f23a6d8faef67c7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNavigationKeyEvent.html 9b1a120cc3f970555aab173e14fa195a9ff69144aa4f3536c7b021e7350071af 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNotebook.html b90d88e527d9e30fb5ba0681069fabaa126d08ec83aef744aba71152e34f52a1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNotificationMessage.html 2e9586662eb8b427bab6d1ef834af567bd8db2c8712ccf32befee9d87f3c9aa4 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNotifyEvent.html ce87524a6fe35e8e4f57860bdc4a3ecfc7fce796a8c7ef9dfd3739e69c258701 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxOverlay.html 6dcc07cfae68d071b2c7a76ec29a054a57df87ebf7e646b88f2caf6b04ee4bf0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPageSetupDialog.html 03ac801874c5d348557a9fd4d5bdd5a8bbcbe0e0771995c4b3e367cbf21ea6cd 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPageSetupDialogData.html 563531fd7fd36b6cdfdd809af0dd4d63129b5453db2b5fb0e5b09a99893fe471 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPaintDC.html 4635db7606872175d4c71c70229e28a08ec3305cb34592a6e5444d6e87a69026 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPaintEvent.html 5f8afd8cd0a6829e65e38672832f12d5ab5fffe1002926be3e6dfbdf8b20dc68 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPalette.html c6f2e1b0671f0c58faac3e26e724f5e6ba094837135d0971358e27edfe322127 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPaletteChangedEvent.html 94a28b4e4b826a857e010ccab1786e0e387ac8973ca7029208ae0e1c7456b868 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPanel.html 7965dd313205a19b9418ce57ac771b49df1881831700435454bf8aa13d5b4d20 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPasswordEntryDialog.html d99539913c29af05db8bc8eb58e76149b5f8d1e1bfee8380667a55b10135fef9 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPen.html 513ebb47b39a172510dad1f9e47294970312d3d4adf4216b2cb8c417b53c07e4 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPickerBase.html c0338eec675caf6c333f207c1029dd7de80a63c99bc63bbde8305fbbe2d1de8e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPopupTransientWindow.html 90393f9930dae59ac808b5db2813442b110ff4a8ad4c0f2242155d1ee81cefaa 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPopupWindow.html 9a6a7dda159ae0091a53b47fbef03199ff2faba214bf692e05ca4f26b916f7ce 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPostScriptDC.html 1a2ff4c720ec22c32374184b88f0dffb0b3c9ffcf5fdeccf1441f5e08d7f69e9 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPreviewCanvas.html de3291c381b51818f5873346fe15130f058bcfc5a2048ba58fc223c2405c1b62 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPreviewControlBar.html d4ce85af2059b100f00f09382b0aade17d53ca732f3c0e183eccb95921fdebed 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPreviewFrame.html 14a9ee6e4038fe22d7acbba6caddfed159e0523ff41e9b7ba2884d1d3c5e00a3 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintData.html 466f2f9019ca5b2530df87814ce744396767e726686cef143a89e033479568d4 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintDialog.html 6892912d0ec75e98ca1f68f79533cdddb01ec4e54b788c70e6b7ff24b6d7e02d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintDialogData.html baf6c0227ae1878062031401e476a1619957e1d3a3c0cae470dac38b520377c2 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintPreview.html 17559ff72d339946b75b53c5ae3b0a4bc4711cf43fb249ba1c72d04790214e9a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrinter.html a04a3955977047933ed0660e09723ca1b6806533090df1ff3b893369d3cae7d9 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintout.html ca293425f530e0fd3e6cace8d0cff57cec585f3100f1804e41ea79f7f2e26bbb 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxProgressDialog.html fb9e9123444e943db055b14ab65a250316fd736fff9d89387bc60d441090a40f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxQueryNewPaletteEvent.html 035176115f858f5af888b61bf4eaae2a46ebc989133a3875f48f3c83c211854c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxRadioBox.html f1bb5a92f5dcc881bfb15fd9fc8793072842fe51644608f16ae301928f6a1f43 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxRadioButton.html 651049ce02332e43502c9fe18e34feaeca083c0dfb5d525b1e36f46a947baaed 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxRegion.html 89078965a5637761d6ab43b20efe6888725a9e432bc3cecf2b57033c00598822 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSashEvent.html a65d634625979f2cd8d930cd555de467c0fab263afefcff95d857e554e4c930b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSashLayoutWindow.html 1b1d0d4ce39784f61bcfec963ac1eecfc1d3108de423ba72d4065b44aae9997f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSashWindow.html 247fe7bad982a0a76e7c9b5945d0a2ffbeed76a12c5bb0699b1e33c88532156a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScreenDC.html b99a8065c33529abb7226a12ab3d68148a082f1cb535490d4ae38f1a1ff44024 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrollBar.html 6ecf1ca005eaf8b70d05b7a6f7ecb0820736d4ea953b7d9771d1d2ea65536597 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrollEvent.html b88dcb482ed66609d3df06602b9d95a522bc8a3a96162dad0a8aaf3218e6f250 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrollWinEvent.html fa173b4691e5850e218836c72a016c15d4af98e26def8191a5846051ae8bb28b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrolledWindow.html 26f97c8c228d853e8d74f88beec742531a63b8436b26c47a441d0bbe7098231b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSetCursorEvent.html 1917e94119010935fc6d3f77584a5d1136db10c076a06042a6856f3e181ad7b0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxShowEvent.html 1dc53b8c174bb60061500b7e4fd0e0460c51c2b7d3adaef521c09bc402fa5f69 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSingleChoiceDialog.html b220385d4974f4bf91865f4893a42286503db6507e6729c6888333ca5226bef0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizeEvent.html 0f78a0efa6851364e7a944625434643601b7379d55d1b2108c66dbd88b63e813 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizer.html 301a246ec3cdd534dffa947d65773acb0b1508127aaf30e26bfeacfdc4b89b7b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizerFlags.html eec751a5a7ee2f94903a66c91bcc6b096b374f29793d92436a9d2c597f09e213 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizerItem.html e42e87fd0783d1352c0696672ae1d7a2985d8dd516056b1bde4a1fb5e2cc60c0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSlider.html ab450d0488004909c8d1fe6c44d5534bac00e01018db941870a6c0b698751510 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSpinButton.html 317f15ce549a2bf62d75fff7fc270b3b047ed702aa2786cbea8c006ce1988330 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSpinCtrl.html 075fb22947684a94c3bc3af45870a1b471c53b617adfef5c80d821192a14cdc0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSpinEvent.html ca2dd573c55f844fc846b59d2b5ab18728011e5e38c935aed394cbf9ea44afb0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSplashScreen.html f5be222beffd3f14fe14f3db0afa0e16002e85a552dfc2e94ef825230ad926d9 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSplitterEvent.html 0b66e0b8b29decbd50ef8b91215c56264e1ef1f3bc4109831da33bf42da3718e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSplitterWindow.html 3b5962883e0df2f4717d8857ed33edd66339bf9793cc3222fd37926f0c138721 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticBitmap.html e8b6c4d751139162d4f02ec8085aa11098981f1c4f895ce4b878b0f4da13517f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticBox.html 9997267be38a047298337f7b964481dc9cde0212615031dbb24aaed709191540 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticBoxSizer.html 56d6640c2a0a05f2cc911fa2265d8b7b9c35aa120f8c52dd194f25634f2727ef 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticLine.html d35efbcd1d709b218616690b48ccd281a1ac3b43f4ff6fbf1eec04b3d425f73d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticText.html 070bdffba7e302fd81be49247e04c0779e4615b957a1c26b80770dd9f2feeb57 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStatusBar.html bbc1825e696abe6520c8d3d81759088e7a8690e89832d3803a50e2e5dbfff57c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStdDialogButtonSizer.html 5314abdd5632bc07d0166320466a6400c64ec12afdd09851366418bebbf33610 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStyledTextCtrl.html 1b7015d6a5b9821feedc24e345795b7747c3c931dd0fa30ef1e657740da89c64 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStyledTextEvent.html 38485478290ed37daec58d3eee2f023152cd85e8890d38bac2277b3e0f2e16fe 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSysColourChangedEvent.html 5955f03637cc18a54f9c7c6a4e95daab0f39254922ffb305f48e87ae07a8e74b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSystemOptions.html fff540923b90a5524aa663819486f0690206353562445cdf10b9f8981051c13f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSystemSettings.html 745d84a42d909f0dfaf9ff393f5aa493315ccc068f209bb5bee1424015a5d703 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTaskBarIcon.html 9355ea2e4806098af339d48fdbf7238ae0f08ea3bb459a07aaed0b4fec52e33c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTaskBarIconEvent.html b8a7bdc73916a7cb6e04811ff12899dced0e760cbd8e15bb1eeea510950a21ad 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextAttr.html 7876bfe9f4a0121626cda1c333f04678fc822caceef9a563fbaa15af276ec3c7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextCtrl.html c36914b148df947116a1a0031f49b2871c4539368274fa39f5cddc64a22b8b27 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextDataObject.html 31dea134eb6d2a18a67e9cecb69f2dee659ab355226982051a8eeac44e7f6da3 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextEntryDialog.html fbc053997ee7b563d5af6eac2291ec139a13e10c8877a1c97691052217ec69bd 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToggleButton.html d23ec0098e10e3016093ab712b0fcef62b04687d71efda95ec1b75cae4da59ed 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToolBar.html e9d0b33c4164ab12df684157c523db42cb5e4a09077d1b1ec499bcbdbc5ee2c3 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToolTip.html 7620205b73527ca96e89b05e6ac9d75bdbc3ca046f5baa32362d3e4f6be299d8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToolbook.html 7d3e0c1841466a8a0bf13e10c61f88281bda99ef4affe937051bfe35d4a20ed9 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTopLevelWindow.html f9d6ebecab4db31c4eba6a89232231ccaa107ab3c653fd07b9d16ac789134e98 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTreeCtrl.html 75e69ae01fa36960470dd26cdf7fc3f599f3d316efeae75a85d85a022eca9395 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTreeEvent.html fdc8f51ac6dae5a2202322738dd92b9a93d4bf641261ccb7f2399ed25a237345 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTreebook.html 05238be71852f0708d7c624b492fb9610496b7740a2e8647cb1fce43d36adcf1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxUpdateUIEvent.html 1437bfd599052808c0b3733778b3b9ed6e9d2503bea9711e56307ee629188015 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWebView.html 1339475f5ec0d5bb655500e941ab92580427a291c79fd6013b300c8f293c16be 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWebViewEvent.html 0304d50645d3841e26899594db16b09c3630a54e0c1bf4d32bd062c7e9b4e6fb 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindow.html af4230007dda5156bf2f55f3fcf373bc1438bac8a5c9509ae1fd3900a4e1c99a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindowCreateEvent.html 2c9f53cc82dd0bddb8654edfbecc1f0bade4ad8498f535947c0d866f4d991e59 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindowDC.html ecc3a931da43fcde3daccf11020674467772028785481a16d1da0c8fe40baa60 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindowDestroyEvent.html 98f0867ebadd160814427243fcf57dd7f04c092ab6e336eb191880bfbc7994a9 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxXmlResource.html 3df9cdad33f90fea7f8103c55a662df4140e1f6e43b3105b2eb266a430dc8ae2 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx_misc.html 927231d4519d9ecf73ce033712c5051d6ef13cfdc01aff0019b02f4fa4c61f9c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx_object.html 77aec6ba28cca226fbffe99525a293261194e85835f520ab63c1f41c774bccd5 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/notes.html cfed4cf4667b09ca1ecc867a7c47db75a7a0b94acf9c02c8a33f80af0c5cfb4b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/search.html 13e3b1188506012dc87f55953ff8eca4b00cd0037210f2eb26a7df264f2fc0e3 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx.epub ab054ae558fbdef2340e35fa3a8661bf397bbfdc5483aa49537444473c1cec36 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx.html 8c2c65fae0075eddc00929ee925854427ed9b7c374be5b3ce02e710c69f38f2c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAcceleratorEntry.html ded8baadeacc07fb2acad5fec8707b622e0c1ce0af3c85435b335f5eec865f1f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAcceleratorTable.html 6467d8f49cee8c11f9e4420d82138ee87095a0be3f4b5fc45f05c9cd4e91de06 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxActivateEvent.html 560abde95a9460054ddd62caf1e9fd3551f9954d0a5f75ed24d9442d5997d7f4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxArtProvider.html 5474edc4ca23c481d11c4086f202de1ed8ca4c367f86a2a6134c41a60efe97ca 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiDockArt.html 97098a506bd32b6967195f573262c5a05fa8ac8982b8e58c2227317fa81a3578 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiManager.html 56352a15e69867e6ade5b026217615f3ff13084e698a4bdfcd9cbe5b9c73478b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiManagerEvent.html eaeaa927d7c566c22b7a924e645c82bea9b12bbadc660b589be251d2d39b7bfc 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiNotebook.html b80dc84157ae4cf1bb365c1f191410aeb5e1269732e1dd3acc838a0b51013e76 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiNotebookEvent.html 25f1ab5226b06970668c6ce3c5678bbe34af741835ef898b2dc6f5e743d1b554 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiPaneInfo.html de618d78eba6bb6dba7abf2043f8a6c6b9dab36199139265d66bf67cd098f9f7 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiSimpleTabArt.html c2ec69808c2c89da79f3392c303d7c536ee7b98b1b94017ddec1c5c2d2616123 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiTabArt.html e5b7835f77b07cea9c91ea485d61bd07134518738f228863bc85ad826d738d3a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBitmap.html 5b1052a372a9c7a436ac5be2b7db92a309d35beadb17c99378f7c7c8f1e0d4ca 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBitmapButton.html a6c68bf6ea7f37795dfe994727eb626889dc9790e159452f72942dc33d59df93 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBitmapDataObject.html d562ebce6d05b8b7b180d49e0f61004c8943298ace0eb0fdcacd8fb57827988a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBookCtrlBase.html 74ec055b5e3f366cdd3dd7d0920e4d1628fe89cd75359806cfadf171a3ccfef9 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBookCtrlEvent.html e74c79342ea253276211b6e7d796dde8bfd8de955b8dfb2705251503f0380f2d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBoxSizer.html ac1c173e3f330bc5c3eaf965093b781521d3edb229b2b343365f77ebcd9a30df 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBrush.html 3c0e8fe3acd0cc4b5f7b88fbb09f80620405c11169d485085af4b04bfbcdee8a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBufferedDC.html fdf2d2d48a446baf070de20078e9602b64c3ce5bfcaebce78ae52fe3399b9bac 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBufferedPaintDC.html 848b18aa22e19338ec68cb5a6db09a7d5f9da087e4105b20bda1baf5eed8eaee 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxButton.html 52d10f5f6f0cc5f518c7edb4fb1b54be06de128690be0af5d5950fcecfa726d6 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCalendarCtrl.html 8a95627be18cfa91ad56e5eb25cc0ea531946949d75337091550a656d0d79a9d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCalendarDateAttr.html 5bd7b38f90ffac47ca0a2b8fdffef59cae9f445e2096396a5636c7417e01902c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCalendarEvent.html 5db860efcce788d471578833eb9d35f732172ef55ef001ee6a2327f15b25a61e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCaret.html 28834c8ec43fb50e4161049f99d239f3093154f8c4afd6d0b10496824bafdbfc 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCheckBox.html 615751863dae0e660074697ce1b1856b20bb2c3a5ba60352500b18f2101961b0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCheckListBox.html 2ee7cad24e4affc943208600fd2943cb9bf5bb56b375f9b0ea3de27895e6483e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxChildFocusEvent.html 5906c9ef6bc74a382d8beda681fb5d69cd1c359de056bf6c27be275c5ee589c4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxChoice.html 5d322aeb7fcb0c01e9bb2f3d9de3cbd1b28f700ec3b70dab46bfa7fda693bcfc 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxChoicebook.html 0f28e7f0a6de6470b7511e23f1da5a46a9fab5b187816ffcbdc45ba016cc3354 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxClientDC.html bd43d21c312d016c5b3d21b66ebd2b223fbbdcbfe582cefd7e007ef46801211f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxClipboard.html 4ad2076d2b6423e13a0ea27d3a92de0032419b46c0a58463f2280ef83a3b1c8b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxClipboardTextEvent.html 7a374c604ca83922a5e6baacb675fac571a1b1422f06634628b515c5d6da3d54 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCloseEvent.html 7e095bab569c0b228ab370079ccf937688665c2f3c0f5d6bbf9deb3f636c264a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourData.html d209537eb66a9ead018f692f68643833910507966ab30c8907202069af61166a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourDialog.html e9737dfdd29819aee4b527765ee15608558d186021fe18847568e1dd2f9c203e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourPickerCtrl.html 99e64a0fa85a982f974c6d002e564f5bc6a98208b2f1355e2ead6560997042e2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourPickerEvent.html 1d9898262b807e9a74661d6569e167277501dda38649f29ced860ea3118409ee 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxComboBox.html 8734545b7ba52c93753a5edca169da981642baddc8de2ce5e9031503666079e9 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCommandEvent.html 714a02006dd000ea09acc36682b40f031ebb3034279f54380346e3042d1846fe 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxContextMenuEvent.html 54b1f71b2a43ca1719f7b0f28b925d46627880d38b01d67d573f38ac7d9a985d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxControl.html 10b299555d6f36969e8a17515f454463ee49e2df1c4c027e7805e2153e6afbcc 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxControlWithItems.html fffaf61457cce7ed2e51eb51b62acda969ce95f654cc5bfad7934f3cb1081089 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCursor.html f0b10bd7e9d2e13b30374faecd73e414a6cc7569899593c1af9a5229b537efeb 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDC.html fec7b891e9ce0bb350a24c3697e36f3b743abe4ad4031480dd57bf87ec36f88f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDCOverlay.html 4172a1a8f94b439230cd9baf96afeb88e3b32b8f76b40474efdf976fd2151cb0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDataObject.html 99b1232ec373c3509b0f100365644ba2dbbe1b6b58b449657ed303d900a4097a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDateEvent.html 3f44d06d75e4e7f5f9d65b3b8e6cef9dfa45f411e832c4ddb07321d27f38bb92 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDatePickerCtrl.html 8ad9dfe8492fbb64906ff968d17e56bcc98ad30e384479b6ab7d980dfbcf66e2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDialog.html 65e401ea1fe8d9661d85fd80a1fed2e6403eca44b6c417ba4e3697917cc57c10 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDirDialog.html 6b0560b7e55479008062ee06f2abd6c51da0ed638b9ee61e6a936a23075134a2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDirPickerCtrl.html e58e7eff9bf973da394d0a1ca55fbe2a4607f0da18e52467955d9f305dccccf4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDisplay.html 15007738b834823d37230a73be1f92176588e977060220f7919f2b928fad9e0a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDisplayChangedEvent.html 0e82f24942ca4927c6d2642ef5ebdbffe7c2972dfc7d30729b06bc1ec20ef638 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDropFilesEvent.html 09029a8b9b2cb3557f36f422a5cfc05670b9bf99e8ac33dfc48cf607f504551d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxEraseEvent.html 6aab7b001dc29d7778cda0329a0688427b3759f32fd117ee07a2cae4282838d4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxEvent.html 1237e87fb4f2ced6d64f9e9c020c6dd700ec639327727ca03b534dd743526aad 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxEvtHandler.html f856009c4f85565af7789d7141dd1c4a48a7132eb7da18509745c4228a764ad7 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFileDataObject.html 463c0a2d79b9d4fec6b8f2fdaaeda463560ee25116ca9b37442b85a469f45cb5 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFileDialog.html f0ac83355d2a308e86cd180b6eafaf6ddb41df3dcfd116c8d57b5c5bbee4df8b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFileDirPickerEvent.html 58209aba7cb684c8197048b7e822abb54193b1b699a3a0d98af5d5edb06677cf 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFilePickerCtrl.html 80f856a3a866d101db0a3c4a373b1c4543a6ad030354535acae566bb0b155687 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFindReplaceData.html e99521cf8c65ba86384dc8783cd8a290161898623b8f74b6f3238adfeafa0813 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFindReplaceDialog.html f4c2973fa36126edab289b481dc98804d41de22b7bef25ff47586f82eca2ffb6 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFlexGridSizer.html eaf5488f682aa0d66c510aa2babb30c5c493faa46151891da515f766d2ce00a4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFocusEvent.html 6ab7f94a9064e8895597def948c0ea2e62e0466861d7996ca57c9484bd4a7949 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFont.html 85ced61d9956126b9fa9b348d41a5ab45064974e813516b31190b6c00616b50b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontData.html 6c5092d3a10da14aba7ca84c04259c3cb9efdd1c944b3ec1a2108074b78178fb 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontDialog.html c5d68ae87546b4a5cd35ba5a5562bd511f61bb87192adf2655653fec4feb4346 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontPickerCtrl.html d34ca200919097e35dd065293bd73b0165136ec9c73a3619501f31009d5752f4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontPickerEvent.html dd0bf267a3194aadd6d8805880e9d1458aba69e1288ee0b3720ffac1f0e98fa0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFrame.html a6671521e2378bec9a9801c48dd1e1d0c01a46c435185865b2570c72c88333d9 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGBSizerItem.html 51b6c7260ab8c7b72cdd49a12ba223fa9870ec8e7329ed776e24202d493624fe 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGCDC.html 9e031fd1ed746c9e0a73f06e99d58b41ae73853bd69042ad14e7e50401f9ff11 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGLCanvas.html 183f1f1ede3cdc9d0b6ade3d15d6cdf54f47436daaaa332d3d738955a9d5d93d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGLContext.html 57227b4bf7c0cc979b7ab9d2d174b0aa4297ce4004d68a92fd1bddc189cf6f81 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGauge.html 5e13ba91932920116c8ed3cff65e1117cda35cb0a970617791b5aada32f665a7 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGenericDirCtrl.html d77272ad8798cb0b7bef512e0d813fc0dd6c8487a5e0febd9e9351c4629f3dbf 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsBrush.html 82c6c89d32c703e968f654f8a1e1921bc3d9348cc79dfb6012d46841ec63315b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsContext.html b3ec2d4a00adeabee92a58d738ca87797ba28fac827ce1aa5da115d0ae75c69d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsFont.html 2af319b6f9c4645c6d259490ca917c1cb1625cb05de87ad0869ba619fcc76bda 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsGradientStops.html 1ab109f67501b30da8f797f3d1bdae4db418b7a89e8c24e9ca095081e9cba5cf 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsMatrix.html 7508c10c7f830209759c369f9904baa10bb94a9f6060995d26a8402879360ace 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsObject.html 9e907648ef13110e13c8d8bf4278e261602598d00bdc20cd3718cb57fefab718 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsPath.html ba15af6bd12db4c7edf99eba44895bf3f833e98b8b45ac13d65afeb637e8d1b5 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsPen.html ad8a1c5da9763a171f027042471070f7b2d2431e71deb9bac9115074901c8331 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsRenderer.html 08a3983a542a5c2984942fbdbd394fdab6c307294acb80fc4507f9f690ed24d1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGrid.html 4228e1c72382660199fb4536904852891ad20576fd1c01a8b806859a6c507699 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridBagSizer.html 63469e9fd5caf9f12be838e35b9418145e35aadb5b1cd7cdddcc9a1c285a81ea 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellAttr.html 6cd0e34bcbc257944d3d39e829ab84ba9ed70bb6e2fce31b244cdc059240d72f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellBoolEditor.html 5c964e91b3d148821e2c6816e8d5fcd3e05f9d0a451f84b2b1ddfa27593fb5c5 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellBoolRenderer.html ea41c114f6f17cb0ada3b181688937e1d8cded5482674675c1c84990042b1745 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellChoiceEditor.html 9ae401d97d588bec570a6a68fd8fac380148d26e8bbc041b8575031b522462ba 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellEditor.html c4c60d562d042ed92560b4985fc652aef5670c6a62c1cf3759d93e103112a5d1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellFloatEditor.html 01a58c619eb258f26435862f4aee9f41f453498e63f716a9ca37a8fe6df5230f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellFloatRenderer.html 6967af3914695dbb1759f0b61bb3ac0bd41b94a01fdad4cb797ed76d998c21ee 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellNumberEditor.html 6189df37cab6864c14596a0021db47cbcd6148487e99964f967fe098dedca8c2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellNumberRenderer.html 95641c5e5a521249cbdc891f6405b982d87666996374e0cbfb0cc0ffe71748b8 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellRenderer.html d5d7f5e0e55e338b92aa7d26b6a922f10b3e35e150955b865e184bd96a7bbdc1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellStringRenderer.html 3094576b26e350ad2fa57b4855130faadfeb19bf27d159be2c401fcb39face5e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellTextEditor.html cced1e4a088b5525f3cd322f0e4bf685a2aa06fac428c59d52bcb4902d3116c4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridEvent.html f5243d41277bc220df04baa73ddaeaac319ee3d0bc176a00c0db9bed39eccb4b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridSizer.html cff2955136c3b616229d728c73f1b5e1d9b55ea6d97c5b59b3cf464a02ac6650 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHelpEvent.html 565ac6a05f0c5dcebc8e3852d69fdd6872c9fb4043af2f441d3c4557ca479b03 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHtmlEasyPrinting.html 73d17314aaa5e411124d8f2355add95b5086ccb3fb1e52503a893ea4d29cc56f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHtmlLinkEvent.html 868c3c71829990aedfdfab6855aab6fb6edfcec2480b425efb884d19a86c4e02 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHtmlWindow.html 8ff7f275b6191e3c7364a36227e6c631d29955a5cab77bd9d1112a1a93f2c8b1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIcon.html 36421dcfc9a670f3041522da35750579cc1b326e5839ce05d47114f68ef7ce48 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIconBundle.html 776bd353639aa882810d66d8eac6896562d147b042d61f0eaa346c89f4d44d3f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIconizeEvent.html 0b30c4c8f700fd5ad3adc641a6317843690c982d79660981e020c3172434a829 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIdleEvent.html 5fb64f47e867fcbb6b9115bcb6f7c537d4542b65cc4333895d80e80e51e83703 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxImage.html f434db89f847df7577f4e73e9c1b774a2a5753a689ed139643299397e6e9e0e6 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxImageList.html 3d07c2d832c57fbe8103c981f6b66912fecb9ddcef8d5ad2c4e491bafe1470ae 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxInitDialogEvent.html ddec213fc6e6269b2e6d0614cf2d8a40e13f9acb2293ab750fa03d1f3a91853c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxJoystickEvent.html 5b64ee550b46db465504eb624a82c646ffc8336e442ca03f95f3db20da0bff98 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxKeyEvent.html 7b0626558fa38d11d8d33d24df85243a7f9d232bd76282459fd7417b38bd5bce 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxLayoutAlgorithm.html 818dde0c6963599b6724c17ac0a5237d56ec855a1d6725453ea8456f3b412093 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListBox.html e3e3bf17bb3cbddec2c7d5e9aecbf6bcc2ef609d022c30abb3bd736b946de586 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListCtrl.html 0b4bf23cfe7ae875f09bb50c26f01a8c511277d1ef106aa2fc8a21331cde9675 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListEvent.html 88f41688fa77b8465471cbf3999c110b9699cf2797049c97d6ceaf5753a78e46 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListItem.html d5cd191346cf44ba6009ebcc7c3db182b50f27e920c9da322c6043f9eee177ed 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListItemAttr.html 187f3717b610292ccf927e2d65f0d7031b6c312247909b54027c3371d6e66578 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListView.html 872c595d0f743d863b44641ef7f48351a6cb3b5feb0cb2dc9eb2d31f7a119a3c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListbook.html 89378c95e0b5c40a461f986e79e0a7ec6d06a880bf8b32f6e4e17c926ae5df67 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxLocale.html b904208c633836bb5d3e6bca317aeaeee197fa523f5734b52d022073070d14fe 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxLogNull.html 3f5a65b6bd17768e0673863a2ec8e861fc265088feb8ac5725070b53d0af6bbe 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMDIChildFrame.html 3eeaec7603b64ecd0b8acb06c6ce75484d7c6ceeea6e9bbdc92691d080122336 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMDIClientWindow.html 3554773acd6482fb82ed224ade620b4da75e9d18c28ee41018e0f88cc39e5b0f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMDIParentFrame.html 600b778e53bb7cb1116dc55670b02e99b4d6767d7f20a0691658f7ad37206048 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMask.html 89a9416a7cad5e8821504cbea0778235f41d109439ca60604072bd79fd03f51e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMaximizeEvent.html c374132b674331fe7e8be6217b56b44e6eac0de6492a5b5faa76d4229b1ebf5d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMemoryDC.html 11b1f2716fbd6a1657c9b6115d3b4ef70990cbcc4885dc45a6628d206335e610 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenu.html 47678b6028952c06afb76ed63c2be228f0a9b7c5a97e556709dd64a8899dc525 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenuBar.html 96de2644a2850848339ebc981133c8fb9694c179f3570f2fbc520b94e348d882 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenuEvent.html da2c753883e2d4668a88f88206e7be78129b6138414c8ff573e50ec4ef14a831 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenuItem.html e142e956c5ac037837486c723ae0e9df9f28138c188ff428d8f3167aaeeba6b3 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMessageDialog.html 4558f3fddc3800a0eb79cf92e6b51f1a84d5a407def4100a30d229eca39409b5 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMiniFrame.html 85c52149e35aa1e2fa24f06f3a2f6fc3536c35eabf0bfb5b0b54917401c1ee3f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMirrorDC.html 5c3a956e5bc388e86e1ecac5f77d04e3e9b7877961cbb280e82f5745b5237b55 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMouseCaptureChangedEvent.html 0da49f9e5bdf4090bdd15898274cfe6c912a789317677490038ea50fb74057d7 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMouseCaptureLostEvent.html 77192932de455d9d7c620f36d468cab00eb659b0c1703d96265ed8c4042dbc3b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMouseEvent.html f245b6400af5a2591364fd7a4c3f5aca5c511e58681f889c422d5f982e82bbd0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMoveEvent.html ee06d410f162057f9dbb32aa0e9e4508587d14f0646a717b0919818ba991e6fd 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMultiChoiceDialog.html 9c0589b1be991fe71d6b5951f08901a64edbe01dec68c3860aa706d9cefd2735 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNavigationKeyEvent.html 85e61ffc05d2e0ad0fc4d49017f8215e88a45ae124d8d3a045b046ead4789841 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNotebook.html 7e816a940e4361c0ad29a9ab4426d4b122f80e2ea81d8a32b9a4329596a87503 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNotificationMessage.html b63b5d1f09b5fadecc6a3a70ea9ad8f3db6290502b4b9c988a4983ab1b94d814 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNotifyEvent.html 9d61b05d534f37d1bac83315790a24dff8d2e4a6f3dad1154970877a3f37fa20 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxOverlay.html 1a9460d4982bf5f368fd6ba56065dc67d4fb4274915aea02958085b75db92896 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPageSetupDialog.html f218534cbcda0de12dbed3f1c11218bc24a11433fce27c9472a663915cdf7d87 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPageSetupDialogData.html cec35f254a9952f17a1706868269f061364b9b6dbd31aa18665c2c2d8457de83 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPaintDC.html 3dadf4df5e8bb7b8eca9eaf60b1e547f6e61cdc06c174e7ab8c7680aa5c75e5d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPaintEvent.html 2a9cfee60133bc22f91366549e0b1536f1e7d908c70f0212ad3e8fe6b960e7d0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPalette.html badf9e8ecf097bbad26cd31988e4c39dd442dfd29c42525aced410d17656b25b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPaletteChangedEvent.html 46680e5a4ba2c78040a6904d8b608f53dc9b72393289fb00e93ae702de48a2dd 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPanel.html abc32bb250c85ef87ceb52109f93e989507e27e00d768338cf305163ee321fd0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPasswordEntryDialog.html 93e2570084f86f0523f7c3b3a73532e1f67a5962adc60d2885921cdcfae33f64 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPen.html c72057b1aa9c526eddc59eb081ac1263061d47aad5834ba4bcea35860e037015 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPickerBase.html 0b404a92ec4e61d77e7e6e1147899fe4d8d90665e0e8138dcf75dd50c6b838da 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPopupTransientWindow.html 9f1cbed86fd0ffe248c6ae2a5f9d91ebe6dc477df21ed4cccc8d4d9a5f450660 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPopupWindow.html 2c0078e343e5af11c9cbe31a71cd5c51ec3e784224fcbb08f66929b9a49bb089 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPostScriptDC.html 8190cf87a0e4ad8f1bec06b72eb2b96b1c8afb71efd430193f13d7c60c035f87 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPreviewCanvas.html da885d60b374d403a098df9cdc401a20056991d9c8c911559d10c3554a98d13f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPreviewControlBar.html 8187518b06f54df269f789936baaf1e7b5f73c143562bd0cbdb3060fece657bc 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPreviewFrame.html dc9da054b38e57f77086cfed49a64f6c7c2ec18b52d7dde85d06803db159e204 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintData.html f2e1082f6cb0ddb5273097337986180accac78b79e3d85c52a327cbaf6a05f26 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintDialog.html f1d633d6be4fa4070496af3a0d934d82ea5e5961a7a7128dd9b9a2f2cb95e9d7 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintDialogData.html 4630a9c8ff1334b0bc74ad56cda172108d16b38beaac63ed037b24fc6692b460 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintPreview.html 8b5bf7174bd2dd579c5ccdca1022fa961e83e47cf924b6f6601ebb3d0c4842db 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrinter.html 7350f314361bcc2fb56cc6888c8b05e87986a49aa380586b780ccbbfec211297 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintout.html fcd9e31534fc02603cfe28d9c0a19c09d4fe9ee64266c1361a4be5601eec4a8e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxProgressDialog.html 4194f311243819ad67cd6276421a0116926a9621145b4c71b3c62828a0fc5268 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxQueryNewPaletteEvent.html 76874846d0f1919a37b28e5c84d3bb87d71414287ae471066f3f48c6ac2b8f86 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxRadioBox.html 9d096b0996819b892432bcd6ae0169dcadaaff3d241f840497fbf15468ea653d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxRadioButton.html fe8c09f5c456005a6c9b529249868a07a4778489a211876c934c1d24e310ac5d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxRegion.html 028ec8dd9f7193bab1a1797fcd01004129cc46fb7ba3b4fd0e874b693fced14a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSashEvent.html 75f4570bbcc12786cdeb62879c11b59861d065f9a1b6741149d0cad36336d9df 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSashLayoutWindow.html 5fa30b7f9851ae1045ec3937d7986511021f309f73b87de89c47cebc6d4e82e6 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSashWindow.html 97d85068124301a9649d8c774bfe7abf3bcbf00bf6d7ecf2c73929d4390a14df 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScreenDC.html 7592ad31cc8b8223ec40ce964972cbd8a81bb2ddc147f3cf677c0b1469e0d312 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrollBar.html 934154b6710e92bae2448d9ae26d45e01aaaa3b8c7245adc8ba98fcf320cde71 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrollEvent.html e863ba35cae222fa6e5c2ed47dd0582ebf0669bb55bfe39bbb87b67232047681 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrollWinEvent.html 1c82b545660aacbe96fdb0f03d42a5af0d2fc9ccdb1531e0a4cf0fd6f65fbc9a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrolledWindow.html 82f25df4389067e015c921b4f1a99c79954bac0d377bacde3128d0f820ee5852 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSetCursorEvent.html 79db7d55eb75207c3a68da28a77ee83d3fccf7eca05aa14ea8e1ff11bc038917 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxShowEvent.html 3533ac5f0f95a746b222f156871187ce577d556402e9a5f8633ffc146587f95e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSingleChoiceDialog.html 21b887d99168113e73a4f8c917726e4c9d86e280f155d33577a8208dab22f262 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizeEvent.html 9c9d9a158e1013fd61a5d9c4b90094ce87a3d1cd849c05370dae8bf7e1a33c35 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizer.html 62804e3dd711b78886045e35b8cab958f0ddbb44925b256348bec4b964f064cc 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizerFlags.html e652a7908a85dcbf6e2b15cb4551b7cb4fa7a8f3d071295cae8e6107a2108ff2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizerItem.html 701fdcaa68f463783ee57f37dda7a3fc2b09cce2a60b3bd5f68d902852c2263a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSlider.html 2965a88d6d3c2cfe5b3bea8a3fb18f7479bb5f7edd5029a5ad3b29b9269dcccb 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSpinButton.html 0849cd812f10be7a79b546c64b3ed6ce15d6657934b05ed44c3680d43eba8155 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSpinCtrl.html b657c4f44b569d930e580675b2d89bf4ce5769000555af800c2e763a1357cf14 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSpinEvent.html ad2efad6341b4d56d49c73c97dcd518f5e459a9fad8c410a70d177b6369177c7 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSplashScreen.html 06d8bca904619b569f6067bccf16e8ef1a6c6b6e89b0d15d015c718e176affcd 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSplitterEvent.html 01342c0fdae73dd9da5538012f6ab9310663f5e93fe54e4cf7327d6983accdf9 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSplitterWindow.html 4d7998a30b19ceda409f239ed38aa288475bb8410220e335989c6840a72142a8 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticBitmap.html 59898f0ad8cb04b892fc833e5fb92a0566c63e8a85948b2e5bfde85d3ac13338 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticBox.html 0beb13d78b9aa7276b8245c18e2eedd921f69ba4cf364c559599106d67b7da77 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticBoxSizer.html 797e1de7d8db56bd2564dbc6e025aec78b444d55b2e72f82932ca5d566e7853f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticLine.html 7ac6f9023d0ecd1ce9845f7dc912b6250fa816f46f20a3ef20f86889894a23a2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticText.html 331445742a5384bbde8266fac51c39dda3e5cf8e4e159870229c3f85af55ef27 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStatusBar.html 6820e98523f0ab53e785deb801461af30a9effc45c03f512b4b1acb3b36d7525 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStdDialogButtonSizer.html f8c06d7d7465c9ef1c019bc1c2025c0e83e2d2aa89cf9af8b73f9f86691ad44c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStyledTextCtrl.html 5f83060266dfbf757facf8008aa8a9a44694adfef55e6e39d6438116e12d37c3 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStyledTextEvent.html 99bacb9a99f69d7e044571c27f6fbda5f169a57432e22a6d027bc9e22a33a46e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSysColourChangedEvent.html 4249cacfdd0e70444bf27d1981e93b61cd3318dff75e0adeb05f2a59b9e20c77 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSystemOptions.html a97084213a71d3d3c2de340596e5732c1699d8463ce426a7ad34878daba45f86 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSystemSettings.html 3a07317c51bd4da56f6f734f500b09f1cac67f9463152f6cf1a29f978146f0c1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTaskBarIcon.html ac02de286c59877e08971f0f3e7bab8084b83ba40ab27f900ebb0a64018d3eb7 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTaskBarIconEvent.html ccb38b43982aaa12cfc3c521aaaee6350ada13a70a1e23e22bcfe92aad5b6d3c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextAttr.html 2078e84ccdc28cfc03442c6c4a555b70ff3ed1e8693cdf8f509fe682c5826358 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextCtrl.html 21536a005bb405ae57a3e00939f7933e4fbcbaa100e8d649226369c27a656504 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextDataObject.html 2e57848e59986d447849be9685b8e01d5abfe019c9f1332c8b166a4eb9a9e1da 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextEntryDialog.html cf6d6c3d5caa4630647ddcaf2413060843faaa20378e4266e8414322322d056e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToggleButton.html fdde3fa830c4a36de657f5ee88a67891273c8938bc92eee0863f361e30436245 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToolBar.html ba0cfe77356d831f496fd7d4378e0c13db17c065cd6c976fe811793da5d27041 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToolTip.html 25bbdc0e3d15950673dd9b10537ecc047c6f90429e4887852e76b68a05252e4b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToolbook.html 59d6595506fb303b92d8f6ee8eec0d2342ea2102b3d497fa589787b209cac234 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTopLevelWindow.html 386a6fff83532ad95ceaeaa1aa6f947fbf45a0b6056819bbcffce6b556af8622 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTreeCtrl.html 38bdb32e14fda92373e8097ecc8fab10e77ee00afb459db1381bc18a065bcb5b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTreeEvent.html 20c1faf7418d9ba890c54561acd0dcfdfd3ae486c1108bc57cf3d17b4c100537 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTreebook.html 914fb9c5e63c81fb50f48be635d3e8016529d5de245a92ed5d7a72d18b9c2e9c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxUpdateUIEvent.html 24af7d08f7f2bd66d3a88d5908f34266e062f1054d363cc355627cefab72328f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWebView.html 7129f3d54d1f85b35f3363921711a7635b06651e16e5b51ac01d2fb03a4622e1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWebViewEvent.html cff90b68be544404dba4fc4984de29f1e55165c5cf77b6c7e39e2928991cff64 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindow.html 1707dd1721f0155863253aed702ddf50b2668890c5f65c12a17354ea4ba97691 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindowCreateEvent.html dc6fef37291f687f54d6bb910be0d795f8151627a67b8d2d95f08685a2bad858 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindowDC.html 6e5417a892d90b27b2066043ec18f81c1ad91334a9ac0d7ea40891735e9596bb 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindowDestroyEvent.html b6af3e099cfcd1e2cec4b758b9a60ab15adf1fbf7cee340ff2f8ca03df8072e4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxXmlResource.html 688a8bd56961cb3521e90d86fa205aeb80a5cc30d799e6584147f64a8f399353 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx_misc.html 0fc26b1855d169d01ec8d97fc77c76e7b97697ad26a2a1860fa4c4bedff61bbc 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx_object.html ca9bf4ae8cfefa696c440e9b1ab17f86a5a1be571f594bc8914182452fe010a1 2 @@ -4491,2 +4491,2 @@ -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/404.html 0f8ddf8b365e517ef34af72451e4c10e746ddaaaee42dee0e3421da48fa9940b 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/api-reference.html 3d0c0954ffea304ff83b85a30a95705bfdd81a1d205d6d4e25f9abc0a9234d0e 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/404.html 8a940b1aa5955dc0475a40816848e40a4c6d68ff4858d24c614634bd75f0a4b2 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/api-reference.html bfa22e01cadb1994a08ce91a4c75ba9c4fafeff994d4342e5b367efabc65f042 2 @@ -4527,12 +4527,12 @@ -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/notes.html 05513a63f7ad3c8e90a8acf344a953aec795d3e7c9fa05e60861e1577ec68c84 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/search.html 2dd1854bc8a3a17f0ffaa619a607bdb2632e9da4b635d33b3bde903bc60a2cfc 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl.html de8daf1fa52c697c39cef497b979a94369e77fee5ad21af29999d486cb4899a1 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_eventp.html 566bfac5c4a104a1d75295ed18dc22842bdf9308d1bc60fe9c557b34c0648fdd 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_examples.html e92e685cecf0f51921908307395a7e16499b89543754b8f30c4c3ba657443bae 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_sax_parser.html a6b9e59f4a40bb8e12d596bc3b799f751ef405cf94f1ccbead529e9a56e27448 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_scan.html cb978146c40880acb91df9b8c62a2f4122aad18b0aeea9f8584f42ab5c0a772f 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_ug.html 5e41317cef10f074d51005774f4404d980ca18a2fc0a3e0c50563a17b05edc74 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_xpath.html 748a17bc8ce26591d7296ce13bce3d988a98ee04136141b33f17d0e6e31b172d 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_xs.html c3e7de377f71076c0c1f6354d55005057709eac4fa3b523afcd2adcf0bc3820f 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_xs_examples.html 283a8e2e1e64152dce2f5a5eacca715c02e6736303333233436186932a1ee4df 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_xsd.html 3aa44475a93f7b65ab91d44bbd6b89926ade9c77e93e5c37fd05779775dcebbd 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/notes.html cafed4de14019023c6b3fa81189c38012b66a48419e63b9e19ac05240879ba7b 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/search.html 67887f33da8150e4962a008519dfddee4de9e5a710080539a673c54937593bca 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl.html 8bd1b9d1b2214f7ac18fceb84c26802958272273d42e0136e221a0cb27f34639 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_eventp.html d7c1bac441788424c57e86fd071745631bad3e0850635280dd7a99a60942df94 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_examples.html 5d29a1e3795056c0da0f3fa98717456cf6a4bd32887b9b2b1add1f6cea50d518 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_sax_parser.html bef311b55ce9df4d4685734641db5e4ebe0fd346dbde2ffe5174ea9e7e1dc07b 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_scan.html 1870ef93522a5fb33ede59318a2a8c96601bad0e4544c184bd5109bd7069557a 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_ug.html ebb6628d5165f699959919925b6df2dc18fcabbae9b3cc107a760ac86558b6aa 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_xpath.html 1dc150f70a7e2e56886f0fe5ad41dfd108e40cf7582c3c190fd15b6ea1937c42 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_xs.html 386a990bf8aa90a2546c3247d88edd1f9559233cd52a1e6e3ab6d24cbdf229ed 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_xs_examples.html 808e885e36b93f1cc7dd3ceb708b4cb1f6ade126e07fac51677a0deb912ae2fc 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_xsd.html f5b31a34c87c0279860bee16689794558e310853e7f0a7ecd3119aa2b3e62855 2 comparing rpmtags comparing RELEASE comparing PROVIDES comparing scripts comparing filelist --- old-filelist +++ new-filelist @@ -259,7 +259,7 @@ /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/dist/lato-latin-ext-400-normal-N27NCBWW.woff2 2 (none) 120777 root root 0 4294967295 ../../../../lib/xmerl-2.1.3/doc/html/dist/lato-latin-ext-400-normal-N27NCBWW.woff2 /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 2 (none) 120777 root root 0 4294967295 ../../../../lib/xmerl-2.1.3/doc/html/dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/dist/remixicon-NKANDIL5.woff2 2 (none) 120777 root root 0 4294967295 ../../../../lib/xmerl-2.1.3/doc/html/dist/remixicon-NKANDIL5.woff2 -/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/dist/search_data-45BBA3CE.js 2 (none) 100644 root root 0 4294967295 +/usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/dist/search_data-4F4A610F.js 2 (none) 100644 root root 0 4294967295 /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/dist/sidebar_items-EAF8F760.js 2 (none) 100644 root root 0 4294967295 /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/driver.html 2 (none) 100644 root root 0 4294967295 /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/driver_entry.html 2 (none) 100644 root root 0 4294967295 @@ -1258,7 +1258,7 @@ /usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/dist/lato-latin-ext-400-normal-N27NCBWW.woff2 2 (none) 120777 root root 0 4294967295 ../../../../xmerl-2.1.3/doc/html/dist/lato-latin-ext-400-normal-N27NCBWW.woff2 /usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 2 (none) 120777 root root 0 4294967295 ../../../../xmerl-2.1.3/doc/html/dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 /usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/dist/remixicon-NKANDIL5.woff2 2 (none) 120777 root root 0 4294967295 ../../../../xmerl-2.1.3/doc/html/dist/remixicon-NKANDIL5.woff2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/dist/search_data-5F40933F.js 2 (none) 100644 root root 0 4294967295 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/dist/search_data-8746A0E5.js 2 (none) 100644 root root 0 4294967295 /usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/dist/sidebar_items-19ECDBA9.js 2 (none) 100644 root root 0 4294967295 /usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/error_handling.html 2 (none) 100644 root root 0 4294967295 /usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/getting_started.html 2 (none) 100644 root root 0 4294967295 @@ -1476,7 +1476,7 @@ /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/dist/lato-latin-ext-400-normal-N27NCBWW.woff2 2 (none) 120777 root root 0 4294967295 ../../../../xmerl-2.1.3/doc/html/dist/lato-latin-ext-400-normal-N27NCBWW.woff2 /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 2 (none) 120777 root root 0 4294967295 ../../../../xmerl-2.1.3/doc/html/dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/dist/remixicon-NKANDIL5.woff2 2 (none) 120777 root root 0 4294967295 ../../../../xmerl-2.1.3/doc/html/dist/remixicon-NKANDIL5.woff2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/dist/search_data-D2253CE5.js 2 (none) 100644 root root 0 4294967295 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/dist/search_data-12AAC588.js 2 (none) 100644 root root 0 4294967295 /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/dist/sidebar_items-EAF2F83F.js 2 (none) 100644 root root 0 4294967295 /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/error_logging.html 2 (none) 100644 root root 0 4294967295 /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/index.html 2 (none) 100644 root root 0 4294967295 comparing file checksum creating rename script RPM meta information is different Extracting packages /usr/share/doc/packages/erlang-doc/doc/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/404.html 2025-05-10 20:18:55.681068719 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/404.html 2025-05-10 20:18:55.681068719 +0000 @@ -131,7 +131,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/asn1.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/asn1.html 2025-05-10 20:18:55.701068901 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/asn1.html 2025-05-10 20:18:55.701068901 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/common_test.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/common_test.html 2025-05-10 20:18:55.721069082 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/common_test.html 2025-05-10 20:18:55.721069082 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/compiler.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/compiler.html 2025-05-10 20:18:55.741069264 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/compiler.html 2025-05-10 20:18:55.741069264 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/crypto.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/crypto.html 2025-05-10 20:18:55.761069445 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/crypto.html 2025-05-10 20:18:55.761069445 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/debugger.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/debugger.html 2025-05-10 20:18:55.781069626 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/debugger.html 2025-05-10 20:18:55.781069626 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/deprecations.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/deprecations.html 2025-05-10 20:18:55.805069844 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/deprecations.html 2025-05-10 20:18:55.809069880 +0000 @@ -471,7 +471,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/design_principles.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/design_principles.html 2025-05-10 20:18:55.825070024 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/design_principles.html 2025-05-10 20:18:55.829070062 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/dialyzer.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/dialyzer.html 2025-05-10 20:18:55.845070206 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/dialyzer.html 2025-05-10 20:18:55.849070242 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/diameter.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/diameter.html 2025-05-10 20:18:55.865070388 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/diameter.html 2025-05-10 20:18:55.865070388 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/edoc.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/edoc.html 2025-05-10 20:18:55.885070569 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/edoc.html 2025-05-10 20:18:55.885070569 +0000 @@ -153,7 +153,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/efficiency_guide.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/efficiency_guide.html 2025-05-10 20:18:55.901070714 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/efficiency_guide.html 2025-05-10 20:18:55.905070750 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/eldap.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/eldap.html 2025-05-10 20:18:55.921070895 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/eldap.html 2025-05-10 20:18:55.925070932 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/embedded.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/embedded.html 2025-05-10 20:18:55.941071077 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/embedded.html 2025-05-10 20:18:55.941071077 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/erl_interface.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/erl_interface.html 2025-05-10 20:18:55.961071258 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/erl_interface.html 2025-05-10 20:18:55.961071258 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/erts.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/erts.html 2025-05-10 20:18:55.981071439 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/erts.html 2025-05-10 20:18:55.985071476 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/et.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/et.html 2025-05-10 20:18:56.001071621 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/et.html 2025-05-10 20:18:56.005071657 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/eunit.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/eunit.html 2025-05-10 20:18:56.021071802 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/eunit.html 2025-05-10 20:18:56.025071838 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/ftp.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/ftp.html 2025-05-10 20:18:56.041071983 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/ftp.html 2025-05-10 20:18:56.045072019 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/getting_started.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/getting_started.html 2025-05-10 20:18:56.061072165 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/getting_started.html 2025-05-10 20:18:56.065072201 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/inets.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/inets.html 2025-05-10 20:18:56.081072345 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/inets.html 2025-05-10 20:18:56.085072382 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/installation_guide.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/installation_guide.html 2025-05-10 20:18:56.101072527 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/installation_guide.html 2025-05-10 20:18:56.105072563 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/jinterface.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/jinterface.html 2025-05-10 20:18:56.125072745 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/jinterface.html 2025-05-10 20:18:56.125072745 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/kernel.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/kernel.html 2025-05-10 20:18:56.145072926 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/kernel.html 2025-05-10 20:18:56.145072926 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/man_index.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/man_index.html 2025-05-10 20:18:56.221073615 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/man_index.html 2025-05-10 20:18:56.265074014 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/megaco.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/megaco.html 2025-05-10 20:18:56.289074232 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/megaco.html 2025-05-10 20:18:56.289074232 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/mnesia.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/mnesia.html 2025-05-10 20:18:56.309074412 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/mnesia.html 2025-05-10 20:18:56.309074412 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/observer.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/observer.html 2025-05-10 20:18:56.329074594 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/observer.html 2025-05-10 20:18:56.333074630 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/odbc.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/odbc.html 2025-05-10 20:18:56.349074776 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/odbc.html 2025-05-10 20:18:56.353074812 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/os_mon.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/os_mon.html 2025-05-10 20:18:56.369074956 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/os_mon.html 2025-05-10 20:18:56.373074993 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/parsetools.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/parsetools.html 2025-05-10 20:18:56.389075138 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/parsetools.html 2025-05-10 20:18:56.393075174 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/programming_examples.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/programming_examples.html 2025-05-10 20:18:56.413075356 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/programming_examples.html 2025-05-10 20:18:56.413075356 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/public_key.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/public_key.html 2025-05-10 20:18:56.433075537 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/public_key.html 2025-05-10 20:18:56.433075537 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/readme.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/readme.html 2025-05-10 20:18:56.453075718 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/readme.html 2025-05-10 20:18:56.457075755 +0000 @@ -153,7 +153,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/reference_manual.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/reference_manual.html 2025-05-10 20:18:56.477075936 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/reference_manual.html 2025-05-10 20:18:56.477075936 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/reltool.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/reltool.html 2025-05-10 20:18:56.497076117 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/reltool.html 2025-05-10 20:18:56.501076154 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/removed.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/removed.html 2025-05-10 20:18:56.521076335 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/removed.html 2025-05-10 20:18:56.525076371 +0000 @@ -392,7 +392,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/runtime_tools.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/runtime_tools.html 2025-05-10 20:18:56.545076553 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/runtime_tools.html 2025-05-10 20:18:56.545076553 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/sasl.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/sasl.html 2025-05-10 20:18:56.565076734 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/sasl.html 2025-05-10 20:18:56.565076734 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/scheduled_for_removal.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/scheduled_for_removal.html 2025-05-10 20:18:56.585076915 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/scheduled_for_removal.html 2025-05-10 20:18:56.589076951 +0000 @@ -216,7 +216,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/search.html 2025-05-10 20:18:56.609077133 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/search.html 2025-05-10 20:18:56.609077133 +0000 @@ -131,7 +131,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/snmp.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/snmp.html 2025-05-10 20:18:56.625077277 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/snmp.html 2025-05-10 20:18:56.629077314 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/ssh.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/ssh.html 2025-05-10 20:18:56.649077495 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/ssh.html 2025-05-10 20:18:56.649077495 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/ssl.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/ssl.html 2025-05-10 20:18:56.669077677 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/ssl.html 2025-05-10 20:18:56.669077677 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/stdlib.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/stdlib.html 2025-05-10 20:18:56.689077858 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/stdlib.html 2025-05-10 20:18:56.689077858 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/syntax_tools.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/syntax_tools.html 2025-05-10 20:18:56.709078039 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/syntax_tools.html 2025-05-10 20:18:56.709078039 +0000 @@ -162,7 +162,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/system/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/system/404.html 2025-05-10 20:18:56.729078221 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/404.html 2025-05-10 20:18:56.729078221 +0000 @@ -135,7 +135,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/applications.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/applications.xhtml" 2025-05-10 20:18:56.929080034 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/applications.xhtml" 2025-05-10 20:18:56.945080179 +0000 @@ -44,8 +44,8 @@ Application Callback Module

How to start and stop the code for the application, including its supervision -tree, is described by two callback functions:

start(StartType, StartArgs) -> {ok, Pid} | {ok, Pid, State}
-stop(State)

@@ -169,20 +169,20 @@

The doc signature is a short text shown to describe the function and its arguments. By default it is determined by looking at the names of the arguments in the --spec or function. For example:

add(One, Two) -> One + Two.
+-spec or function. For example:

add(One, Two) -> One + Two.
 
--spec sub(One :: integer(), Two :: integer()) -> integer().
-sub(X, Y) -> X - Y.

will have a signature of add(One, Two) and sub(One, Two).

For types or callbacks, the signature is derived from the type or callback -specification. For example:

-type number(Value) :: {number, Value}.
+-spec sub(One :: integer(), Two :: integer()) -> integer().
+sub(X, Y) -> X - Y.

will have a signature of add(One, Two) and sub(One, Two).

For types or callbacks, the signature is derived from the type or callback +specification. For example:

-type number(Value) :: {number, Value}.
 %% signature will be `number(Value)`
 
--opaque number() :: {number, number()}.
+-opaque number() :: {number, number()}.
 %% signature will be `number()`
 
--callback increment(In :: number()) -> Out.
+-callback increment(In :: number()) -> Out.
 %% signature will be `increment(In)`
 
--callback increment(In) -> Out when In :: number().
+-callback increment(In) -> Out when In :: number().
 %% signature will be `increment(In)`

If it is not possible to "easily" figure out a nice signature from the code, the MFA syntax is used instead. For example: add/2, number/1, increment/1

It is possible to supply a custom signature by placing it as the first line of the -doc attribute. The provided signature must be in the form of a function @@ -191,7 +191,7 @@ Adds two numbers. """. -add(A, B) -> A + B.

Will create the signature add(One, Two). The signature will be removed from the +add(A, B) -> A + B.

Will create the signature add(One, Two). The signature will be removed from the documentation string, so in the example above only the text "Adds two numbers" will be part of the documentation. This works for functions, types, and callbacks.

@@ -284,13 +284,13 @@ rebar3_ex_doc plugin. To set up a rebar3 project to use ExDoc to generate documentation add the following to your rebar3.config.

%% Enable the plugin
-{plugins, [rebar3_ex_doc]}.
+{plugins, [rebar3_ex_doc]}.
 
-{ex_doc, [
-  {extras, ["README.md"]},
/usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/drivers.xhtml differs (HTML document, ASCII text, with very long lines)
--- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/drivers.xhtml"	2025-05-10 20:18:56.925079998 +0000
+++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/drivers.xhtml"	2025-05-10 20:18:56.941080142 +0000
@@ -31,15 +31,15 @@
 running.

A driver can be configured to have one lock for each port instead.

If a driver is used in a functional way (that is, holds no state, but only does some heavy calculation and returns a result), several ports with registered names can be opened beforehand, and the port to be used can be chosen based on -the scheduler ID as follows:

-define(PORT_NAMES(),
-	{some_driver_01, some_driver_02, some_driver_03, some_driver_04,
+the scheduler ID as follows:

-define(PORT_NAMES(),
+	{some_driver_01, some_driver_02, some_driver_03, some_driver_04,
 	 some_driver_05, some_driver_06, some_driver_07, some_driver_08,
 	 some_driver_09, some_driver_10, some_driver_11, some_driver_12,
-	 some_driver_13, some_driver_14, some_driver_15, some_driver_16}).
+	 some_driver_13, some_driver_14, some_driver_15, some_driver_16}).
 
-client_port() ->
-    element(erlang:system_info(scheduler_id) rem tuple_size(?PORT_NAMES()) + 1,
-	    ?PORT_NAMES()).

As long as there are no more than 16 schedulers, there will never be any lock +client_port() -> + element(erlang:system_info(scheduler_id) rem tuple_size(?PORT_NAMES()) + 1, + ?PORT_NAMES()).

As long as there are no more than 16 schedulers, there will never be any lock contention on the port lock for the driver.

/usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/eff_guide_functions.xhtml differs (HTML document, ASCII text, with very long lines) --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/eff_guide_functions.xhtml" 2025-05-10 20:18:56.925079998 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/eff_guide_functions.xhtml" 2025-05-10 20:18:56.941080142 +0000 @@ -31,13 +31,13 @@ rearranging clauses.

One exception is pattern matching of binaries. The compiler does not rearrange clauses that match binaries. Placing the clause that matches against the empty binary last is usually slightly faster than placing it first.

The following is a rather unnatural example to show another exception where -rearranging clauses is beneficial:

DO NOT

atom_map1(one) -> 1;
-atom_map1(two) -> 2;
-atom_map1(three) -> 3;
-atom_map1(Int) when is_integer(Int) -> Int;
-atom_map1(four) -> 4;
-atom_map1(five) -> 5;
-atom_map1(six) -> 6.

The problem is the clause with the variable Int. As a variable can match +rearranging clauses is beneficial:

DO NOT

atom_map1(one) -> 1;
+atom_map1(two) -> 2;
+atom_map1(three) -> 3;
+atom_map1(Int) when is_integer(Int) -> Int;
+atom_map1(four) -> 4;
+atom_map1(five) -> 5;
+atom_map1(six) -> 6.

The problem is the clause with the variable Int. As a variable can match anything, including the atoms four, five, and six, which the following clauses also match, the compiler must generate suboptimal code that executes as follows:

Rewriting to either:

DO

atom_map2(one) -> 1;
-atom_map2(two) -> 2;
-atom_map2(three) -> 3;
-atom_map2(four) -> 4;
-atom_map2(five) -> 5;
-atom_map2(six) -> 6;
-atom_map2(Int) when is_integer(Int) -> Int.

or:

DO

atom_map3(Int) when is_integer(Int) -> Int;
-atom_map3(one) -> 1;
-atom_map3(two) -> 2;
-atom_map3(three) -> 3;
-atom_map3(four) -> 4;
-atom_map3(five) -> 5;
-atom_map3(six) -> 6.

gives slightly more efficient matching code.

Another example:

DO NOT

map_pairs1(_Map, [], Ys) ->
+exception if none of the values matched.)

Rewriting to either:

DO

atom_map2(one) -> 1;
+atom_map2(two) -> 2;
+atom_map2(three) -> 3;
+atom_map2(four) -> 4;
+atom_map2(five) -> 5;
+atom_map2(six) -> 6;
+atom_map2(Int) when is_integer(Int) -> Int.

or:

DO

atom_map3(Int) when is_integer(Int) -> Int;
+atom_map3(one) -> 1;
+atom_map3(two) -> 2;
+atom_map3(three) -> 3;
+atom_map3(four) -> 4;
+atom_map3(five) -> 5;
+atom_map3(six) -> 6.

gives slightly more efficient matching code.

Another example:

DO NOT

map_pairs1(_Map, [], Ys) ->
     Ys;
-map_pairs1(_Map, Xs, []) ->
+map_pairs1(_Map, Xs, []) ->
     Xs;
-map_pairs1(Map, [X|Xs], [Y|Ys]) ->
-    [Map(X, Y)|map_pairs1(Map, Xs, Ys)].

The first argument is not a problem. It is variable, but it is a variable in +map_pairs1(Map, [X|Xs], [Y|Ys]) -> + [Map(X, Y)|map_pairs1(Map, Xs, Ys)].

The first argument is not a problem. It is variable, but it is a variable in all clauses. The problem is the variable in the second argument, Xs, in the middle clause. Because the variable can match anything, the compiler is not allowed to rearrange the clauses, but must generate code that matches them in the order written.

If the function is rewritten as follows, the compiler is free to rearrange the -clauses:

DO

map_pairs2(_Map, [], Ys) ->
+clauses:

DO

map_pairs2(_Map, [], Ys) ->
     Ys;
-map_pairs2(_Map, [_|_]=Xs, [] ) ->
+map_pairs2(_Map, [_|_]=Xs, [] ) ->
     Xs;
-map_pairs2(Map, [X|Xs], [Y|Ys]) ->
-    [Map(X, Y)|map_pairs2(Map, Xs, Ys)].

The compiler will generate code similar to this:

DO NOT (already done by the compiler)

explicit_map_pairs(Map, Xs0, Ys0) ->
+map_pairs2(Map, [X|Xs], [Y|Ys]) ->
+    [Map(X, Y)|map_pairs2(Map, Xs, Ys)].

The compiler will generate code similar to this:

DO NOT (already done by the compiler)

explicit_map_pairs(Map, Xs0, Ys0) ->
     case Xs0 of
-	[X|Xs] ->
+	[X|Xs] ->
 	    case Ys0 of
-		[Y|Ys] ->
-		    [Map(X, Y)|explicit_map_pairs(Map, Xs, Ys)];
-		[] ->
+		[Y|Ys] ->
+		    [Map(X, Y)|explicit_map_pairs(Map, Xs, Ys)];
+		[] ->
 		    Xs0
 	    end;
-	[] ->
+	[] ->
 	    Ys0
     end.

This is slightly faster for probably the most common case that the input lists are not empty or very short. (Another advantage is that Dialyzer can deduce a /usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/eff_guide_processes.xhtml differs (HTML document, ASCII text, with very long lines) --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/eff_guide_processes.xhtml" 2025-05-10 20:18:56.925079998 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/eff_guide_processes.xhtml" 2025-05-10 20:18:56.941080142 +0000 @@ -28,37 +28,37 @@

An Erlang process is lightweight compared to threads and processes in operating systems.

A newly spawned Erlang process uses 327 words of memory. The size can be found -as follows:

Erlang/OTP 27 [erts-14.2.3] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit]
+as follows:

Erlang/OTP 27 [erts-14.2.3] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit]
 
-Eshell V14.2.3 (press Ctrl+G to abort, type help(). for help)
-1> Fun = fun() -> receive after infinity -> ok end end.
+Eshell V14.2.3 (press Ctrl+G to abort, type help(). for help)
+1> Fun = fun() -> receive after infinity -> ok end end.
 #Fun<erl_eval.43.39164016>
-2> {_,Bytes} = process_info(spawn(Fun), memory).
-{memory,2616}
-3> Bytes div erlang:system_info(wordsize).
+2> {_,Bytes} = process_info(spawn(Fun), memory).
+{memory,2616}
+3> Bytes div erlang:system_info(wordsize).
 327

The size includes 233 words for the heap area (which includes the stack). The garbage collector increases the heap as needed.

The main (outer) loop for a process must be tail-recursive. Otherwise, the -stack grows until the process terminates.

DO NOT

loop() ->
+stack grows until the process terminates.

DO NOT

loop() ->
   receive
-     {sys, Msg} ->
-         handle_sys_msg(Msg),
-         loop();
-     {From, Msg} ->
-          Reply = handle_msg(Msg),
+     {sys, Msg} ->
+         handle_sys_msg(Msg),
+         loop();
+     {From, Msg} ->
+          Reply = handle_msg(Msg),
           From ! Reply,
-          loop()
+          loop()
   end,
-  io:format("Message is processed~n", []).

The call to io:format/2 will never be executed, but a return address will + io:format("Message is processed~n", []).

The call to io:format/2 will never be executed, but a return address will still be pushed to the stack each time loop/0 is called recursively. The -correct tail-recursive version of the function looks as follows:

DO

loop() ->
+correct tail-recursive version of the function looks as follows:

DO

loop() ->
    receive
-      {sys, Msg} ->
-         handle_sys_msg(Msg),
-         loop();
-      {From, Msg} ->
-         Reply = handle_msg(Msg),
+      {sys, Msg} ->
+         handle_sys_msg(Msg),
+         loop();
+      {From, Msg} ->
+         Reply = handle_msg(Msg),
          From ! Reply,
-         loop()
+         loop()
  end.

@@ -98,22 +98,22 @@

The cost of receiving messages depends on how complicated the receive expression is. A simple expression that matches any message is very cheap because it retrieves the first message in the message queue:

DO

receive
-    Message -> handle_msg(Message)
+    Message -> handle_msg(Message)
 end.

However, this is not always convenient: we can receive a message that we do not know how to handle at this point, so it is common to only match the messages we expect:

receive
-    {Tag, Message} -> handle_msg(Message)
+    {Tag, Message} -> handle_msg(Message)
 end.

While this is convenient it means that the entire message queue must be searched until it finds a matching message. This is very expensive for processes with long message queues, so there is an optimization for the common case of -sending a request and waiting for a response shortly after:

DO

MRef = monitor(process, Process),
-Process ! {self(), MRef, Request},
+sending a request and waiting for a response shortly after:

DO

MRef = monitor(process, Process),
+Process ! {self(), MRef, Request},
 receive
-    {MRef, Reply} ->
-        erlang:demonitor(MRef, [flush]),
-        handle_reply(Reply);
-    {'DOWN', MRef, _, _, Reason} ->
-        handle_error(Reason)
+    {MRef, Reply} ->
+        erlang:demonitor(MRef, [flush]),
+        handle_reply(Reply);
+    {'DOWN', MRef, _, _, Reason} ->
+        handle_error(Reason)
 end.

Since the compiler knows that the reference created by monitor/2 cannot exist before the call (since it is a globally unique identifier), and that the receive only matches messages that contain @@ -137,45 +137,45 @@ efficiency_guide.erl:222: Warning: OPTIMIZED: all clauses match reference in function parameter 1

To make it clearer exactly what code the warnings refer to, the warnings in the following examples are inserted as comments after the clause they refer to, for example:

%% DO
-simple_receive() ->
+simple_receive() ->
 %% efficiency_guide.erl:194: Warning: INFO: not a selective receive, this is always fast
 receive
-    Message -> handle_msg(Message)
+    Message -> handle_msg(Message)
 end.
 
 %% DO NOT, unless Tag is known to be a suitable reference: see
 %% cross_function_receive/0 further down.
-selective_receive(Tag, Message) ->
+selective_receive(Tag, Message) ->
 %% efficiency_guide.erl:200: Warning: NOT OPTIMIZED: all clauses do not match a suitable reference
 receive
-    {Tag, Message} -> handle_msg(Message)
+    {Tag, Message} -> handle_msg(Message)
 end.
 
 %% DO
-optimized_receive(Process, Request) ->
+optimized_receive(Process, Request) ->
 %% efficiency_guide.erl:206: Warning: OPTIMIZED: reference used to mark a message queue position
-    MRef = monitor(process, Process),
-    Process ! {self(), MRef, Request},
+    MRef = monitor(process, Process),
+    Process ! {self(), MRef, Request},
     %% efficiency_guide.erl:208: Warning: OPTIMIZED: matches reference created by monitor/2 at efficiency_guide.erl:206
     receive
-        {MRef, Reply} ->
-        erlang:demonitor(MRef, [flush]),
-        handle_reply(Reply);
-    {'DOWN', MRef, _, _, Reason} ->
-    handle_error(Reason)
+        {MRef, Reply} ->
+        erlang:demonitor(MRef, [flush]),
+        handle_reply(Reply);
+    {'DOWN', MRef, _, _, Reason} ->
+    handle_error(Reason)
     end.
 
 %% DO
-cross_function_receive() ->
+cross_function_receive() ->
     %% efficiency_guide.erl:218: Warning: OPTIMIZED: reference used to mark a message queue position
-    Ref = make_ref(),
+    Ref = make_ref(),
     %% efficiency_guide.erl:219: Warning: INFO: passing reference created by make_ref/0 at efficiency_guide.erl:218
-    cross_function_receive(Ref).
+    cross_function_receive(Ref).
 
-cross_function_receive(Ref) ->
+cross_function_receive(Ref) ->
     %% efficiency_guide.erl:222: Warning: OPTIMIZED: all clauses match reference in function parameter 1
     receive
-        {Ref, Message} -> handle_msg(Message)
+        {Ref, Message} -> handle_msg(Message)
     end.

@@ -186,8 +186,8 @@ each loaded module has its own pool. The following function does not build the tuple every time it is called (only to have it discarded the next time the garbage collector was run), but the tuple is located in the module's literal -pool:

DO

days_in_month(M) ->
-    element(M, {31,28,31,30,31,30,31,31,30,31,30,31}).

If a literal, or a term that contains a literal, is inserted into an Ets table, +pool:

DO

days_in_month(M) ->
+    element(M, {31,28,31,30,31,30,31,31,30,31,30,31}).

If a literal, or a term that contains a literal, is inserted into an Ets table, it is copied. The reason is that the module containing the literal can be unloaded in the future.

When a literal is sent to another process, it is not copied. When a module holding a literal is unloaded, the literal will be copied to the heap of all @@ -202,28 +202,28 @@ Loss of Sharing

-

An Erlang term can have shared subterms. Here is a simple example:

{SubTerm, SubTerm}

Shared subterms are not preserved in the following cases:

  • When a term is sent to another process
  • When a term is passed as the initial process arguments in the spawn call
  • When a term is stored in an Ets table

That is an optimization. Most applications do not send messages with shared -subterms.

The following example shows how a shared subterm can be created:

kilo_byte() ->
-    kilo_byte(10, [42]).
+

An Erlang term can have shared subterms. Here is a simple example:

{SubTerm, SubTerm}

Shared subterms are not preserved in the following cases:

  • When a term is sent to another process
  • When a term is passed as the initial process arguments in the spawn call
  • When a term is stored in an Ets table

That is an optimization. Most applications do not send messages with shared +subterms.

The following example shows how a shared subterm can be created:

kilo_byte() ->
+    kilo_byte(10, [42]).
 
-kilo_byte(0, Acc) ->
+kilo_byte(0, Acc) ->
     Acc;
-kilo_byte(N, Acc) ->
-    kilo_byte(N-1, [Acc|Acc]).

kilo_byte/1 creates a deep list. If list_to_binary/1 +kilo_byte(N, Acc) -> + kilo_byte(N-1, [Acc|Acc]).

kilo_byte/1 creates a deep list. If list_to_binary/1 is called, the deep list can be converted to a binary of 1024 bytes:

1> byte_size(list_to_binary(efficiency_guide:kilo_byte())).
 1024

Using the erts_debug:size/1 BIF, it can be seen that the deep list only -requires 22 words of heap space:

2> erts_debug:size(efficiency_guide:kilo_byte()).
+requires 22 words of heap space:

2> erts_debug:size(efficiency_guide:kilo_byte()).
 22

Using the erts_debug:flat_size/1 BIF, the size of the deep list can be calculated if sharing is ignored. It becomes the size of the list when it has -been sent to another process or stored in an Ets table:

3> erts_debug:flat_size(efficiency_guide:kilo_byte()).
+been sent to another process or stored in an Ets table:

3> erts_debug:flat_size(efficiency_guide:kilo_byte()).
 4094

It can be verified that sharing will be lost if the data is inserted into an Ets -table:

4> T = ets:new(tab, []).
+table:

4> T = ets:new(tab, []).
 #Ref<0.1662103692.2407923716.214181>
-5> ets:insert(T, {key,efficiency_guide:kilo_byte()}).
+5> ets:insert(T, {key,efficiency_guide:kilo_byte()}).
 true
/usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/erl_interface.xhtml differs (HTML document, ASCII text, with very long lines)
--- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/erl_interface.xhtml"	2025-05-10 20:18:56.921079961 +0000
+++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/erl_interface.xhtml"	2025-05-10 20:18:56.941080142 +0000
@@ -29,111 +29,111 @@
   Erlang Program
 

The following example shows an Erlang program communicating with a C program -over a plain port with home made encoding:

-module(complex1).
--export([start/1, stop/0, init/1]).
--export([foo/1, bar/1]).
-
-start(ExtPrg) ->
-    spawn(?MODULE, init, [ExtPrg]).
-stop() ->
+over a plain port with home made encoding:

-module(complex1).
+-export([start/1, stop/0, init/1]).
+-export([foo/1, bar/1]).
+
+start(ExtPrg) ->
+    spawn(?MODULE, init, [ExtPrg]).
+stop() ->
     complex ! stop.
 
-foo(X) ->
-    call_port({foo, X}).
-bar(Y) ->
-    call_port({bar, Y}).
+foo(X) ->
+    call_port({foo, X}).
+bar(Y) ->
+    call_port({bar, Y}).
 
-call_port(Msg) ->
-    complex ! {call, self(), Msg},
+call_port(Msg) ->
+    complex ! {call, self(), Msg},
     receive
-	{complex, Result} ->
+	{complex, Result} ->
 	    Result
     end.
 
-init(ExtPrg) ->
-    register(complex, self()),
-    process_flag(trap_exit, true),
-    Port = open_port({spawn, ExtPrg}, [{packet, 2}]),
-    loop(Port).
+init(ExtPrg) ->
+    register(complex, self()),
+    process_flag(trap_exit, true),
+    Port = open_port({spawn, ExtPrg}, [{packet, 2}]),
+    loop(Port).
 
-loop(Port) ->
+loop(Port) ->
     receive
-	{call, Caller, Msg} ->
-	    Port ! {self(), {command, encode(Msg)}},
+	{call, Caller, Msg} ->
+	    Port ! {self(), {command, encode(Msg)}},
 	    receive
-		{Port, {data, Data}} ->
-		    Caller ! {complex, decode(Data)}
+		{Port, {data, Data}} ->
+		    Caller ! {complex, decode(Data)}
 	    end,
-	    loop(Port);
+	    loop(Port);
 	stop ->
-	    Port ! {self(), close},
+	    Port ! {self(), close},
 	    receive
-		{Port, closed} ->
-		    exit(normal)
+		{Port, closed} ->
+		    exit(normal)
 	    end;
-	{'EXIT', Port, Reason} ->
-	    exit(port_terminated)
+	{'EXIT', Port, Reason} ->
+	    exit(port_terminated)
     end.
 
-encode({foo, X}) -> [1, X];
-encode({bar, Y}) -> [2, Y].
+encode({foo, X}) -> [1, X];
+encode({bar, Y}) -> [2, Y].
 
-decode([Int]) -> Int.

There are two differences when using Erl_Interface on the C side compared to the +decode([Int]) -> Int.

There are two differences when using Erl_Interface on the C side compared to the example in Ports, using only the plain port:

  • As Erl_Interface operates on the Erlang external term format, the port must be set to use binaries.
  • Instead of inventing an encoding/decoding scheme, the term_to_binary/1 and -binary_to_term/1 BIFs are to be used.

That is:

open_port({spawn, ExtPrg}, [{packet, 2}])

is replaced with:

open_port({spawn, ExtPrg}, [{packet, 2}, binary])

And:

Port ! {self(), {command, encode(Msg)}},
+binary_to_term/1 BIFs are to be used.

That is:

open_port({spawn, ExtPrg}, [{packet, 2}])

is replaced with:

open_port({spawn, ExtPrg}, [{packet, 2}, binary])

And:

Port ! {self(), {command, encode(Msg)}},
 receive
-  {Port, {data, Data}} ->
-    Caller ! {complex, decode(Data)}
-end

is replaced with:

Port ! {self(), {command, term_to_binary(Msg)}},
+  {Port, {data, Data}} ->
+    Caller ! {complex, decode(Data)}
+end

is replaced with:

Port ! {self(), {command, term_to_binary(Msg)}},
 receive
-  {Port, {data, Data}} ->
-    Caller ! {complex, binary_to_term(Data)}
-end

The resulting Erlang program is as follows:

-module(complex2).
--export([start/1, stop/0, init/1]).
--export([foo/1, bar/1]).
-
-start(ExtPrg) ->
-    spawn(?MODULE, init, [ExtPrg]).
-stop() ->
+  {Port, {data, Data}} ->
+    Caller ! {complex, binary_to_term(Data)}
+end

The resulting Erlang program is as follows:

-module(complex2).
+-export([start/1, stop/0, init/1]).
+-export([foo/1, bar/1]).
+
+start(ExtPrg) ->
+    spawn(?MODULE, init, [ExtPrg]).
+stop() ->
     complex ! stop.
 
-foo(X) ->
-    call_port({foo, X}).
-bar(Y) ->
-    call_port({bar, Y}).
+foo(X) ->
+    call_port({foo, X}).
+bar(Y) ->
+    call_port({bar, Y}).
 
-call_port(Msg) ->
-    complex ! {call, self(), Msg},
+call_port(Msg) ->
+    complex ! {call, self(), Msg},
     receive
-	{complex, Result} ->
+	{complex, Result} ->
 	    Result
     end.
 
-init(ExtPrg) ->
-    register(complex, self()),
-    process_flag(trap_exit, true),
-    Port = open_port({spawn, ExtPrg}, [{packet, 2}, binary]),
-    loop(Port).
+init(ExtPrg) ->
+    register(complex, self()),
+    process_flag(trap_exit, true),
+    Port = open_port({spawn, ExtPrg}, [{packet, 2}, binary]),
+    loop(Port).
 
-loop(Port) ->
+loop(Port) ->
     receive
-	{call, Caller, Msg} ->
-	    Port ! {self(), {command, term_to_binary(Msg)}},
+	{call, Caller, Msg} ->
+	    Port ! {self(), {command, term_to_binary(Msg)}},
 	    receive
-		{Port, {data, Data}} ->
-		    Caller ! {complex, binary_to_term(Data)}
+		{Port, {data, Data}} ->
+		    Caller ! {complex, binary_to_term(Data)}
 	    end,
-	    loop(Port);
+	    loop(Port);
 	stop ->
-	    Port ! {self(), close},
+	    Port ! {self(), close},
 	    receive
-		{Port, closed} ->
-		    exit(normal)
+		{Port, closed} ->
+		    exit(normal)
 	    end;
-	{'EXIT', Port, Reason} ->
-	    exit(port_terminated)
+	{'EXIT', Port, Reason} ->
+	    exit(port_terminated)
     end.

Notice that calling complex2:foo/1 and complex2:bar/1 results in the tuple {foo,X} or {bar,Y} being sent to the complex process, which codes them as binaries and sends them to the port. This means that the C program must be able @@ -153,53 +153,53 @@ typedef unsigned char byte; -int read_cmd(byte *buf); -int write_cmd(byte *buf, int len); -int foo(int x); -int bar(int y); - -static void fail(int place) { - fprintf(stderr, "Something went wrong %d\n", place); - exit(1); -} +int read_cmd(byte *buf); +int write_cmd(byte *buf, int len); +int foo(int x); +int bar(int y); /usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/error_logging.xhtml differs (HTML document, ASCII text, with very long lines) --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/error_logging.xhtml" 2025-05-10 20:18:56.921079961 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/error_logging.xhtml" 2025-05-10 20:18:56.941080142 +0000 @@ -52,7 +52,7 @@ logger_sasl_compatible to true. For more information, see SASL Error Logging in the SASL User's Guide.

% erl -kernel logger_level info
-Erlang/OTP 21 [erts-10.0] [source-13c50db] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]
+Erlang/OTP 21 [erts-10.0] [source-13c50db] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]
 
 =PROGRESS REPORT==== 8-Jun-2018::16:54:19.916404 ===
     application: kernel
@@ -61,22 +61,22 @@
     application: stdlib
     started_at: nonode@nohost
 =PROGRESS REPORT==== 8-Jun-2018::16:54:19.925755 ===
-    supervisor: {local,kernel_safe_sup}
-    started: [{pid,<0.74.0>},
-              {id,disk_log_sup},
-              {mfargs,{disk_log_sup,start_link,[]}},
-              {restart_type,permanent},
-              {shutdown,1000},
-              {child_type,supervisor}]
+    supervisor: {local,kernel_safe_sup}
+    started: [{pid,<0.74.0>},
+              {id,disk_log_sup},
+              {mfargs,{disk_log_sup,start_link,[]}},
+              {restart_type,permanent},
+              {shutdown,1000},
+              {child_type,supervisor}]
 =PROGRESS REPORT==== 8-Jun-2018::16:54:19.926056 ===
-    supervisor: {local,kernel_safe_sup}
-    started: [{pid,<0.75.0>},
-              {id,disk_log_server},
-              {mfargs,{disk_log_server,start_link,[]}},
-              {restart_type,permanent},
-              {shutdown,2000},
-              {child_type,worker}]
-Eshell V10.0  (abort with ^G)
+    supervisor: {local,kernel_safe_sup}
+    started: [{pid,<0.75.0>},
+              {id,disk_log_server},
+              {mfargs,{disk_log_server,start_link,[]}},
+              {restart_type,permanent},
+              {shutdown,2000},
+              {child_type,worker}]
+Eshell V10.0  (abort with ^G)
 1>
/usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/errors.xhtml differs (HTML document, ASCII text, with very long lines) --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/errors.xhtml" 2025-05-10 20:18:56.921079961 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/errors.xhtml" 2025-05-10 20:18:56.941080142 +0000 @@ -60,14 +60,14 @@ Exit Reason), and a stack trace (which aids in finding the code location of the exception).

The stack trace can be bound to a variable from within a try expression for any exception class, or as part of the exit reason when a run-time error is -caught by a catch. Example:

> {'EXIT',{test,Stacktrace}} = (catch error(test)), Stacktrace.
-[{shell,apply_fun,3,[]},
- {erl_eval,do_apply,6,[]},
- ...]
-> try throw(test) catch Class:Reason:Stacktrace -> Stacktrace end.
-[{shell,apply_fun,3,[]},
- {erl_eval,do_apply,6,[]},
- ...]

+caught by a catch. Example:

> {'EXIT',{test,Stacktrace}} = (catch error(test)), Stacktrace.
+[{shell,apply_fun,3,[]},
+ {erl_eval,do_apply,6,[]},
+ ...]
+> try throw(test) catch Class:Reason:Stacktrace -> Stacktrace end.
+[{shell,apply_fun,3,[]},
+ {erl_eval,do_apply,6,[]},
+ ...]

/usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/events.xhtml differs (HTML document, ASCII text, with very long lines) --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/events.xhtml" 2025-05-10 20:18:56.921079961 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/events.xhtml" 2025-05-10 20:18:56.941080142 +0000 @@ -44,35 +44,35 @@ Example

The callback module for the event handler writing error messages to the terminal -can look as follows:

-module(terminal_logger).
--behaviour(gen_event).
+can look as follows:

-module(terminal_logger).
+-behaviour(gen_event).
 
--export([init/1, handle_event/2, terminate/2]).
+-export([init/1, handle_event/2, terminate/2]).
 
-init(_Args) ->
-    {ok, []}.
+init(_Args) ->
+    {ok, []}.
 
-handle_event(ErrorMsg, State) ->
-    io:format("***Error*** ~p~n", [ErrorMsg]),
-    {ok, State}.
+handle_event(ErrorMsg, State) ->
+    io:format("***Error*** ~p~n", [ErrorMsg]),
+    {ok, State}.
 
-terminate(_Args, _State) ->
+terminate(_Args, _State) ->
     ok.

The callback module for the event handler writing error messages to a file can -look as follows:

-module(file_logger).
--behaviour(gen_event).
+look as follows:

-module(file_logger).
+-behaviour(gen_event).
 
--export([init/1, handle_event/2, terminate/2]).
+-export([init/1, handle_event/2, terminate/2]).
 
-init(File) ->
-    {ok, Fd} = file:open(File, read),
-    {ok, Fd}.
-
-handle_event(ErrorMsg, Fd) ->
-    io:format(Fd, "***Error*** ~p~n", [ErrorMsg]),
-    {ok, Fd}.
+init(File) ->
+    {ok, Fd} = file:open(File, read),
+    {ok, Fd}.
+
+handle_event(ErrorMsg, Fd) ->
+    io:format(Fd, "***Error*** ~p~n", [ErrorMsg]),
+    {ok, Fd}.
 
-terminate(_Args, Fd) ->
-    file:close(Fd).

The code is explained in the next sections.

+terminate(_Args, Fd) -> + file:close(Fd).

The code is explained in the next sections.

@@ -93,19 +93,19 @@ Adding an Event Handler

The following example shows how to start an event manager and add an event -handler to it by using the shell:

1> gen_event:start({local, error_man}).
-{ok,<0.31.0>}
-2> gen_event:add_handler(error_man, terminal_logger, []).
+handler to it by using the shell:

1> gen_event:start({local, error_man}).
+{ok,<0.31.0>}
+2> gen_event:add_handler(error_man, terminal_logger, []).
 ok

This function sends a message to the event manager registered as error_man, telling it to add the event handler terminal_logger. The event manager calls the callback function terminal_logger:init([]), where the argument [] is the third argument to add_handler. init/1 is expected to return {ok, State}, -where State is the internal state of the event handler.

init(_Args) ->
-    {ok, []}.

Here, init/1 does not need any input data and ignores its argument. For +where State is the internal state of the event handler.

init(_Args) ->
+    {ok, []}.

Here, init/1 does not need any input data and ignores its argument. For terminal_logger, the internal state is not used. For file_logger, the -internal state is used to save the open file descriptor.

init(File) ->
-    {ok, Fd} = file:open(File, read),
-    {ok, Fd}.

+internal state is used to save the open file descriptor.

init(File) ->
+    {ok, Fd} = file:open(File, read),
+    {ok, Fd}.

@@ -117,25 +117,25 @@ is received, the event manager calls handle_event(Event, State) for each installed event handler, in the same order as they were added. The function is expected to return a tuple {ok,State1}, where State1 is a new value for the -state of the event handler.

In terminal_logger:

handle_event(ErrorMsg, State) ->
-    io:format("***Error*** ~p~n", [ErrorMsg]),
-    {ok, State}.

In file_logger:

handle_event(ErrorMsg, Fd) ->
-    io:format(Fd, "***Error*** ~p~n", [ErrorMsg]),
-    {ok, Fd}.

+state of the event handler.

In terminal_logger:

handle_event(ErrorMsg, State) ->
+    io:format("***Error*** ~p~n", [ErrorMsg]),
+    {ok, State}.

In file_logger:

handle_event(ErrorMsg, Fd) ->
+    io:format(Fd, "***Error*** ~p~n", [ErrorMsg]),
+    {ok, Fd}.

Deleting an Event Handler

-
4> gen_event:delete_handler(error_man, terminal_logger, []).
+
4> gen_event:delete_handler(error_man, terminal_logger, []).
 ok

This function sends a message to the event manager registered as error_man, telling it to delete the event handler terminal_logger. The event manager calls the callback function terminal_logger:terminate([], State), where the argument [] is the third argument to delete_handler. terminate/2 is to be the opposite of init/1 and do any necessary cleaning up. Its return value is -ignored.

For terminal_logger, no cleaning up is necessary:

terminate(_Args, _State) ->
-    ok.

For file_logger, the file descriptor opened in init must be closed:

terminate(_Args, Fd) ->
-    file:close(Fd).

+ignored.

For terminal_logger, no cleaning up is necessary:

terminate(_Args, _State) ->
+    ok.

For file_logger, the file descriptor opened in init must be closed:

terminate(_Args, Fd) ->
+    file:close(Fd).

@@ -158,7 +158,7 @@ Standalone Event Managers

-

An event manager can also be stopped by calling:

1> gen_event:stop(error_man).
+

An event manager can also be stopped by calling:

1> gen_event:stop(error_man).
 ok

@@ -170,13 +170,13 @@ implemented to handle them. Examples of other messages are exit messages if the event manager is linked to other processes than the supervisor (for example via gen_event:add_sup_handler/3) and is -trapping exit signals.

handle_info({'EXIT', Pid, Reason}, State) ->
+trapping exit signals.

handle_info({'EXIT', Pid, Reason}, State) ->
     %% Code to handle exits here.
     ...
-    {noreply, State1}.

The final function to implement is code_change/3:

code_change(OldVsn, State, Extra) ->
+    {noreply, State1}.

The final function to implement is code_change/3:

code_change(OldVsn, State, Extra) ->
     %% Code to convert state (and more) during code change.
     ...
-    {ok, NewState}.
+
{ok, NewState}.
/usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/example.xhtml differs (HTML document, ASCII text, with very long lines) --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/example.xhtml" 2025-05-10 20:18:56.921079961 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/example.xhtml" 2025-05-10 20:18:56.941080142 +0000 @@ -30,17 +30,17 @@ code, solving a complex problem, in your Erlang program. Suppose for example, that you have the following C functions that you would like to call from Erlang:

/* complex.c */
 
-int foo(int x) {
+int foo(int x) {
   return x+1;
-}
+}
 
-int bar(int y) {
+int bar(int y) {
   return y*2;
-}

The functions are deliberately kept as simple as possible, for readability +}

The functions are deliberately kept as simple as possible, for readability reasons.

From an Erlang perspective, it is preferable to be able to call foo and bar without having to bother about that they are C functions:

% Erlang code
 ...
-Res = complex:foo(X),
+Res = complex:foo(X),
 ...

Here, the communication with C is hidden in the implementation of complex.erl. In the following sections, it is shown how this module can be implemented using the different interoperability mechanisms.

/usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/expressions.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/expressions.xhtml" 2025-05-10 20:18:56.921079961 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/expressions.xhtml" 2025-05-10 20:18:56.941080142 +0000 @@ -60,12 +60,12 @@ single assignment, that is, a variable can only be bound once.

The anonymous variable is denoted by underscore (_) and can be used when a variable is required but its value can be ignored.

Example:

[H|_] = [1,2,3]

Variables starting with underscore (_), for example, _Height, are normal variables, not anonymous. However, they are ignored by the compiler in the sense -that they do not generate warnings.

Example:

The following code:

member(_, []) ->
-    [].

can be rewritten to be more readable:

member(Elem, []) ->
-    [].

This causes a warning for an unused variable, Elem. To avoid the warning, -the code can be rewritten to:

member(_Elem, []) ->
-    [].

Notice that since variables starting with an underscore are not anonymous, the -following example matches:

{_,_} = {1,2}

But this example fails:

{_N,_N} = {1,2}

The scope for a variable is its function clause. Variables bound in a branch of +that they do not generate warnings.

Example:

The following code:

member(_, []) ->
+    [].

can be rewritten to be more readable:

member(Elem, []) ->
+    [].

This causes a warning for an unused variable, Elem. To avoid the warning, +the code can be rewritten to:

member(_Elem, []) ->
+    [].

Notice that since variables starting with an underscore are not anonymous, the +following example matches:

{_,_} = {1,2}

But this example fails:

{_N,_N} = {1,2}

The scope for a variable is its function clause. Variables bound in a branch of an if, case, or receive expression must be bound in all branches to have a value outside the expression. Otherwise they are regarded as unsafe outside the expression.

For the try expression variable scoping is limited so that variables bound in @@ -76,8 +76,8 @@ Patterns

A pattern has the same structure as a term but can contain unbound variables.

Example:

Name1
-[H|T]
-{error,Reason}

Patterns are allowed in clause heads, case expressions, +[H|T] +{error,Reason}

Patterns are allowed in clause heads, case expressions, receive expressions, and match expressions.

@@ -87,13 +87,13 @@

If Pattern1 and Pattern2 are valid patterns, the following is also a valid pattern:

Pattern1 = Pattern2

When matched against a term, both Pattern1 and Pattern2 are matched against -the term. The idea behind this feature is to avoid reconstruction of terms.

Example:

f({connect,From,To,Number,Options}, To) ->
-    Signal = {connect,From,To,Number,Options},
+the term. The idea behind this feature is to avoid reconstruction of terms.

Example:

f({connect,From,To,Number,Options}, To) ->
+    Signal = {connect,From,To,Number,Options},
     ...;
-f(Signal, To) ->
-    ignore.

can instead be written as

f({connect,_,To,_,_} = Signal, To) ->
+f(Signal, To) ->
+    ignore.

can instead be written as

f({connect,_,To,_,_} = Signal, To) ->
     ...;
-f(Signal, To) ->
+f(Signal, To) ->
     ignore.

The compound pattern operator does not imply that its operands are matched in any particular order. That means that it is not legal to bind a variable in Pattern1 and use it in Pattern2, or vice versa.

@@ -102,15 +102,15 @@ String Prefix in Patterns

-

When matching strings, the following is a valid pattern:

f("prefix" ++ Str) -> ...

This is syntactic sugar for the equivalent, but harder to read:

f([$p,$r,$e,$f,$i,$x | Str]) -> ...

+

When matching strings, the following is a valid pattern:

f("prefix" ++ Str) -> ...

This is syntactic sugar for the equivalent, but harder to read:

f([$p,$r,$e,$f,$i,$x | Str]) -> ...

Expressions in Patterns

An arithmetic expression can be used within a pattern if it meets both of the -following two conditions:

  • It uses only numeric or bitwise operators.
  • Its value can be evaluated to a constant when complied.

Example:

case {Value, Result} of
-    {?THRESHOLD+1, ok} -> ...

+following two conditions:

  • It uses only numeric or bitwise operators.
  • Its value can be evaluated to a constant when complied.

Example:

case {Value, Result} of
+    {?THRESHOLD+1, ok} -> ...

@@ -118,15 +118,15 @@

The following matches Pattern against Expr:

Pattern = Expr

If the matching succeeds, any unbound variable in the pattern becomes bound and the value of Expr is returned.

If multiple match operators are applied in sequence, they will be evaluated from -right to left.

If the matching fails, a badmatch run-time error occurs.

Examples:

1> {A, B} = T = {answer, 42}.
-{answer,42}
+right to left.

If the matching fails, a badmatch run-time error occurs.

Examples:

1> {A, B} = T = {answer, 42}.
+{answer,42}
 2> A.
 answer
 3> B.
 42
 4> T.
-{answer,42}
-5> {C, D} = [1, 2].
+{answer,42}
+5> {C, D} = [1, 2].
 ** exception error: no match of right-hand side value [1,2]

Because multiple match operators are evaluated from right to left, it means that:

Pattern1 = Pattern2 = . . . = PatternN = Expression

is equivalent to:

Temporary = Expression,
 PatternN = Temporary,
@@ -148,20 +148,20 @@
 compound pattern matches if all of its constituent patterns match. It is not
 legal for a pattern that is part of a compound pattern to use variables (as keys
 in map patterns or sizes in binary patterns) bound in other sub patterns of the
-same compound pattern.

Examples:

1> fun(#{Key := Value} = #{key := Key}) -> Value end.
+same compound pattern.

Examples:

1> fun(#{Key := Value} = #{key := Key}) -> Value end.
 * 1:7: variable 'Key' is unbound
-2> F = fun({A, B} = E) -> {E, A + B} end, F({1,2}).
-{{1,2},3}
-3> G = fun(<<A:8,B:8>> = <<C:16>>) -> {A, B, C} end, G(<<42,43>>).
-{42,43,10795}

The match operator is allowed everywhere an expression is allowed. It is used +2> F = fun({A, B} = E) -> {E, A + B} end, F({1,2}). +{{1,2},3} +3> G = fun(<<A:8,B:8>> = <<C:16>>) -> {A, B, C} end, G(<<42,43>>). +{42,43,10795}

The match operator is allowed everywhere an expression is allowed. It is used to match the value of an expression to a pattern. If multiple match operators -are applied in sequence, they will be evaluated from right to left.

Examples:

1> M = #{key => key2, key2 => value}.
-#{key => key2,key2 => value}
-2> f(Key), #{Key := Value} = #{key := Key} = M, Value.
+are applied in sequence, they will be evaluated from right to left.

Examples:

1> M = #{key => key2, key2 => value}.
+#{key => key2,key2 => value}
+2> f(Key), #{Key := Value} = #{key := Key} = M, Value.
 value
-3> f(Key), #{Key := Value} = (#{key := Key} = M), Value.
+3> f(Key), #{Key := Value} = (#{key := Key} = M), Value.
 value
-4> f(Key), (#{Key := Value} = #{key := Key}) = M, Value.
+4> f(Key), (#{Key := Value} = #{key := Key}) = M, Value.
 * 1:12: variable 'Key' is unbound
 5> <<X:Y>> = begin Y = 8, <<42:8>> end, X.
 42

The expression at prompt 2> first matches the value of variable M against @@ -185,22 +185,22 @@ Function Calls -

ExprF(Expr1,...,ExprN)
-ExprM:ExprF(Expr1,...,ExprN)

In the first form of function calls, ExprM:ExprF(Expr1,...,ExprN), each of +

ExprF(Expr1,...,ExprN)
+ExprM:ExprF(Expr1,...,ExprN)

In the first form of function calls, ExprM:ExprF(Expr1,...,ExprN), each of ExprM and ExprF must be an atom or an expression that evaluates to an atom. The function is said to be called by using the fully qualified function name. -This is often referred to as a remote or external function call.

Example:

lists:keyfind(Name, 1, List)

In the second form of function calls, ExprF(Expr1,...,ExprN), ExprF must be +This is often referred to as a remote or external function call.

Example:

lists:keyfind(Name, 1, List)

In the second form of function calls, ExprF(Expr1,...,ExprN), ExprF must be an atom or evaluate to a fun.

If ExprF is an atom, the function is said to be called by using the implicitly qualified function name. If the function ExprF is locally defined, it is called. Alternatively, if ExprF is explicitly imported from the M module, M:ExprF(Expr1,...,ExprN) is called. If ExprF is neither declared locally nor explicitly imported, ExprF must be the name of an automatically -imported BIF.

Examples:

handle(Msg, State)
-spawn(m, init, [])

Examples where ExprF is a fun:

1> Fun1 = fun(X) -> X+1 end,
-Fun1(3).
+imported BIF.

Examples:

handle(Msg, State)
+spawn(m, init, [])

Examples where ExprF is a fun:

1> Fun1 = fun(X) -> X+1 end,
+Fun1(3).
 4
-2> fun lists:append/2([1,2], [3,4]).
-[1,2,3,4]
+2> fun lists:append/2([1,2], [3,4]).
+[1,2,3,4]
 3>

Notice that when calling a local function, there is a difference between using the implicitly or fully qualified function name. The latter always refers to the latest version of the module. See @@ -225,32 +225,32 @@ (ERTS version 5.8) and have an implicitly qualified call to that function in your code, you either need to explicitly remove the auto-import using a compiler directive, or replace the call with a fully qualified function call. Otherwise -you get a compilation error. See the following example:

-export([length/1,f/1]).
+you get a compilation error. See the following example:

-export([length/1,f/1]).
 
--compile({no_auto_import,[length/1]}). % erlang:length/1 no longer autoimported
+-compile({no_auto_import,[length/1]}). % erlang:length/1 no longer autoimported
 
-length([]) ->
+length([]) ->
     0;
-length([H|T]) ->
-    1 + length(T). %% Calls the local function length/1
+length([H|T]) ->
+    1 + length(T). %% Calls the local function length/1
 
-f(X) when erlang:length(X) > 3 -> %% Calls erlang:length/1,
+f(X) when erlang:length(X) > 3 -> %% Calls erlang:length/1,
                                   %% which is allowed in guards
     long.

The same logic applies to explicitly imported functions from other modules, as to locally defined functions. It is not allowed to both import a function from -another module and have the function declared in the module at the same time:

-export([f/1]).
+another module and have the function declared in the module at the same time:

-export([f/1]).
 
--compile({no_auto_import,[length/1]}). % erlang:length/1 no longer autoimported
+-compile({no_auto_import,[length/1]}). % erlang:length/1 no longer autoimported
 
--import(mod,[length/1]).
+-import(mod,[length/1]).
 
-f(X) when erlang:length(X) > 33 -> %% Calls erlang:length/1,
+f(X) when erlang:length(X) > 33 -> %% Calls erlang:length/1,
                                    %% which is allowed in guards
 
-    erlang:length(X);              %% Explicit call to erlang:length in body
+    erlang:length(X);              %% Explicit call to erlang:length in body
 
-f(X) ->
-    length(X).                     %% mod:length/1 is called

For auto-imported BIFs added in Erlang/OTP R14A and thereafter, overriding the +f(X) -> + length(X). %% mod:length/1 is called

For auto-imported BIFs added in Erlang/OTP R14A and thereafter, overriding the name with a local function or explicit import is always allowed. However, if the -compile({no_auto_import,[F/A]) directive is not used, the compiler issues a warning whenever the function is called in the module using the implicitly @@ -270,7 +270,7 @@ sequence GuardSeq that evaluates to true is found. Then the corresponding /usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/funs.xhtml differs (HTML document, ASCII text, with very long lines) --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/funs.xhtml" 2025-05-10 20:18:56.921079961 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/funs.xhtml" 2025-05-10 20:18:56.941080142 +0000 @@ -26,14 +26,14 @@ map -

The following function, double, doubles every element in a list:

double([H|T]) -> [2*H|double(T)];
-double([])    -> [].

Hence, the argument entered as input is doubled as follows:

> double([1,2,3,4]).
-[2,4,6,8]

The following function, add_one, adds one to every element in a list:

add_one([H|T]) -> [H+1|add_one(T)];
-add_one([])    -> [].

The functions double and add_one have a similar structure. This can be used -by writing a function map that expresses this similarity:

map(F, [H|T]) -> [F(H)|map(F, T)];
-map(F, [])    -> [].

The functions double and add_one can now be expressed in terms of map as -follows:

double(L)  -> map(fun(X) -> 2*X end, L).
-add_one(L) -> map(fun(X) -> 1 + X end, L).

map(F, List) is a function that takes a function F and a list L as +

The following function, double, doubles every element in a list:

double([H|T]) -> [2*H|double(T)];
+double([])    -> [].

Hence, the argument entered as input is doubled as follows:

> double([1,2,3,4]).
+[2,4,6,8]

The following function, add_one, adds one to every element in a list:

add_one([H|T]) -> [H+1|add_one(T)];
+add_one([])    -> [].

The functions double and add_one have a similar structure. This can be used +by writing a function map that expresses this similarity:

map(F, [H|T]) -> [F(H)|map(F, T)];
+map(F, [])    -> [].

The functions double and add_one can now be expressed in terms of map as +follows:

double(L)  -> map(fun(X) -> 2*X end, L).
+add_one(L) -> map(fun(X) -> 1 + X end, L).

map(F, List) is a function that takes a function F and a list L as arguments and returns a new list, obtained by applying F to each of the elements in L.

The process of abstracting out the common features of a number of different programs is called procedural abstraction. Procedural abstraction can be used @@ -47,21 +47,21 @@ foreach

This section illustrates procedural abstraction. Initially, the following two -examples are written as conventional functions.

This function prints all elements of a list onto a stream:

print_list(Stream, [H|T]) ->
-    io:format(Stream, "~p~n", [H]),
-    print_list(Stream, T);
-print_list(Stream, []) ->
-    true.

This function broadcasts a message to a list of processes:

broadcast(Msg, [Pid|Pids]) ->
+examples are written as conventional functions.

This function prints all elements of a list onto a stream:

print_list(Stream, [H|T]) ->
+    io:format(Stream, "~p~n", [H]),
+    print_list(Stream, T);
+print_list(Stream, []) ->
+    true.

This function broadcasts a message to a list of processes:

broadcast(Msg, [Pid|Pids]) ->
     Pid ! Msg,
-    broadcast(Msg, Pids);
-broadcast(_, []) ->
+    broadcast(Msg, Pids);
+broadcast(_, []) ->
     true.

These two functions have a similar structure. They both iterate over a list and do something to each element in the list. The "something" is passed on as an -extra argument to the function that does this.

The function foreach expresses this similarity:

foreach(F, [H|T]) ->
-    F(H),
-    foreach(F, T);
-foreach(F, []) ->
-    ok.

Using the function foreach, the function print_list becomes:

foreach(fun(H) -> io:format(S, "~p~n",[H]) end, L)

Using the function foreach, the function broadcast becomes:

foreach(fun(Pid) -> Pid ! M end, L)

foreach is evaluated for its side-effect and not its value. foreach(Fun ,L) +extra argument to the function that does this.

The function foreach expresses this similarity:

foreach(F, [H|T]) ->
+    F(H),
+    foreach(F, T);
+foreach(F, []) ->
+    ok.

Using the function foreach, the function print_list becomes:

foreach(fun(H) -> io:format(S, "~p~n",[H]) end, L)

Using the function foreach, the function broadcast becomes:

foreach(fun(Pid) -> Pid ! M end, L)

foreach is evaluated for its side-effect and not its value. foreach(Fun ,L) calls Fun(X) for each element X in L and the processing occurs in the order that the elements were defined in L. map does not define the order in which its elements are processed.

@@ -71,24 +71,24 @@ Syntax of Funs

Funs are written with the following syntax (see -Fun Expressions for full description):

F = fun (Arg1, Arg2, ... ArgN) ->
+Fun Expressions for full description):

F = fun (Arg1, Arg2, ... ArgN) ->
         ...
     end

This creates an anonymous function of N arguments and binds it to the variable F.

Another function, FunctionName, written in the same module, can be passed as an argument, using the following syntax:

F = fun FunctionName/Arity

With this form of function reference, the function that is referred to does not need to be exported from the module.

It is also possible to refer to a function defined in a different module, with -the following syntax:

F = fun Module:FunctionName/Arity

In this case, the function must be exported from the module in question.

The following program illustrates the different ways of creating funs:

-module(fun_test).
--export([t1/0, t2/0]).
--import(lists, [map/2]).
+the following syntax:

F = fun Module:FunctionName/Arity

In this case, the function must be exported from the module in question.

The following program illustrates the different ways of creating funs:

-module(fun_test).
+-export([t1/0, t2/0]).
+-import(lists, [map/2]).
 
-t1() -> map(fun(X) -> 2 * X end, [1,2,3,4,5]).
+t1() -> map(fun(X) -> 2 * X end, [1,2,3,4,5]).
 
-t2() -> map(fun double/1, [1,2,3,4,5]).
+t2() -> map(fun double/1, [1,2,3,4,5]).
 
-double(X) -> X * 2.

The fun F can be evaluated with the following syntax:

F(Arg1, Arg2, ..., Argn)

To check whether a term is a fun, use the test -is_function/1 in a guard.

Example:

f(F, Args) when is_function(F) ->
-   apply(F, Args);
-f(N, _) when is_integer(N) ->
+double(X) -> X * 2.

The fun F can be evaluated with the following syntax:

F(Arg1, Arg2, ..., Argn)

To check whether a term is a fun, use the test +is_function/1 in a guard.

Example:

f(F, Args) when is_function(F) ->
+   apply(F, Args);
+f(N, _) when is_integer(N) ->
    N.

Funs are a distinct type. The BIFs erlang:fun_info/1,2 can be used to retrieve information about a fun, and the BIF erlang:fun_to_list/1 returns a textual representation of a fun. The check_process_code/2 @@ -101,18 +101,18 @@

The scope rules for variables that occur in funs are as follows:

  • All variables that occur in the head of a fun are assumed to be "fresh" variables.
  • Variables that are defined before the fun, and that occur in function calls or -guard tests within the fun, have the values they had outside the fun.
  • Variables cannot be exported from a fun.

The following examples illustrate these rules:

print_list(File, List) ->
-    {ok, Stream} = file:open(File, write),
-    foreach(fun(X) -> io:format(Stream,"~p~n",[X]) end, List),
-    file:close(Stream).

Here, the variable X, defined in the head of the fun, is a new variable. The +guard tests within the fun, have the values they had outside the fun.

  • Variables cannot be exported from a fun.
  • The following examples illustrate these rules:

    print_list(File, List) ->
    +    {ok, Stream} = file:open(File, write),
    +    foreach(fun(X) -> io:format(Stream,"~p~n",[X]) end, List),
    +    file:close(Stream).

    Here, the variable X, defined in the head of the fun, is a new variable. The variable Stream, which is used within the fun, gets its value from the file:open line.

    As any variable that occurs in the head of a fun is considered a new variable, -it is equally valid to write as follows:

    print_list(File, List) ->
    -    {ok, Stream} = file:open(File, write),
    -    foreach(fun(File) ->
    -                io:format(Stream,"~p~n",[File])
    -            end, List),
    -    file:close(Stream).

    Here, File is used as the new variable instead of X. This is not so wise +it is equally valid to write as follows:

    print_list(File, List) ->
    +    {ok, Stream} = file:open(File, write),
    +    foreach(fun(File) ->
    +                io:format(Stream,"~p~n",[File])
    +            end, List),
    +    file:close(Stream).

    Here, File is used as the new variable instead of X. This is not so wise because code in the fun body cannot refer to the variable File, which is defined outside of the fun. Compiling this example gives the following diagnostic:

    ./FileName.erl:Line: Warning: variable 'File'
    @@ -121,20 +121,20 @@
     pattern matching operations must be moved into guard expressions and cannot be
     written in the head of the fun. For example, you might write the following code
     if you intend the first clause of F to be evaluated when the value of its
    -argument is Y:

    f(...) ->
    +argument is Y:

    f(...) ->
         Y = ...
    -    map(fun(X) when X == Y ->
    +    map(fun(X) when X == Y ->
                  ;
    -           (_) ->
    +           (_) ->
                  ...
    -        end, ...)
    -    ...

    instead of writing the following code:

    f(...) ->
    +        end, ...)
    +    ...

    instead of writing the following code:

    f(...) ->
         Y = ...
    -    map(fun(Y) ->
    +    map(fun(Y) ->
                  ;
    -           (_) ->
    +           (_) ->
                  ...
    -        end, ...)
    +        end, ...)
         ...

    @@ -148,58 +148,58 @@ map

    -

    lists:map/2 takes a function of one argument and a list of terms:

    map(F, [H|T]) -> [F(H)|map(F, T)];
    -map(F, [])    -> [].

    It returns the list obtained by applying the function to every argument in the +

    lists:map/2 takes a function of one argument and a list of terms:

    map(F, [H|T]) -> [F(H)|map(F, T)];
    +map(F, [])    -> [].

    It returns the list obtained by applying the function to every argument in the list.

    When a new fun is defined in the shell, the value of the fun is printed as -Fun#<erl_eval>:

    > Double = fun(X) -> 2 * X end.
    +Fun#<erl_eval>:

    > Double = fun(X) -> 2 * X end.
     #Fun<erl_eval.6.72228031>
    -> lists:map(Double, [1,2,3,4,5]).
    -[2,4,6,8,10]

    +> lists:map(Double, [1,2,3,4,5]). +[2,4,6,8,10]

    any

    -

    lists:any/2 takes a predicate P of one argument and a list of terms:

    any(Pred, [H|T]) ->
    -    case Pred(H) of
    +

    lists:any/2 takes a predicate P of one argument and a list of terms:

    any(Pred, [H|T]) ->
    +    case Pred(H) of
             true  ->  true;
    -        false ->  any(Pred, T)
    +        false ->  any(Pred, T)
         end;
    -any(Pred, []) ->
    +any(Pred, []) ->
         false.

    A predicate is a function that returns true or false. any is true if there is a term X in the list such that P(X) is true.

    A predicate Big(X) is defined, which is true if its argument is greater that -10:

    > Big =  fun(X) -> if X > 10 -> true; true -> false end end.
    +10:

    > Big =  fun(X) -> if X > 10 -> true; true -> false end end.
     #Fun<erl_eval.6.72228031>
    -> lists:any(Big, [1,2,3,4]).
    +> lists:any(Big, [1,2,3,4]).
     false
    -> lists:any(Big, [1,2,3,12,5]).
    +> lists:any(Big, [1,2,3,12,5]).
     true

    all

    -

    lists:all/2 has the same arguments as any:

    all(Pred, [H|T]) ->
    /usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/gen_server_concepts.xhtml differs (HTML document, ASCII text, with very long lines)
    --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/gen_server_concepts.xhtml"	2025-05-10 20:18:56.921079961 +0000
    +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/gen_server_concepts.xhtml"	2025-05-10 20:18:56.937080106 +0000
    @@ -66,40 +66,40 @@
     
     

    An example of a simple server written in plain Erlang is provided in Overview. The server can be reimplemented using -gen_server, resulting in this callback module:

    -module(ch3).
    --behaviour(gen_server).
    +gen_server, resulting in this callback module:

    -module(ch3).
    +-behaviour(gen_server).
     
    --export([start_link/0]).
    --export([alloc/0, free/1]).
    --export([init/1, handle_call/3, handle_cast/2]).
    +-export([start_link/0]).
    +-export([alloc/0, free/1]).
    +-export([init/1, handle_call/3, handle_cast/2]).
     
    -start_link() ->
    -    gen_server:start_link({local, ch3}, ch3, [], []).
    +start_link() ->
    +    gen_server:start_link({local, ch3}, ch3, [], []).
     
    -alloc() ->
    -    gen_server:call(ch3, alloc).
    +alloc() ->
    +    gen_server:call(ch3, alloc).
     
    -free(Ch) ->
    -    gen_server:cast(ch3, {free, Ch}).
    +free(Ch) ->
    +    gen_server:cast(ch3, {free, Ch}).
     
    -init(_Args) ->
    -    {ok, channels()}.
    +init(_Args) ->
    +    {ok, channels()}.
     
    -handle_call(alloc, _From, Chs) ->
    -    {Ch, Chs2} = alloc(Chs),
    -    {reply, Ch, Chs2}.
    +handle_call(alloc, _From, Chs) ->
    +    {Ch, Chs2} = alloc(Chs),
    +    {reply, Ch, Chs2}.
     
    -handle_cast({free, Ch}, Chs) ->
    -    Chs2 = free(Ch, Chs),
    -    {noreply, Chs2}.

    The code is explained in the next sections.

    +handle_cast({free, Ch}, Chs) -> + Chs2 = free(Ch, Chs), + {noreply, Chs2}.

    The code is explained in the next sections.

    Starting a Gen_Server

    In the example in the previous section, gen_server is started by calling -ch3:start_link():

    start_link() ->
    -    gen_server:start_link({local, ch3}, ch3, [], []) => {ok, Pid}

    start_link/0 calls function gen_server:start_link/4. This function +ch3:start_link():

    start_link() ->
    +    gen_server:start_link({local, ch3}, ch3, [], []) => {ok, Pid}

    start_link/0 calls function gen_server:start_link/4. This function spawns and links to a new process, a gen_server.

    • The first argument, {local, ch3}, specifies the name. The gen_server is then locally registered as ch3.

      If the name is omitted, the gen_server is not registered. Instead its pid must be used. The name can also be given as {global, Name}, in which case @@ -113,8 +113,8 @@ for the available options.

    If name registration succeeds, the new gen_server process calls the callback function ch3:init([]). init is expected to return {ok, State}, where State is the internal state of the gen_server. In this case, the state is -the available channels.

    init(_Args) ->
    -    {ok, channels()}.

    gen_server:start_link/4 is synchronous. It does not return until the +the available channels.

    init(_Args) ->
    +    {ok, channels()}.

    gen_server:start_link/4 is synchronous. It does not return until the gen_server has been initialized and is ready to receive requests.

    gen_server:start_link/4 must be used if the gen_server is part of a supervision tree, meaning that it was started by a supervisor. There is another function, gen_server:start/4, to start a standalone @@ -130,9 +130,9 @@ When the request is received, the gen_server calls handle_call(Request, From, State), which is expected to return a tuple {reply,Reply,State1}. Reply is the reply that is to be sent back -to the client, and State1 is a new value for the state of the gen_server.

    handle_call(alloc, _From, Chs) ->
    -    {Ch, Chs2} = alloc(Chs),
    -    {reply, Ch, Chs2}.

    In this case, the reply is the allocated channel Ch and the new state is the +to the client, and State1 is a new value for the state of the gen_server.

    handle_call(alloc, _From, Chs) ->
    +    {Ch, Chs2} = alloc(Chs),
    +    {reply, Ch, Chs2}.

    In this case, the reply is the allocated channel Ch and the new state is the set of remaining available channels Chs2.

    Thus, the call ch3:alloc() returns the allocated channel Ch and the gen_server then waits for new requests, now with an updated list of available channels.

    @@ -141,13 +141,13 @@ Asynchronous Requests - Cast

    -

    The asynchronous request free(Ch) is implemented using gen_server:cast/2:

    free(Ch) ->
    -    gen_server:cast(ch3, {free, Ch}).

    ch3 is the name of the gen_server. {free, Ch} is the actual request.

    The request is made into a message and sent to the gen_server. +

    The asynchronous request free(Ch) is implemented using gen_server:cast/2:

    free(Ch) ->
    +    gen_server:cast(ch3, {free, Ch}).

    ch3 is the name of the gen_server. {free, Ch} is the actual request.

    The request is made into a message and sent to the gen_server. cast, and thus free, then returns ok.

    When the request is received, the gen_server calls handle_cast(Request, State), which is expected to return a tuple -{noreply,State1}. State1 is a new value for the state of the gen_server.

    handle_cast({free, Ch}, Chs) ->
    -    Chs2 = free(Ch, Chs),
    -    {noreply, Chs2}.

    In this case, the new state is the updated list of available channels Chs2. +{noreply,State1}. State1 is a new value for the state of the gen_server.

    handle_cast({free, Ch}, Chs) ->
    +    Chs2 = free(Ch, Chs),
    +    {noreply, Chs2}.

    In this case, the new state is the updated list of available channels Chs2. The gen_server is now ready for new requests.

    @@ -166,15 +166,15 @@ set in the supervisor.

    If it is necessary to clean up before termination, the shutdown strategy must be a time-out value and the gen_server must be set to trap exit signals in function init. When ordered to shutdown, the gen_server then calls -the callback function terminate(shutdown, State):

    init(Args) ->
    +the callback function terminate(shutdown, State):

    init(Args) ->
         ...,
    -    process_flag(trap_exit, true),
    +    process_flag(trap_exit, true),
         ...,
    -    {ok, State}.
    +    {ok, State}.
     
     ...
     
    -terminate(shutdown, State) ->
    +terminate(shutdown, State) ->
         %% Code for cleaning up here
         ...
         ok.

    @@ -185,21 +185,21 @@

    If the gen_server is not part of a supervision tree, a stop function can be useful, for example:

    ...
    -export([stop/0]).
    +export([stop/0]).
     ...
     
    -stop() ->
    -    gen_server:cast(ch3, stop).
    +stop() ->
    +    gen_server:cast(ch3, stop).
     ...
     
    -handle_cast(stop, State) ->
    -    {stop, normal, State};
    -handle_cast({free, Ch}, State) ->
    +handle_cast(stop, State) ->
    +    {stop, normal, State};
    +handle_cast({free, Ch}, State) ->
         ...
     
     ...
     
    -terminate(normal, State) ->
    +terminate(normal, State) ->
         ok.

    The callback function handling the stop request returns a tuple {stop,normal,State1}, where normal specifies that it is a normal termination and State1 is a new value for the state @@ -214,13 +214,13 @@ the callback function handle_info(Info, State) must be implemented to handle them. Examples of other messages are exit messages, if the gen_server is linked to other processes than the supervisor -and it is trapping exit signals.

    handle_info({'EXIT', Pid, Reason}, State) ->
    +and it is trapping exit signals.

    handle_info({'EXIT', Pid, Reason}, State) ->
         %% Code to handle exits here.
         ...
    -    {noreply, State1}.

    The final function to implement is code_change/3:

    code_change(OldVsn, State, Extra) ->
    +    {noreply, State1}.

    The final function to implement is code_change/3:

    code_change(OldVsn, State, Extra) ->
         %% Code to convert state (and more) during code change.
         ...
    -    {ok, NewState}.
    +
    {ok, NewState}.
    /usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/included_applications.xhtml differs (HTML document, ASCII text, with very long lines) --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/included_applications.xhtml" 2025-05-10 20:18:56.921079961 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/included_applications.xhtml" 2025-05-10 20:18:56.937080106 +0000 @@ -70,16 +70,16 @@ Specifying Included Applications

    Which applications to include is defined by the included_applications key in -the .app file:

    {application, prim_app,
    - [{description, "Tree application"},
    -  {vsn, "1"},
    -  {modules, [prim_app_cb, prim_app_sup, prim_app_server]},
    -  {registered, [prim_app_server]},
    -  {included_applications, [incl_app]},
    -  {applications, [kernel, stdlib, sasl]},
    -  {mod, {prim_app_cb,[]}},
    -  {env, [{file, "/usr/local/log"}]}
    - ]}.

    +the .app file:

    {application, prim_app,
    + [{description, "Tree application"},
    +  {vsn, "1"},
    +  {modules, [prim_app_cb, prim_app_sup, prim_app_server]},
    +  {registered, [prim_app_server]},
    +  {included_applications, [incl_app]},
    +  {applications, [kernel, stdlib, sasl]},
    +  {mod, {prim_app_cb,[]}},
    +  {env, [{file, "/usr/local/log"}]}
    + ]}.

    @@ -93,27 +93,27 @@ term.

    The value of the mod key of the including application must be set to {application_starter,[Module,StartArgs]}, where Module as usual is the application callback module. StartArgs is a term provided as argument to the -callback function Module:start/2:

    {application, prim_app,
    - [{description, "Tree application"},
    -  {vsn, "1"},
    -  {modules, [prim_app_cb, prim_app_sup, prim_app_server]},
    -  {registered, [prim_app_server]},
    -  {included_applications, [incl_app]},
    -  {start_phases, [{init,[]}, {go,[]}]},
    -  {applications, [kernel, stdlib, sasl]},
    -  {mod, {application_starter,[prim_app_cb,[]]}},
    -  {env, [{file, "/usr/local/log"}]}
    - ]}.
    +callback function Module:start/2:

    {application, prim_app,
    + [{description, "Tree application"},
    +  {vsn, "1"},
    +  {modules, [prim_app_cb, prim_app_sup, prim_app_server]},
    +  {registered, [prim_app_server]},
    +  {included_applications, [incl_app]},
    +  {start_phases, [{init,[]}, {go,[]}]},
    +  {applications, [kernel, stdlib, sasl]},
    +  {mod, {application_starter,[prim_app_cb,[]]}},
    +  {env, [{file, "/usr/local/log"}]}
    + ]}.
     
    -{application, incl_app,
    - [{description, "Included application"},
    -  {vsn, "1"},
    -  {modules, [incl_app_cb, incl_app_sup, incl_app_server]},
    -  {registered, []},
    -  {start_phases, [{go,[]}]},
    -  {applications, [kernel, stdlib, sasl]},
    -  {mod, {incl_app_cb,[]}}
    - ]}.

    When starting a primary application with included applications, the primary +{application, incl_app, + [{description, "Included application"}, + {vsn, "1"}, + {modules, [incl_app_cb, incl_app_sup, incl_app_server]}, + {registered, []}, + {start_phases, [{go,[]}]}, + {applications, [kernel, stdlib, sasl]}, + {mod, {incl_app_cb,[]}} + ]}.

    When starting a primary application with included applications, the primary application is started the normal way, that is:

    • The application controller creates an application master for the application
    • The application master calls Module:start(normal, StartArgs) to start the top supervisor.

    Then, for the primary application and each included application in top-down, left-to-right order, the application master calls @@ -126,11 +126,11 @@ of specified phases must be a subset of the set of phases specified for the primary application.

    When starting prim_app as defined above, the application controller calls the following callback functions before application:start(prim_app) returns a -value:

    application:start(prim_app)
    - => prim_app_cb:start(normal, [])
    - => prim_app_cb:start_phase(init, normal, [])
    - => prim_app_cb:start_phase(go, normal, [])
    - => incl_app_cb:start_phase(go, normal, [])
    +value:

    application:start(prim_app)
    + => prim_app_cb:start(normal, [])
    + => prim_app_cb:start_phase(init, normal, [])
    + => prim_app_cb:start_phase(go, normal, [])
    + => incl_app_cb:start_phase(go, normal, [])
     ok
    /usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/install-win32.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/install-win32.xhtml" 2025-05-10 20:18:56.921079961 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/install-win32.xhtml" 2025-05-10 20:18:56.937080106 +0000 @@ -204,7 +204,7 @@

    and sometimes

    $ cd $ERL_TOP
     $ make local_setup
     

    So now when you run $ERL_TOP/erl.exe, you should have a debug compiled -emulator, which you will see if you do a:

    1> erlang:system_info(system_version).

    in the erlang shell. If the returned string contains [debug], you +emulator, which you will see if you do a:

    1> erlang:system_info(system_version).

    in the erlang shell. If the returned string contains [debug], you got a debug compiled emulator.

    To hack the erlang libraries, you simply do a make opt in the specific "applications" directory, like:

    $ cd $ERL_TOP/lib/stdlib
     $ make opt
    @@ -227,11 +227,11 @@
     

    Remember that:

    • Windows specific C-code goes in the $ERL_TOP/erts/emulator/sys/win32, $ERL_TOP/erts/emulator/drivers/win32 or $ERL_TOP/erts/etc/win32.

    • Windows specific erlang code should be used conditionally and the host OS tested in runtime, the exactly same beam files should be -distributed for every platform! So write code like:

      case os:type() of
      -    {win32,_} ->
      -        do_windows_specific();
      +distributed for every platform! So write code like:

      case os:type() of
      +    {win32,_} ->
      +        do_windows_specific();
           Other ->
      -        do_fallback_or_exit()
      +        do_fallback_or_exit()
       end,

    That's basically all you need to get going.

    /usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/list_comprehensions.xhtml differs (HTML document, ASCII text, with very long lines) --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/list_comprehensions.xhtml" 2025-05-10 20:18:56.921079961 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/list_comprehensions.xhtml" 2025-05-10 20:18:56.937080106 +0000 @@ -26,25 +26,25 @@ Simple Examples

    -

    This section starts with a simple example, showing a generator and a filter:

    > [X || X <- [1,2,a,3,4,b,5,6], X > 3].
    -[a,4,b,5,6]

    This is read as follows: The list of X such that X is taken from the list +

    This section starts with a simple example, showing a generator and a filter:

    > [X || X <- [1,2,a,3,4,b,5,6], X > 3].
    +[a,4,b,5,6]

    This is read as follows: The list of X such that X is taken from the list [1,2,a,...] and X is greater than 3.

    The notation X <- [1,2,a,...] is a generator and the expression X > 3 is a filter.

    An additional filter, is_integer(X), can be added to -restrict the result to integers:

    > [X || X <- [1,2,a,3,4,b,5,6], is_integer(X), X > 3].
    -[4,5,6]

    Generators can be combined. For example, the Cartesian product of two lists can -be written as follows:

    > [{X, Y} || X <- [1,2,3], Y <- [a,b]].
    -[{1,a},{1,b},{2,a},{2,b},{3,a},{3,b}]

    +restrict the result to integers:

    > [X || X <- [1,2,a,3,4,b,5,6], is_integer(X), X > 3].
    +[4,5,6]

    Generators can be combined. For example, the Cartesian product of two lists can +be written as follows:

    > [{X, Y} || X <- [1,2,3], Y <- [a,b]].
    +[{1,a},{1,b},{2,a},{2,b},{3,a},{3,b}]

    Quick Sort

    -

    The well-known quick sort routine can be written as follows:

    sort([]) -> [];
    -sort([_] = L) -> L;
    -sort([Pivot|T]) ->
    -    sort([ X || X <- T, X < Pivot]) ++
    -    [Pivot] ++
    -    sort([ X || X <- T, X >= Pivot]).

    The expression [X || X <- T, X < Pivot] is the list of all elements in T +

    The well-known quick sort routine can be written as follows:

    sort([]) -> [];
    +sort([_] = L) -> L;
    +sort([Pivot|T]) ->
    +    sort([ X || X <- T, X < Pivot]) ++
    +    [Pivot] ++
    +    sort([ X || X <- T, X >= Pivot]).

    The expression [X || X <- T, X < Pivot] is the list of all elements in T that are less than Pivot.

    [X || X <- T, X >= Pivot] is the list of all elements in T that are greater than or equal to Pivot.

    With the algorithm above, a list is sorted as follows:

    • A list with zero or one element is trivially sorted.
    • For lists with more than one element:
      1. The first element in the list is isolated as the pivot element.
      2. The remaining list is partitioned into two sublists, such that:
      • The first sublist contains all elements that are smaller than the pivot element.
      • The second sublist contains all elements that are greater than or equal to @@ -60,11 +60,11 @@ Permutations -

        The following example generates all permutations of the elements in a list:

        perms([]) -> [[]];
        -perms(L)  -> [[H|T] || H <- L, T <- perms(L--[H])].

        This takes H from L in all possible ways. The result is the set of all lists +

        The following example generates all permutations of the elements in a list:

        perms([]) -> [[]];
        +perms(L)  -> [[H|T] || H <- L, T <- perms(L--[H])].

        This takes H from L in all possible ways. The result is the set of all lists [H|T], where T is the set of all possible permutations of L, with H -removed:

        > perms([b,u,g]).
        -[[b,u,g],[b,g,u],[u,b,g],[u,g,b],[g,b,u],[g,u,b]]

        +removed:

        > perms([b,u,g]).
        +[[b,u,g],[b,g,u],[u,b,g],[u,g,b],[g,b,u],[g,u,b]]

        @@ -73,47 +73,47 @@

        Pythagorean triplets are sets of integers {A,B,C} such that A**2 + B**2 = C**2.

        The function pyth(N) generates a list of all integers {A,B,C} such that A**2 + B**2 = C**2 and where the sum of the sides is equal to, or less than, -N:

        pyth(N) ->
        -    [ {A,B,C} ||
        -        A <- lists:seq(1,N),
        -        B <- lists:seq(1,N),
        -        C <- lists:seq(1,N),
        +N:

        pyth(N) ->
        +    [ {A,B,C} ||
        +        A <- lists:seq(1,N),
        +        B <- lists:seq(1,N),
        +        C <- lists:seq(1,N),
                 A+B+C =< N,
                 A*A+B*B == C*C
        -    ].
        > pyth(3).
        -[].
        -> pyth(11).
        -[].
        -> pyth(12).
        -[{3,4,5},{4,3,5}]
        -> pyth(50).
        -[{3,4,5},
        - {4,3,5},
        - {5,12,13},
        - {6,8,10},
        - {8,6,10},
        - {8,15,17},
        - {9,12,15},
        - {12,5,13},
        - {12,9,15},
        - {12,16,20},
        - {15,8,17},
        - {16,12,20}]

        The following code reduces the search space and is more efficient:

        pyth1(N) ->
        -   [{A,B,C} ||
        -       A <- lists:seq(1,N-2),
        -       B <- lists:seq(A+1,N-1),
        -       C <- lists:seq(B+1,N),
        +    ].
        > pyth(3).
        +[].
        +> pyth(11).
        +[].
        +> pyth(12).
        +[{3,4,5},{4,3,5}]
        +> pyth(50).
        +[{3,4,5},
        + {4,3,5},
        + {5,12,13},
        + {6,8,10},
        + {8,6,10},
        + {8,15,17},
        + {9,12,15},
        + {12,5,13},
        + {12,9,15},
        + {12,16,20},
        + {15,8,17},
        + {16,12,20}]

        The following code reduces the search space and is more efficient:

        pyth1(N) ->
        +   [{A,B,C} ||
        +       A <- lists:seq(1,N-2),
        +       B <- lists:seq(A+1,N-1),
        +       C <- lists:seq(B+1,N),
                A+B+C =< N,
        -       A*A+B*B == C*C ].

        + A*A+B*B == C*C ].

        Simplifications With List Comprehensions

        As an example, list comprehensions can be used to simplify some of the functions -in lists.erl:

        append(L)   ->  [X || L1 <- L, X <- L1].
        -map(Fun, L) -> [Fun(X) || X <- L].
        -filter(Pred, L) -> [X || X <- L, Pred(X)].

        +in lists.erl:

        append(L)   ->  [X || L1 <- L, X <- L1].
        +map(Fun, L) -> [Fun(X) || X <- L].
        +filter(Pred, L) -> [X || X <- L, Pred(X)].

        @@ -125,20 +125,20 @@ which selects certain elements from a list of tuples. Suppose you write select(X, L) -> [Y || {X, Y} <- L]. with the intention of extracting all tuples from L, where the first item is X.

        Compiling this gives the following diagnostic:

        ./FileName.erl:Line: Warning: variable 'X' shadowed in generate

        This diagnostic warns that the variable X in the pattern is not the same as -the variable X that occurs in the function head.

        Evaluating select gives the following result:

        > select(b,[{a,1},{b,2},{c,3},{b,7}]).
        -[1,2,3,7]

        This is not the wanted result. To achieve the desired effect, select must be -written as follows:

        select(X, L) ->  [Y || {X1, Y} <- L, X == X1].

        The generator now contains unbound variables and the test has been moved into -the filter.

        This now works as expected:

        > select(b,[{a,1},{b,2},{c,3},{b,7}]).
        -[2,7]

        Also note that a variable in a generator pattern will shadow a variable with the -same name bound in a previous generator pattern. For example:

        > [{X,Y} || X <- [1,2,3], X=Y <- [a,b,c]].
        -[{a,a},{b,b},{c,c},{a,a},{b,b},{c,c},{a,a},{b,b},{c,c}]

        A consequence of the rules for importing variables into a list comprehensions is +the variable X that occurs in the function head.

        Evaluating select gives the following result:

        > select(b,[{a,1},{b,2},{c,3},{b,7}]).
        +[1,2,3,7]

        This is not the wanted result. To achieve the desired effect, select must be +written as follows:

        select(X, L) ->  [Y || {X1, Y} <- L, X == X1].

        The generator now contains unbound variables and the test has been moved into +the filter.

        This now works as expected:

        > select(b,[{a,1},{b,2},{c,3},{b,7}]).
        +[2,7]

        Also note that a variable in a generator pattern will shadow a variable with the +same name bound in a previous generator pattern. For example:

        > [{X,Y} || X <- [1,2,3], X=Y <- [a,b,c]].
        +[{a,a},{b,b},{c,c},{a,a},{b,b},{c,c},{a,a},{b,b},{c,c}]

        A consequence of the rules for importing variables into a list comprehensions is that certain pattern matching operations must be moved into the filters and -cannot be written directly in the generators.

        To illustrate this, do not write as follows:

        f(...) ->
        +cannot be written directly in the generators.

        To illustrate this, do not write as follows:

        f(...) ->
             Y = ...
        -    [ Expression || PatternInvolving Y  <- Expr, ...]
        -    ...

        Instead, write as follows:

        f(...) ->
        +    [ Expression || PatternInvolving Y  <- Expr, ...]
        +    ...

        Instead, write as follows:

        f(...) ->
             Y = ...
        -    [ Expression || PatternInvolving Y1  <- Expr, Y == Y1, ...]
        +    [ Expression || PatternInvolving Y1  <- Expr, Y == Y1, ...]
             ...
        /usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/listhandling.xhtml differs (HTML document, ASCII text, with very long lines) --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/listhandling.xhtml" 2025-05-10 20:18:56.917079925 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/listhandling.xhtml" 2025-05-10 20:18:56.937080106 +0000 @@ -29,47 +29,47 @@

        Lists can only be built starting from the end and attaching list elements at the beginning. If you use the ++ operator as follows, a new list is created that is a copy of the elements in List1, followed by List2:

        List1 ++ List2

        Looking at how lists:append/2 or ++ would be implemented in plain Erlang, -clearly the first list is copied:

        append([H|T], Tail) ->
        -    [H|append(T, Tail)];
        -append([], Tail) ->
        +clearly the first list is copied:

        append([H|T], Tail) ->
        +    [H|append(T, Tail)];
        +append([], Tail) ->
             Tail.

        When recursing and building a list, it is important to ensure that you attach the new elements to the beginning of the list. In this way, you will build one -list, not hundreds or thousands of copies of the growing result list.

        Let us first see how it is not to be done:

        DO NOT

        bad_fib(N) ->
        -    bad_fib(N, 0, 1, []).
        +list, not hundreds or thousands of copies of the growing result list.

        Let us first see how it is not to be done:

        DO NOT

        bad_fib(N) ->
        +    bad_fib(N, 0, 1, []).
         
        -bad_fib(0, _Current, _Next, Fibs) ->
        +bad_fib(0, _Current, _Next, Fibs) ->
             Fibs;
        -bad_fib(N, Current, Next, Fibs) ->
        -    bad_fib(N - 1, Next, Current + Next, Fibs ++ [Current]).

        Here more than one list is built. In each iteration step a new list is created +bad_fib(N, Current, Next, Fibs) -> + bad_fib(N - 1, Next, Current + Next, Fibs ++ [Current]).

        Here more than one list is built. In each iteration step a new list is created that is one element longer than the new previous list.

        To avoid copying the result in each iteration, build the list in reverse order -and reverse the list when you are done:

        DO

        tail_recursive_fib(N) ->
        -    tail_recursive_fib(N, 0, 1, []).
        +and reverse the list when you are done:

        DO

        tail_recursive_fib(N) ->
        +    tail_recursive_fib(N, 0, 1, []).
         
        -tail_recursive_fib(0, _Current, _Next, Fibs) ->
        -    lists:reverse(Fibs);
        -tail_recursive_fib(N, Current, Next, Fibs) ->
        -    tail_recursive_fib(N - 1, Next, Current + Next, [Current|Fibs]).

        +tail_recursive_fib(0, _Current, _Next, Fibs) -> + lists:reverse(Fibs); +tail_recursive_fib(N, Current, Next, Fibs) -> + tail_recursive_fib(N - 1, Next, Current + Next, [Current|Fibs]).

        List Comprehensions

        -

        A list comprehension:

        [Expr(E) || E <- List]

        is basically translated to a local function:

        'lc^0'([E|Tail], Expr) ->
        -    [Expr(E)|'lc^0'(Tail, Expr)];
        -'lc^0'([], _Expr) -> [].

        If the result of the list comprehension will obviously not be used, a list -will not be constructed. For example, in this code:

        [io:put_chars(E) || E <- List],
        +

        A list comprehension:

        [Expr(E) || E <- List]

        is basically translated to a local function:

        'lc^0'([E|Tail], Expr) ->
        +    [Expr(E)|'lc^0'(Tail, Expr)];
        +'lc^0'([], _Expr) -> [].

        If the result of the list comprehension will obviously not be used, a list +will not be constructed. For example, in this code:

        [io:put_chars(E) || E <- List],
         ok.

        or in this code:

        case Var of
             ... ->
        -        [io:put_chars(E) || E <- List];
        +        [io:put_chars(E) || E <- List];
             ... ->
         end,
        -some_function(...),

        the value is not assigned to a variable, not passed to another function, and not +some_function(...),

        the value is not assigned to a variable, not passed to another function, and not returned. This means that there is no need to construct a list and the compiler -will simplify the code for the list comprehension to:

        'lc^0'([E|Tail], Expr) ->
        -    Expr(E),
        -    'lc^0'(Tail, Expr);
        -'lc^0'([], _Expr) -> [].

        The compiler also understands that assigning to _ means that the value will -not be used. Therefore, the code in the following example will also be optimized:

        _ = [io:put_chars(E) || E <- List],
        +will simplify the code for the list comprehension to:

        'lc^0'([E|Tail], Expr) ->
        +    Expr(E),
        +    'lc^0'(Tail, Expr);
        +'lc^0'([], _Expr) -> [].

        The compiler also understands that assigning to _ means that the value will +not be used. Therefore, the code in the following example will also be optimized:

        _ = [io:put_chars(E) || E <- List],
         ok.

        @@ -82,11 +82,11 @@ to flatten the list before sending it to the port.

      • When calling BIFs that accept deep lists, such as list_to_binary/1 or iolist_to_binary/1.
      • When you know that your list is only one level deep. Use lists:append/1 -instead.

      Examples:

      DO

      port_command(Port, DeepList)

      DO NOT

      port_command(Port, lists:flatten(DeepList))

      A common way to send a zero-terminated string to a port is the following:

      DO NOT

      TerminatedStr = String ++ [0],
      -port_command(Port, TerminatedStr)

      Instead:

      DO

      TerminatedStr = [String, 0],
      -port_command(Port, TerminatedStr)

      DO

      1> lists:append([[1], [2], [3]]).
      -[1,2,3]

      DO NOT

      1> lists:flatten([[1], [2], [3]]).
      -[1,2,3]

      +instead.

    Examples:

    DO

    port_command(Port, DeepList)

    DO NOT

    port_command(Port, lists:flatten(DeepList))

    A common way to send a zero-terminated string to a port is the following:

    DO NOT

    TerminatedStr = String ++ [0],
    +port_command(Port, TerminatedStr)

    Instead:

    DO

    TerminatedStr = [String, 0],
    +port_command(Port, TerminatedStr)

    DO

    1> lists:append([[1], [2], [3]]).
    +[1,2,3]

    DO NOT

    1> lists:flatten([[1], [2], [3]]).
    +[1,2,3]

    @@ -94,17 +94,17 @@

    There are two basic ways to write a function that traverses a list and produces a new list.

    The first way is writing a body-recursive function:

    %% Add 42 to each integer in the list.
    -add_42_body([H|T]) ->
    -    [H + 42 | add_42_body(T)];
    -add_42_body([]) ->
    -    [].

    The second way is writing a tail-recursive function:

    %% Add 42 to each integer in the list.
    -add_42_tail(List) ->
    -    add_42_tail(List, []).
    +add_42_body([H|T]) ->
    +    [H + 42 | add_42_body(T)];
    +add_42_body([]) ->
    +    [].

    The second way is writing a tail-recursive function:

    %% Add 42 to each integer in the list.
    +add_42_tail(List) ->
    +    add_42_tail(List, []).
     
    -add_42_tail([H|T], Acc) ->
    -    add_42_tail(T, [H + 42 | Acc]);
    -add_42_tail([], Acc) ->
    -    lists:reverse(Acc).

    In early version of Erlang the tail-recursive function would typically +add_42_tail([H|T], Acc) -> + add_42_tail(T, [H + 42 | Acc]); +add_42_tail([], Acc) -> + lists:reverse(Acc).

    In early version of Erlang the tail-recursive function would typically be more efficient. In modern versions of Erlang, there is usually not much difference in performance between a body-recursive list function and tail-recursive function that reverses the list at the end. Therefore, @@ -115,11 +115,11 @@ function that does not construct a list runs in constant space, while the corresponding body-recursive function uses stack space proportional to the length of the list.

    For example, a function that sums a list of integers, is not to be written as -follows:

    DO NOT

    recursive_sum([H|T]) -> H+recursive_sum(T);
    -recursive_sum([])    -> 0.

    Instead:

    DO

    sum(L) -> sum(L, 0).
    +follows:

    DO NOT

    recursive_sum([H|T]) -> H+recursive_sum(T);
    +recursive_sum([])    -> 0.

    Instead:

    DO

    sum(L) -> sum(L, 0).
     
    -sum([H|T], Sum) -> sum(T, Sum + H);
    -sum([], Sum)    -> Sum.
    +
    sum([H|T], Sum) -> sum(T, Sum + H); +sum([], Sum) -> Sum.
    /usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/macros.xhtml differs (HTML document, ASCII text, with very long lines) --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/macros.xhtml" 2025-05-10 20:18:56.917079925 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/macros.xhtml" 2025-05-10 20:18:56.937080106 +0000 @@ -26,8 +26,8 @@ File Inclusion -

    A file can be included as follows:

    -include(File).
    --include_lib(File).

    File, a string, is to point out a file. The contents of this file are included +

    A file can be included as follows:

    -include(File).
    +-include_lib(File).

    File, a string, is to point out a file. The contents of this file are included as is, at the position of the directive.

    Include files are typically used for record and macro definitions that are shared by several modules. It is recommended to use the file name extension .hrl for include files.

    File can start with a path component $VAR, for some string VAR. If that is @@ -36,12 +36,12 @@ $VAR is left as is.

    If the filename File is absolute (possibly after variable substitution), the include file with that name is included. Otherwise, the specified file is searched for in the following directories, and in this order:

    1. The current working directory
    2. The directory where the module is being compiled
    3. The directories given by the include option

    For details, see erlc in ERTS and -compile in Compiler.

    Examples:

    -include("my_records.hrl").
    --include("incdir/my_records.hrl").
    --include("/home/user/proj/my_records.hrl").
    --include("$PROJ_ROOT/my_records.hrl").

    include_lib is similar to include, but is not to point out an absolute file. +compile in Compiler.

    Examples:

    -include("my_records.hrl").
    +-include("incdir/my_records.hrl").
    +-include("/home/user/proj/my_records.hrl").
    +-include("$PROJ_ROOT/my_records.hrl").

    include_lib is similar to include, but is not to point out an absolute file. Instead, the first path component (possibly after variable substitution) is -assumed to be the name of an application.

    Example:

    -include_lib("kernel/include/file.hrl").

    The code server uses code:lib_dir(kernel) to find the directory of the current +assumed to be the name of an application.

    Example:

    -include_lib("kernel/include/file.hrl").

    The code server uses code:lib_dir(kernel) to find the directory of the current (latest) version of Kernel, and then the subdirectory include is searched for the file file.hrl.

    @@ -49,25 +49,25 @@ Defining and Using Macros

    -

    A macro is defined as follows:

    -define(Const, Replacement).
    --define(Func(Var1,...,VarN), Replacement).

    A macro definition can be placed anywhere among the attributes and function +

    A macro is defined as follows:

    -define(Const, Replacement).
    +-define(Func(Var1,...,VarN), Replacement).

    A macro definition can be placed anywhere among the attributes and function declarations of a module, but the definition must come before any usage of the macro.

    If a macro is used in several modules, it is recommended that the macro definition is placed in an include file.

    A macro is used as follows:

    ?Const
     ?Func(Arg1,...,ArgN)

    Macros are expanded during compilation. A simple macro ?Const is replaced with -Replacement.

    Example:

    -define(TIMEOUT, 200).
    +Replacement.

    Example:

    -define(TIMEOUT, 200).
     ...
    -call(Request) ->
    -    server:call(refserver, Request, ?TIMEOUT).

    This is expanded to:

    call(Request) ->
    -    server:call(refserver, Request, 200).

    A macro ?Func(Arg1,...,ArgN) is replaced with Replacement, where all +call(Request) -> + server:call(refserver, Request, ?TIMEOUT).

    This is expanded to:

    call(Request) ->
    +    server:call(refserver, Request, 200).

    A macro ?Func(Arg1,...,ArgN) is replaced with Replacement, where all occurrences of a variable Var from the macro definition are replaced with the -corresponding argument Arg.

    Example:

    -define(MACRO1(X, Y), {a, X, b, Y}).
    +corresponding argument Arg.

    Example:

    -define(MACRO1(X, Y), {a, X, b, Y}).
     ...
    -bar(X) ->
    -    ?MACRO1(a, b),
    -    ?MACRO1(X, 123)

    This is expanded to:

    bar(X) ->
    -    {a,a,b,b},
    -    {a,X,b,123}.

    It is good programming practice, but not mandatory, to ensure that a macro +bar(X) -> + ?MACRO1(a, b), + ?MACRO1(X, 123)

    This is expanded to:

    bar(X) ->
    +    {a,a,b,b},
    +    {a,X,b,123}.

    It is good programming practice, but not mandatory, to ensure that a macro definition is a valid Erlang syntactic form.

    To view the result of macro expansion, a module can be compiled with the 'P' option. compile:file(File, ['P']). This produces a listing of the parsed code after preprocessing and parse transforms, in the file File.P.

    @@ -94,21 +94,21 @@

    It is possible to overload macros, except for predefined macros. An overloaded macro has more than one definition, each with a different number of arguments.

    Change

    Support for overloading of macros was added in Erlang 5.7.5/OTP R13B04.

    A macro ?Func(Arg1,...,ArgN) with a (possibly empty) list of arguments results in an error message if there is at least one definition of Func with -arguments, but none with N arguments.

    Assuming these definitions:

    -define(F0(), c).
    --define(F1(A), A).
    --define(C, m:f).

    the following does not work:

    f0() ->
    +arguments, but none with N arguments.

    Assuming these definitions:

    -define(F0(), c).
    +-define(F1(A), A).
    +-define(C, m:f).

    the following does not work:

    f0() ->
         ?F0. % No, an empty list of arguments expected.
     
    -f1(A) ->
    -    ?F1(A, A). % No, exactly one argument expected.

    On the other hand,

    f() ->
    -    ?C().

    is expanded to

    f() ->
    -    m:f().

    +f1(A) -> + ?F1(A, A). % No, exactly one argument expected.

    On the other hand,

    f() ->
    +    ?C().

    is expanded to

    f() ->
    +    m:f().

    Removing a macro definition

    -

    A definition of macro can be removed as follows:

    -undef(Macro).

    +

    A definition of macro can be removed as follows:

    -undef(Macro).

    @@ -128,13 +128,13 @@ elif also supports calling the psuedo-function defined(Name), which tests whether the Name argument is the name of a previously defined macro. defined(Name) evaluates to true if the macro is defined and false -otherwise. An attempt to call other functions results in a compilation error.

    Example:

    -module(m).
    +otherwise. An attempt to call other functions results in a compilation error.

    Example:

    -module(m).
     ...
     
    --ifdef(debug).
    --define(LOG(X), io:format("{~p,~p}: ~p~n", [?MODULE,?LINE,X])).
    +-ifdef(debug).
    +-define(LOG(X), io:format("{~p,~p}: ~p~n", [?MODULE,?LINE,X])).
     -else.
    --define(LOG(X), true).
    +-define(LOG(X), true).
     -endif.
     
     ...

    When trace output is desired, debug is to be defined when the module m is @@ -142,21 +142,21 @@ or -1> c(m, {d, debug}). -{ok,m}

    ?LOG(Arg) is then expanded to a call to io:format/2 and provide the user -with some simple trace output.

    Example:

    -module(m)
    +1> c(m, {d, debug}).
    +{ok,m}

    ?LOG(Arg) is then expanded to a call to io:format/2 and provide the user +with some simple trace output.

    Example:

    -module(m)
     ...
    --if(?OTP_RELEASE >= 25).
    +-if(?OTP_RELEASE >= 25).
     %% Code that will work in OTP 25 or higher
    --elif(?OTP_RELEASE >= 26).
    +-elif(?OTP_RELEASE >= 26).
     %% Code that will work in OTP 26 or higher
     -else.
     %% Code that will work in OTP 24 or lower.
     -endif.
     ...

    This code uses the OTP_RELEASE macro to conditionally select code depending on -release.

    Example:

    -module(m)
    +release.

    Example:

    -module(m)
     ...
    --if(?OTP_RELEASE >= 26 andalso defined(debug)).
    +-if(?OTP_RELEASE >= 26 andalso defined(debug)).
     %% Debugging code that requires OTP 26 or later.
     -else.
     %% Non-debug code that works in any release.
    @@ -179,23 +179,23 @@
       
       -error() and -warning() directives
     

    -

    The directive -error(Term) causes a compilation error.

    Example:

    -module(t).
    --export([version/0]).
    +

    The directive -error(Term) causes a compilation error.

    Example:

    -module(t).
    +-export([version/0]).
     
    --ifdef(VERSION).
    -version() -> ?VERSION.
    +-ifdef(VERSION).
    +version() -> ?VERSION.
     -else.
    --error("Macro VERSION must be defined.").
    -version() -> "".
    +-error("Macro VERSION must be defined.").
    +version() -> "".
     -endif.

    The error message will look like this:

    % erlc t.erl
    -t.erl:7: -error("Macro VERSION must be defined.").

    The directive -warning(Term) causes a compilation warning.

    Example:

    -module(t).
    --export([version/0]).
    +t.erl:7: -error("Macro VERSION must be defined.").

    The directive -warning(Term) causes a compilation warning.

    Example:

    -module(t).
    +-export([version/0]).
     
    --ifndef(VERSION).
    --warning("Macro VERSION not defined -- using default version.").
    --define(VERSION, "0").
    +-ifndef(VERSION).
    +-warning("Macro VERSION not defined -- using default version.").
    +-define(VERSION, "0").
     -endif.
    -version() -> ?VERSION.

    The warning message will look like this:

    % erlc t.erl
    +version() -> ?VERSION.

    The warning message will look like this:

    % erlc t.erl
     t.erl:5: Warning: -warning("Macro VERSION not defined -- using default version.").

    Change

    The -error() and -warning() directives were added in Erlang/OTP 19.

    @@ -204,11 +204,11 @@

    The construction ??Arg, where Arg is a macro argument, is expanded to a string containing the tokens of the argument. This is similar to the #arg -stringifying construction in C.

    Example:

    -define(TESTCALL(Call), io:format("Call ~s: ~w~n", [??Call, Call])).
    +stringifying construction in C.

    Example:

    -define(TESTCALL(Call), io:format("Call ~s: ~w~n", [??Call, Call])).
     
    -?TESTCALL(myfunction(1,2)),
    -?TESTCALL(you:function(2,1)).

    results in

    io:format("Call ~s: ~w~n",["myfunction ( 1 , 2 )",myfunction(1,2)]),
    -io:format("Call ~s: ~w~n",["you : function ( 2 , 1 )",you:function(2,1)]).

    That is, a trace output, with both the function called and the resulting value.

    +
    ?TESTCALL(myfunction(1,2)), +?TESTCALL(you:function(2,1)).

    results in

    io:format("Call ~s: ~w~n",["myfunction ( 1 , 2 )",myfunction(1,2)]),
    +io:format("Call ~s: ~w~n",["you : function ( 2 , 1 )",you:function(2,1)]).

    That is, a trace output, with both the function called and the resulting value.

    /usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/maps.xhtml differs (HTML document, ASCII text, with very long lines) --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/maps.xhtml" 2025-05-10 20:18:56.917079925 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/maps.xhtml" 2025-05-10 20:18:56.937080106 +0000 @@ -57,8 +57,8 @@ values, sharing of keys between different instances of the map will be less effective, and it is not possible to match multiple elements having default values in one go.

  • To avoid having to deal with a map that may lack some keys, maps:merge/2 can -efficiently add multiple default values. For example:

    DefaultMap = #{shoe_size => 42, editor => emacs},
    -MapWithDefaultsApplied = maps:merge(DefaultMap, OtherMap)
  • +efficiently add multiple default values. For example:

    DefaultMap = #{shoe_size => 42, editor => emacs},
    +MapWithDefaultsApplied = maps:merge(DefaultMap, OtherMap)

    @@ -76,10 +76,10 @@ Using Maps as Sets

    Starting in OTP 24, the sets module has an option to represent sets as maps. -Examples:

    1> sets:new([{version,2}]).
    -#{}
    -2> sets:from_list([x,y,z], [{version,2}]).
    -#{x => [],y => [],z => []}

    sets backed by maps is generally the most efficient set representation, with a +Examples:

    1> sets:new([{version,2}]).
    +#{}
    +2> sets:from_list([x,y,z], [{version,2}]).
    +#{x => [],y => [],z => []}

    sets backed by maps is generally the most efficient set representation, with a few possible exceptions:

    • ordsets:intersection/2 can be more efficient than sets:intersection/2. If the intersection operation is frequently used and operations that operate on a single element in a set (such as is_element/2) are avoided, ordsets can @@ -112,10 +112,10 @@ allowing the key tuple to be shared with other instances of the map that have the same keys. In fact, the key tuple can be shared between all maps with the same keys with some care. To arrange that, define a function that returns a map. -For example:

      new() ->
      -    #{a => default, b => default, c => default}.

      Defined like this, the key tuple {a,b,c} will be a global literal. To ensure +For example:

      new() ->
      +    #{a => default, b => default, c => default}.

      Defined like this, the key tuple {a,b,c} will be a global literal. To ensure that the key tuple is shared when creating an instance of the map, always call -new() and modify the returned map:

          (SOME_MODULE:new())#{a := 42}.

      Using the map syntax with small maps is particularly efficient. As long as the +new() and modify the returned map:

          (SOME_MODULE:new())#{a := 42}.

      Using the map syntax with small maps is particularly efficient. As long as the keys are known at compile-time, the map is updated in one go, making the time to update a map essentially constant regardless of the number of keys updated. The same goes for matching. (When the keys are variables, one or more of the keys @@ -150,13 +150,13 @@

      Using the map syntax is usually slightly more efficient than using the corresponding function in the maps module.

      The gain in efficiency for the map syntax is more noticeable for the following -operations that can only be achieved using the map syntax:

      • Matching multiple literal keys
      • Updating multiple literal keys
      • Adding multiple literal keys to a map

      For example:

      DO

      Map = Map1#{x := X, y := Y, z := Z}

      DO NOT

      Map2 = maps:update(x, X, Map1),
      -Map3 = maps:update(y, Y, Map2),
      -Map = maps:update(z, Z, Map3)

      If the map is a small map, the first example runs roughly three times as fast.

      Note that for variable keys, the elements are updated sequentially from left to -right. For example, given the following update with variable keys:

      Map = Map1#{Key1 := X, Key2 := Y, Key3 := Z}

      the compiler rewrites it like this to ensure that the updates are applied from -left to right:

      Map2 = Map1#{Key1 := X},
      -Map3 = Map2#{Key2 := Y},
      -Map = Map3#{Key3 := Z}

      If a key is known to exist in a map, using the := operator is slightly more +operations that can only be achieved using the map syntax:

      • Matching multiple literal keys
      • Updating multiple literal keys
      • Adding multiple literal keys to a map

      For example:

      DO

      Map = Map1#{x := X, y := Y, z := Z}

      DO NOT

      Map2 = maps:update(x, X, Map1),
      +Map3 = maps:update(y, Y, Map2),
      +Map = maps:update(z, Z, Map3)

      If the map is a small map, the first example runs roughly three times as fast.

      Note that for variable keys, the elements are updated sequentially from left to +right. For example, given the following update with variable keys:

      Map = Map1#{Key1 := X, Key2 := Y, Key3 := Z}

      the compiler rewrites it like this to ensure that the updates are applied from +left to right:

      Map2 = Map1#{Key1 := X},
      +Map3 = Map2#{Key2 := Y},
      +Map = Map3#{Key3 := Z}

      If a key is known to exist in a map, using the := operator is slightly more efficient than using the => operator for a small map.

      @@ -215,15 +215,15 @@

      As an optimization, the compiler will rewrite a call to maps:get/3 to Erlang code similar to the following:

      Result = case Map of
      -             #{Key := Value} -> Value;
      -             #{} -> Default
      +             #{Key := Value} -> Value;
      +             #{} -> Default
                end

      This is reasonably efficient, but if a small map is used as an alternative to using a record it is often better not to rely on default values as it prevents sharing of keys, which may in the end use more memory than what you save from not storing default values in the map.

      If default values are nevertheless required, instead of calling maps:get/3 multiple times, consider putting the default values in a map and merging that -map with the other map:

      DefaultMap = #{Key1 => Value2, Key2 => Value2, ..., KeyN => ValueN},
      -MapWithDefaultsApplied = maps:merge(DefaultMap, OtherMap)

      This helps share keys between the default map and the one you applied defaults +map with the other map:

      DefaultMap = #{Key1 => Value2, Key2 => Value2, ..., KeyN => ValueN},
      +MapWithDefaultsApplied = maps:merge(DefaultMap, OtherMap)

      This helps share keys between the default map and the one you applied defaults to, as long as the default map contains all the keys that will ever be used and not just the ones with default values. Whether this is faster than calling maps:get/3 multiple times depends on the size of the map and the number of /usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/modules.xhtml differs (HTML document, ASCII text, with very long lines) --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/modules.xhtml" 2025-05-10 20:18:56.917079925 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/modules.xhtml" 2025-05-10 20:18:56.937080106 +0000 @@ -27,12 +27,12 @@ Module Syntax

      Erlang code is divided into modules. A module consists of a sequence of -attributes and function declarations, each terminated by a period (.).

      Example:

      -module(m).          % module attribute
      --export([fact/1]).   % module attribute
      +attributes and function declarations, each terminated by a period (.).

      Example:

      -module(m).          % module attribute
      +-export([fact/1]).   % module attribute
       
      -fact(N) when N>0 ->  % beginning of function declaration
      -    N * fact(N-1);   %  |
      -fact(0) ->           %  |
      +fact(N) when N>0 ->  % beginning of function declaration
      +    N * fact(N-1);   %  |
      +fact(0) ->           %  |
           1.               % end of function declaration

      For a description of function declarations, see Function Declaration Syntax.

      @@ -85,9 +85,9 @@ Behaviour Module Attribute

      It is possible to specify that the module is the callback module for a -behaviour:

      -behaviour(Behaviour).

      The atom Behaviour gives the name of the behaviour, which can be a +behaviour:

      -behaviour(Behaviour).

      The atom Behaviour gives the name of the behaviour, which can be a user-defined behaviour or one of the following OTP standard behaviours:

      • gen_server
      • gen_statem
      • gen_event
      • supervisor

      The spelling behavior is also accepted.

      The callback functions of the module can be specified either directly by the -exported function behaviour_info/1:

      behaviour_info(callbacks) -> Callbacks.

      or by a -callback attribute for each callback function:

      -callback Name(Arguments) -> Result.

      Here, Arguments is a list of zero or more arguments. The -callback attribute +exported function behaviour_info/1:

      behaviour_info(callbacks) -> Callbacks.

      or by a -callback attribute for each callback function:

      -callback Name(Arguments) -> Result.

      Here, Arguments is a list of zero or more arguments. The -callback attribute is to be preferred since the extra type information can be used by tools to produce documentation or find discrepancies.

      Read more about behaviours and callback modules in OTP Design Principles.

      @@ -96,7 +96,7 @@ Record Definitions

      -

      The same syntax as for module attributes is used for record definitions:

      -record(Record, Fields).

      Record definitions are allowed anywhere in a module, also among the function +

      The same syntax as for module attributes is used for record definitions:

      -record(Record, Fields).

      Record definitions are allowed anywhere in a module, also among the function declarations. Read more in Records.

      @@ -104,15 +104,15 @@ Preprocessor

      The same syntax as for module attributes is used by the preprocessor, which -supports file inclusion, macros, and conditional compilation:

      -include("SomeFile.hrl").
      --define(Macro, Replacement).

      Read more in Preprocessor.

      +supports file inclusion, macros, and conditional compilation:

      -include("SomeFile.hrl").
      +-define(Macro, Replacement).

      Read more in Preprocessor.

      Setting File and Line

      The same syntax as for module attributes is used for changing the pre-defined -macros ?FILE and ?LINE:

      -file(File, Line).

      This attribute is used by tools, such as Yecc, to inform the compiler that the +macros ?FILE and ?LINE:

      -file(File, Line).

      This attribute is used by tools, such as Yecc, to inform the compiler that the source program is generated by another tool. It also indicates the correspondence of source files to lines of the original user-written file, from which the source program is produced.

      @@ -122,8 +122,8 @@ Types and function specifications

      A similar syntax as for module attributes is used for specifying types and -function specifications:

      -type my_type() :: atom() | integer().
      --spec my_function(integer()) -> integer().

      Read more in Types and Function specifications.

      The description is based on +function specifications:

      -type my_type() :: atom() | integer().
      +-spec my_function(integer()) -> integer().

      Read more in Types and Function specifications.

      The description is based on EEP8 - Types and function specifications, which is not to be further updated.

      @@ -132,16 +132,16 @@ Documentation attributes

      The module attribute -doc(Documentation) is used to provide user documentation -for a function/type/callback:

      -doc("Example documentation").
      -example() -> ok.

      The attribute should be placed just before the entity it documents.The +for a function/type/callback:

      -doc("Example documentation").
      +example() -> ok.

      The attribute should be placed just before the entity it documents.The parenthesis are optional around Documentation. The allowed values for Documentation are:

      • literal string or utf-8 encoded binary string - The string documenting the entity. Any literal string is allowed, so both triple quoted strings and sigils that translate to literal strings can be used. -The following examples are equivalent:

        -doc("Example \"docs\"").
        --doc(<<"Example \"docs\""/utf8>>).
        +The following examples are equivalent:

        -doc("Example \"docs\"").
        +-doc(<<"Example \"docs\""/utf8>>).
         -doc ~S/Example "docs"/.
         -doc """
            Example "docs"
        @@ -162,7 +162,7 @@
         
         

        While not a module attribute, but rather a directive (since it might affect syntax), there is the -feature(..) directive used for enabling and disabling -features.

        The syntax is similar to that of an attribute, but has two arguments:

        -feature(FeatureName, enable | disable).

        Note that the feature directive can only appear +features.

        The syntax is similar to that of an attribute, but has two arguments:

        -feature(FeatureName, enable | disable).

        Note that the feature directive can only appear in a prefix of the module.

        /usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/nif.xhtml differs (HTML document, ASCII text, with very long lines) --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/nif.xhtml" 2025-05-10 20:18:56.917079925 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/nif.xhtml" 2025-05-10 20:18:56.937080106 +0000 @@ -42,18 +42,18 @@ they can also be used as fallback implementations for functions that do not have native implementations on some architectures.

        NIF libraries are loaded by calling erlang:load_nif/2, with the name of the shared library as argument. The second argument can be any term that will be -passed on to the library and used for initialization:

        -module(complex6).
        --export([foo/1, bar/1]).
        --nifs([foo/1, bar/1]).
        --on_load(init/0).
        -
        -init() ->
        -    ok = erlang:load_nif("./complex6_nif", 0).
        -
        -foo(_X) ->
        -    erlang:nif_error(nif_library_not_loaded).
        -bar(_Y) ->
        -    erlang:nif_error(nif_library_not_loaded).

        Here, the directive on_load is used to get function init to be automatically +passed on to the library and used for initialization:

        -module(complex6).
        +-export([foo/1, bar/1]).
        +-nifs([foo/1, bar/1]).
        +-on_load(init/0).
        +
        +init() ->
        +    ok = erlang:load_nif("./complex6_nif", 0).
        +
        +foo(_X) ->
        +    erlang:nif_error(nif_library_not_loaded).
        +bar(_Y) ->
        +    erlang:nif_error(nif_library_not_loaded).

        Here, the directive on_load is used to get function init to be automatically called when the module is loaded. If init returns anything other than ok, such when the loading of the NIF library fails in this example, the module is unloaded and calls to functions within it, fail.

        Loading the NIF library overrides the stub implementations and cause calls to @@ -74,35 +74,35 @@ API functions. The environment contains information about the calling Erlang process:

        #include <erl_nif.h>
         
        -extern int foo(int x);
        -extern int bar(int y);
        +extern int foo(int x);
        +extern int bar(int y);
         
        -static ERL_NIF_TERM foo_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
        -{
        +static ERL_NIF_TERM foo_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
        +{
             int x, ret;
        -    if (!enif_get_int(env, argv[0], &x)) {
        -	return enif_make_badarg(env);
        -    }
        -    ret = foo(x);
        -    return enif_make_int(env, ret);
        -}
        +    if (!enif_get_int(env, argv[0], &x)) {
        +	return enif_make_badarg(env);
        +    }
        +    ret = foo(x);
        +    return enif_make_int(env, ret);
        +}
         
        -static ERL_NIF_TERM bar_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
        -{
        +static ERL_NIF_TERM bar_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
        +{
             int y, ret;
        -    if (!enif_get_int(env, argv[0], &y)) {
        -	return enif_make_badarg(env);
        -    }
        -    ret = bar(y);
        -    return enif_make_int(env, ret);
        -}
        -
        -static ErlNifFunc nif_funcs[] = {
        -    {"foo", 1, foo_nif},
        -    {"bar", 1, bar_nif}
        -};
        +    if (!enif_get_int(env, argv[0], &y)) {
        +	return enif_make_badarg(env);
        +    }
        +    ret = bar(y);
        +    return enif_make_int(env, ret);
        +}
        +
        +static ErlNifFunc nif_funcs[] = {
        +    {"foo", 1, foo_nif},
        +    {"bar", 1, bar_nif}
        +};
         
        -ERL_NIF_INIT(complex6, nif_funcs, NULL, NULL, NULL, NULL)

        Here, ERL_NIF_INIT has the following arguments:

        • The first argument must be the name of the Erlang module as a C-identifier. It +ERL_NIF_INIT(complex6, nif_funcs, NULL, NULL, NULL, NULL)

        Here, ERL_NIF_INIT has the following arguments:

        • The first argument must be the name of the Erlang module as a C-identifier. It will be stringified by the macro.
        • The second argument is the array of ErlNifFunc structures containing name, arity, and function pointer of each NIF.
        • The remaining arguments are pointers to callback functions that can be used to initialize the library. They are not used in this simple example, hence they @@ -118,15 +118,15 @@

          Step 1. Compile the C code:

          unix> gcc -o complex6_nif.so -fpic -shared complex.c complex6_nif.c
           windows> cl -LD -MD -Fe complex6_nif.dll complex.c complex6_nif.c

          Step 2: Start Erlang and compile the Erlang code:

          > erl
          -Erlang R13B04 (erts-5.7.5) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
          +Erlang R13B04 (erts-5.7.5) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
           
          -Eshell V5.7.5  (abort with ^G)
          -1> c(complex6).
          -{ok,complex6}

          Step 3: Run the example:

          3> complex6:foo(3).
          +Eshell V5.7.5  (abort with ^G)
          +1> c(complex6).
          +{ok,complex6}

          Step 3: Run the example:

          3> complex6:foo(3).
           4
          -4> complex6:bar(5).
          +4> complex6:bar(5).
           10
          -5> complex6:foo("not an integer").
          +5> complex6:foo("not an integer").
           ** exception error: bad argument
                in function  complex6:foo/1
                   called as comlpex6:foo("not an integer")
          /usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/opaques.xhtml differs (HTML document, ASCII text, with very long lines) --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/opaques.xhtml" 2025-05-10 20:18:56.917079925 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/opaques.xhtml" 2025-05-10 20:18:56.937080106 +0000 @@ -31,16 +31,16 @@ The runtime does not check opacity. Dialyzer provides some opacity-checking, but the rest is up to convention.

          This document explains what Erlang opacity is (and the trade-offs involved) via the example of the sets:set() data type. This type was -defined in the sets module like this:

          -opaque set(Element) :: #set{segs :: segs(Element)}.

          OTP 24 changed the definition to the following in -this commit.

          -opaque set(Element) :: #set{segs :: segs(Element)} | #{Element => ?VALUE}.

          And this change was safer and more backwards-compatible than if the type had +defined in the sets module like this:

          -opaque set(Element) :: #set{segs :: segs(Element)}.

          OTP 24 changed the definition to the following in +this commit.

          -opaque set(Element) :: #set{segs :: segs(Element)} | #{Element => ?VALUE}.

          And this change was safer and more backwards-compatible than if the type had been defined with -type instead of -opaque. Here is why: when a module defines an -opaque, the contract is that only the defining module should rely on the definition of the type: no other modules should rely on the definition.

          This means that code that pattern-matched on set as a record/tuple technically broke the contract, and opted in to being potentially broken when the definition of set() changed. Before OTP 24, this code printed ok. In OTP 24 it may -error:

          case sets:new() of
          -    Set when is_tuple(Set) ->
          -        io:format("ok")
          +error:

          case sets:new() of
          +    Set when is_tuple(Set) ->
          +        io:format("ok")
           end.

          When working with an opaque defined in another module, here are some recommendations:

          • Don't examine the underlying type using pattern-matching, guards, or functions that reveal the type, such as tuple_size/1 .
          • Instead, use functions provided by the module for working with the type. For /usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/otp-patch-apply.xhtml differs (HTML document, ASCII text, with very long lines) --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/otp-patch-apply.xhtml" 2025-05-10 20:18:56.917079925 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/otp-patch-apply.xhtml" 2025-05-10 20:18:56.937080106 +0000 @@ -110,7 +110,7 @@ Application dependencies are verified among installed applications by otp_patch_apply, but these are not necessarily those actually loaded. By calling system_information:sanity_check() one can validate -dependencies among applications actually loaded.

            1> system_information:sanity_check().
            +dependencies among applications actually loaded.

            1> system_information:sanity_check().
             ok

            Please take a look at the reference of sanity_check() for more information.

            /usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/patterns.xhtml differs (HTML document, ASCII text, with very long lines) --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/patterns.xhtml" 2025-05-10 20:18:56.917079925 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/patterns.xhtml" 2025-05-10 20:18:56.937080106 +0000 @@ -37,10 +37,10 @@
            2 3> X + 1. 3 -4> {X, Y} = {1, 2}. +4> {X, Y} = {1, 2}. ** exception error: no match of right hand side value {1,2} -5> {X, Y} = {2, 3}. -{2,3} +5> {X, Y} = {2, 3}. +{2,3} 6> Y. 3
            /usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/prog_ex_records.xhtml differs (HTML document, ASCII text, with very long lines) --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/prog_ex_records.xhtml" 2025-05-10 20:18:56.917079925 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/prog_ex_records.xhtml" 2025-05-10 20:18:56.937080106 +0000 @@ -31,17 +31,17 @@ To illustrate these differences, suppose that you want to represent a person with the tuple {Name, Address, Phone}.

            To write functions that manipulate this data, remember the following:

            • The Name field is the first element of the tuple.
            • The Address field is the second element.
            • The Phone field is the third element.

            For example, to extract data from a variable P that contains such a tuple, you can write the following code and then use pattern matching to extract the -relevant fields:

            Name = element(1, P),
            -Address = element(2, P),
            +relevant fields:

            Name = element(1, P),
            +Address = element(2, P),
             ...

            Such code is difficult to read and understand, and errors occur if the numbering of the elements in the tuple is wrong. If the data representation of the fields is changed, by re-ordering, adding, or removing fields, all references to the person tuple must be checked and possibly modified.

            Records allow references to the fields by name, instead of by position. In the -following example, a record instead of a tuple is used to store the data:

            -record(person, {name, phone, address}).

            This enables references to the fields of the record by name. For example, if P +following example, a record instead of a tuple is used to store the data:

            -record(person, {name, phone, address}).

            This enables references to the fields of the record by name. For example, if P is a variable whose value is a person record, the following code access the name and address fields of the records:

            Name = P#person.name,
             Address = P#person.address,
            -...

            Internally, records are represented using tagged tuples:

            {person, Name, Phone, Address}

            +...

            Internally, records are represented using tagged tuples:

            {person, Name, Phone, Address}

            @@ -51,8 +51,8 @@ section. Three fields are included, name, phone, and address. The default values for name and phone is "" and [], respectively. The default value for address is the atom undefined, since no default value is supplied for this -field:

            -record(person, {name = "", phone = [], address}).

            The record must be defined in the shell to enable use of the record syntax in -the examples:

            > rd(person, {name = "", phone = [], address}).
            +field:

            -record(person, {name = "", phone = [], address}).

            The record must be defined in the shell to enable use of the record syntax in +the examples:

            > rd(person, {name = "", phone = [], address}).
             person

            This is because record definitions are only available at compile time, not at runtime. For details on records in the shell, see the shell manual page in STDLIB.

            @@ -61,10 +61,10 @@ Creating a Record

            -

            A new person record is created as follows:

            > #person{phone=[0,8,2,3,4,3,1,2], name="Robert"}.
            -#person{name = "Robert",phone = [0,8,2,3,4,3,1,2],address = undefined}

            As the address field was omitted, its default value is used.

            From Erlang 5.1/OTP R8B, a value to all fields in a record can be set with the -special field _. _ means "all fields not explicitly specified".

            Example:

            > #person{name = "Jakob", _ = '_'}.
            -#person{name = "Jakob",phone = '_',address = '_'}

            It is primarily intended to be used in ets:match/2 and +

            A new person record is created as follows:

            > #person{phone=[0,8,2,3,4,3,1,2], name="Robert"}.
            +#person{name = "Robert",phone = [0,8,2,3,4,3,1,2],address = undefined}

            As the address field was omitted, its default value is used.

            From Erlang 5.1/OTP R8B, a value to all fields in a record can be set with the +special field _. _ means "all fields not explicitly specified".

            Example:

            > #person{name = "Jakob", _ = '_'}.
            +#person{name = "Jakob",phone = '_',address = '_'}

            It is primarily intended to be used in ets:match/2 and mnesia:match_object/3, to set record fields to the atom '_'. (This is a wildcard in ets:match/2.)

            @@ -72,8 +72,8 @@ Accessing a Record Field

            -

            The following example shows how to access a record field:

            > P = #person{name = "Joe", phone = [0,8,2,3,4,3,1,2]}.
            -#person{name = "Joe",phone = [0,8,2,3,4,3,1,2],address = undefined}
            +

            The following example shows how to access a record field:

            > P = #person{name = "Joe", phone = [0,8,2,3,4,3,1,2]}.
            +#person{name = "Joe",phone = [0,8,2,3,4,3,1,2],address = undefined}
             > P#person.name.
             "Joe"

            @@ -81,33 +81,33 @@ Updating a Record

            -

            The following example shows how to update a record:

            > P1 = #person{name="Joe", phone=[1,2,3], address="A street"}.
            -#person{name = "Joe",phone = [1,2,3],address = "A street"}
            -> P2 = P1#person{name="Robert"}.
            -#person{name = "Robert",phone = [1,2,3],address = "A street"}

            +

            The following example shows how to update a record:

            > P1 = #person{name="Joe", phone=[1,2,3], address="A street"}.
            +#person{name = "Joe",phone = [1,2,3],address = "A street"}
            +> P2 = P1#person{name="Robert"}.
            +#person{name = "Robert",phone = [1,2,3],address = "A street"}

            Type Testing

            The following example shows that the guard succeeds if P is record of type -person:

            foo(P) when is_record(P, person) -> a_person;
            -foo(_) -> not_a_person.

            +person:

            foo(P) when is_record(P, person) -> a_person;
            +foo(_) -> not_a_person.

            Pattern Matching

            Matching can be used in combination with records, as shown in the following -example:

            > P3 = #person{name="Joe", phone=[0,0,7], address="A street"}.
            -#person{name = "Joe",phone = [0,0,7],address = "A street"}
            -> #person{name = Name} = P3, Name.
            +example:

            > P3 = #person{name="Joe", phone=[0,0,7], address="A street"}.
            +#person{name = "Joe",phone = [0,0,7],address = "A street"}
            +> #person{name = Name} = P3, Name.
             "Joe"

            The following function takes a list of person records and searches for the -phone number of a person with a particular name:

            find_phone([#person{name=Name, phone=Phone} | _], Name) ->
            -    {found,  Phone};
            -find_phone([_| T], Name) ->
            -    find_phone(T, Name);
            -find_phone([], Name) ->
            +phone number of a person with a particular name:

            find_phone([#person{name=Name, phone=Phone} | _], Name) ->
            +    {found,  Phone};
            +find_phone([_| T], Name) ->
            +    find_phone(T, Name);
            +find_phone([], Name) ->
                 not_found.

            The fields referred to in the pattern can be given in any order.

            @@ -116,12 +116,12 @@

            The value of a field in a record can be an instance of a record. Retrieval of nested data can be done stepwise, or in a single step, as shown in the following -example:

            -record(name, {first = "Robert", last = "Ericsson"}).
            --record(person, {name = #name{}, phone}).
            +example:

            -record(name, {first = "Robert", last = "Ericsson"}).
            +-record(person, {name = #name{}, phone}).
             
            -demo() ->
            -  P = #person{name= #name{first="Robert",last="Virding"}, phone=123},
            -  First = (P#person.name)#name.first.

            Here, demo() evaluates to "Robert".

            +demo() -> + P = #person{name= #name{first="Robert",last="Virding"}, phone=123}, + First = (P#person.name)#name.first.

            Here, demo() evaluates to "Robert".

            @@ -139,40 +139,40 @@ %% about the person. %% A {Key, Value} list (default is the empty list). %%------------------------------------------------------------ --record(person, {name, age, phone = [], dict = []}).

            -module(person).
            --include("person.hrl").
            --compile(export_all). % For test purposes only.
            +-record(person, {name, age, phone = [], dict = []}).
            -module(person).
            +-include("person.hrl").
            +-compile(export_all). % For test purposes only.
             
             %% This creates an instance of a person.
             %%   Note: The phone number is not supplied so the
             %%         default value [] will be used.
             
            -make_hacker_without_phone(Name, Age) ->
            -   #person{name = Name, age = Age,
            -           dict = [{computer_knowledge, excellent},
            -                   {drinks, coke}]}.
            +make_hacker_without_phone(Name, Age) ->
            +   #person{name = Name, age = Age,
            +           dict = [{computer_knowledge, excellent},
            +                   {drinks, coke}]}.
             
             %% This demonstrates matching in arguments
             
            -print(#person{name = Name, age = Age,
            -              phone = Phone, dict = Dict}) ->
            -  io:format("Name: ~s, Age: ~w, Phone: ~w ~n"
            -            "Dictionary: ~w.~n", [Name, Age, Phone, Dict]).
            +print(#person{name = Name, age = Age,
            +              phone = Phone, dict = Dict}) ->
            +  io:format("Name: ~s, Age: ~w, Phone: ~w ~n"
            +            "Dictionary: ~w.~n", [Name, Age, Phone, Dict]).
             
             %% Demonstrates type testing, selector, updating.
             
            -birthday(P) when is_record(P, person) ->
            -   P#person{age = P#person.age + 1}.
            +birthday(P) when is_record(P, person) ->
            +   P#person{age = P#person.age + 1}.
             
            -register_two_hackers() ->
            -   Hacker1 = make_hacker_without_phone("Joe", 29),
            -   OldHacker = birthday(Hacker1),
            +register_two_hackers() ->
            +   Hacker1 = make_hacker_without_phone("Joe", 29),
            +   OldHacker = birthday(Hacker1),
                % The central_register_server should have
                % an interface function for this.
            -   central_register_server ! {register_person, Hacker1},
            -   central_register_server ! {register_person,
            -             OldHacker#person{name = "Robert",
            -                              phone = [0,8,3,2,4,5,3,1]}}.
            +
            central_register_server ! {register_person, Hacker1}, + central_register_server ! {register_person, + OldHacker#person{name = "Robert", + phone = [0,8,3,2,4,5,3,1]}}.
            /usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/records_macros.xhtml differs (HTML document, ASCII text, with very long lines) --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/records_macros.xhtml" 2025-05-10 20:18:56.917079925 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/records_macros.xhtml" 2025-05-10 20:18:56.937080106 +0000 @@ -33,7 +33,7 @@ introduced:

            %%%----FILE mess_config.hrl----
             
             %%% Configure the location of the server node,
            --define(server_node, messenger@super).
            +-define(server_node, messenger@super).
             
             %%%----END FILE----
            %%%----FILE mess_interface.hrl----
             
            @@ -41,24 +41,24 @@
             %%% messenger program
             
             %%%Messages from Client to server received in server/1 function.
            --record(logon,{client_pid, username}).
            --record(message,{client_pid, to_name, message}).
            +-record(logon,{client_pid, username}).
            +-record(message,{client_pid, to_name, message}).
             %%% {'EXIT', ClientPid, Reason}  (client terminated or unreachable.
             
             %%% Messages from Server to Client, received in await_result/0 function
            --record(abort_client,{message}).
            +-record(abort_client,{message}).
             %%% Messages are: user_exists_at_other_node,
             %%%               you_are_not_logged_on
            --record(server_reply,{message}).
            +-record(server_reply,{message}).
             %%% Messages are: logged_on
             %%%               receiver_not_found
             %%%               sent  (Message has been sent (no guarantee)
             %%% Messages from Server to Client received in client/1 function
            --record(message_from,{from_name, message}).
            +-record(message_from,{from_name, message}).
             
             %%% Messages from shell to Client received in client/1 function
             %%% spawn(mess_client, client, [server_node(), Name])
            --record(message_to,{to_name, message}).
            +-record(message_to,{to_name, message}).
             %%% logoff
             
             %%%----END FILE----
            %%%----FILE user_interface.erl----
            @@ -79,27 +79,27 @@
             %%%     function is not logged on or if ToName is not logged on at
             %%%     any node.
             
            --module(user_interface).
            --export([logon/1, logoff/0, message/2]).
            --include("mess_interface.hrl").
            --include("mess_config.hrl").
            +-module(user_interface).
            +-export([logon/1, logoff/0, message/2]).
            +-include("mess_interface.hrl").
            +-include("mess_config.hrl").
             
            -logon(Name) ->
            -    case whereis(mess_client) of
            +logon(Name) ->
            +    case whereis(mess_client) of
                     undefined ->
            -            register(mess_client,
            -                     spawn(mess_client, client, [?server_node, Name]));
            +            register(mess_client,
            +                     spawn(mess_client, client, [?server_node, Name]));
                     _ -> already_logged_on
                 end.
             
            -logoff() ->
            +logoff() ->
                 mess_client ! logoff.
             
            -message(ToName, Message) ->
            -    case whereis(mess_client) of % Test if the client is running
            +message(ToName, Message) ->
            +    case whereis(mess_client) of % Test if the client is running
                     undefined ->
                         not_logged_on;
            -        _ -> mess_client ! #message_to{to_name=ToName, message=Message},
            +        _ -> mess_client ! #message_to{to_name=ToName, message=Message},
                          ok
             end.
             
            @@ -107,107 +107,107 @@
             
             %%% The client process which runs on each user node
             
            --module(mess_client).
            --export([client/2]).
            --include("mess_interface.hrl").
            -
            -client(Server_Node, Name) ->
            -    {messenger, Server_Node} ! #logon{client_pid=self(), username=Name},
            -    await_result(),
            -    client(Server_Node).
            +-module(mess_client).
            +-export([client/2]).
            +-include("mess_interface.hrl").
            +
            +client(Server_Node, Name) ->
            +    {messenger, Server_Node} ! #logon{client_pid=self(), username=Name},
            +    await_result(),
            +    client(Server_Node).
             
            -client(Server_Node) ->
            +client(Server_Node) ->
                 receive
                     logoff ->
            -            exit(normal);
            -        #message_to{to_name=ToName, message=Message} ->
            -            {messenger, Server_Node} !
            -                #message{client_pid=self(), to_name=ToName, message=Message},
            -            await_result();
            -        {message_from, FromName, Message} ->
            -            io:format("Message from ~p: ~p~n", [FromName, Message])
            +            exit(normal);
            +        #message_to{to_name=ToName, message=Message} ->
            +            {messenger, Server_Node} !
            +                #message{client_pid=self(), to_name=ToName, message=Message},
            +            await_result();
            +        {message_from, FromName, Message} ->
            +            io:format("Message from ~p: ~p~n", [FromName, Message])
                 end,
            -    client(Server_Node).
            +    client(Server_Node).
             
             %%% wait for a response from the server
            -await_result() ->
            +await_result() ->
                 receive
            -        #abort_client{message=Why} ->
            -            io:format("~p~n", [Why]),
            -            exit(normal);
            -        #server_reply{message=What} ->
            -            io:format("~p~n", [What])
            +        #abort_client{message=Why} ->
            +            io:format("~p~n", [Why]),
            +            exit(normal);
            +        #server_reply{message=What} ->
            +            io:format("~p~n", [What])
                 after 5000 ->
            -            io:format("No response from server~n", []),
            -            exit(timeout)
            +            io:format("No response from server~n", []),
            +            exit(timeout)
                 end.
             
             %%%----END FILE---
            %%%----FILE mess_server.erl----
             
             %%% This is the server process of the messenger service
             
            --module(mess_server).
            --export([start_server/0, server/0]).
            --include("mess_interface.hrl").
            -
            -server() ->
            -    process_flag(trap_exit, true),
            -    server([]).
            +-module(mess_server).
            +-export([start_server/0, server/0]).
            +-include("mess_interface.hrl").
            +
            +server() ->
            +    process_flag(trap_exit, true),
            +    server([]).
             
             %%% the user list has the format [{ClientPid1, Name1},{ClientPid22, Name2},...]
            -server(User_List) ->
            -    io:format("User list = ~p~n", [User_List]),
            +server(User_List) ->
            +    io:format("User list = ~p~n", [User_List]),
                 receive
            -        #logon{client_pid=From, username=Name} ->
            -            New_User_List = server_logon(From, Name, User_List),
            -            server(New_User_List);
            -        {'EXIT', From, _} ->
            -            New_User_List = server_logoff(From, User_List),
            -            server(New_User_List);
            -        #message{client_pid=From, to_name=To, message=Message} ->
            -            server_transfer(From, To, Message, User_List),
            -            server(User_List)
            +        #logon{client_pid=From, username=Name} ->
            +            New_User_List = server_logon(From, Name, User_List),
            +            server(New_User_List);
            +        {'EXIT', From, _} ->
            +            New_User_List = server_logoff(From, User_List),
            +            server(New_User_List);
            +        #message{client_pid=From, to_name=To, message=Message} ->
            +            server_transfer(From, To, Message, User_List),
            +            server(User_List)
                 end.
             
             %%% Start the server
            -start_server() ->
            -    register(messenger, spawn(?MODULE, server, [])).
            +start_server() ->
            +    register(messenger, spawn(?MODULE, server, [])).
             
             %%% Server adds a new user to the user list
            -server_logon(From, Name, User_List) ->
            +server_logon(From, Name, User_List) ->
            /usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/ref_man_functions.xhtml differs (HTML document, ASCII text, with very long lines)
            --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/ref_man_functions.xhtml"	2025-05-10 20:18:56.917079925 +0000
            +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/ref_man_functions.xhtml"	2025-05-10 20:18:56.937080106 +0000
            @@ -29,10 +29,10 @@
             

            A function declaration is a sequence of function clauses separated by semicolons, and terminated by a period (.).

            A function clause consists of a clause head and a clause body, separated by ->.

            A clause head consists of the function name, an argument list, and an optional -guard sequence beginning with the keyword when:

            Name(Pattern11,...,Pattern1N) [when GuardSeq1] ->
            +guard sequence beginning with the keyword when:

            Name(Pattern11,...,Pattern1N) [when GuardSeq1] ->
                 Body1;
             ...;
            -Name(PatternK1,...,PatternKN) [when GuardSeqK] ->
            +Name(PatternK1,...,PatternKN) [when GuardSeqK] ->
                 BodyK.

            The function name is an atom. Each argument is a pattern.

            The number of arguments N is the arity of the function. A function is uniquely defined by the module name, function name, and arity. That is, two functions with the same name and in the same module, but with different arities @@ -40,10 +40,10 @@ mod:f/N.

            A clause body consists of a sequence of expressions separated by comma (,):

            Expr1,
             ...,
             ExprN

            Valid Erlang expressions and guard sequences are described in -Expressions.

            Example:

            fact(N) when N > 0 ->  % first clause head
            -    N * fact(N-1);     % first clause body
            +Expressions.

            Example:

            fact(N) when N > 0 ->  % first clause head
            +    N * fact(N-1);     % first clause body
             
            -fact(0) ->             % second clause head
            +fact(0) ->             % second clause head
                 1.                 % second clause body

            @@ -56,16 +56,16 @@ clause is found that fulfills both of the following two conditions:

            1. The patterns in the clause head can be successfully matched against the given arguments.
            2. The guard sequence, if any, is true.

            If such a clause cannot be found, a function_clause runtime error occurs.

            If such a clause is found, the corresponding clause body is evaluated. That is, the expressions in the body are evaluated sequentially and the value of the last -expression is returned.

            Consider the function fact:

            -module(mod).
            --export([fact/1]).
            +expression is returned.

            Consider the function fact:

            -module(mod).
            +-export([fact/1]).
             
            -fact(N) when N > 0 ->
            -    N * fact(N - 1);
            -fact(0) ->
            +fact(N) when N > 0 ->
            +    N * fact(N - 1);
            +fact(0) ->
                 1.

            Assume that you want to calculate the factorial for 1:

            1> mod:fact(1).

            Evaluation starts at the first clause. The pattern N is matched against argument 1. The matching succeeds and the guard (N > 0) is true, thus N is -bound to 1, and the corresponding body is evaluated:

            N * fact(N-1) => (N is bound to 1)
            -1 * fact(0)

            Now, fact(0) is called, and the function clauses are scanned +bound to 1, and the corresponding body is evaluated:

            N * fact(N-1) => (N is bound to 1)
            +1 * fact(0)

            Now, fact(0) is called, and the function clauses are scanned sequentially again. First, the pattern N is matched against 0. The matching succeeds, but the guard (N > 0) is false. Second, the pattern 0 is matched against the argument 0. The matching succeeds @@ -82,9 +82,9 @@ tail-recursive call is done. This is to ensure that no system resources, for example, call stack, are consumed. This means that an infinite loop using tail-recursive calls will not exhaust the call -stack and can (in principle) run forever.

            Example:

            loop(N) ->
            -    io:format("~w~n", [N]),
            -    loop(N+1).

            The earlier factorial example is a counter-example. It is not +stack and can (in principle) run forever.

            Example:

            loop(N) ->
            +    io:format("~w~n", [N]),
            +    loop(N+1).

            The earlier factorial example is a counter-example. It is not tail-recursive, since a multiplication is done on the result of the recursive call to fact(N-1).

            @@ -100,9 +100,9 @@ not need to be prefixed with the module name. Which BIFs that are auto-imported is specified in the erlang module in ERTS. For example, standard-type conversion BIFs like atom_to_list and BIFs allowed in guards can be called -without specifying the module name.

            Examples:

            1> tuple_size({a,b,c}).
            +without specifying the module name.

            Examples:

            1> tuple_size({a,b,c}).
             3
            -2> atom_to_list('Erlang').
            +2> atom_to_list('Erlang').
             "Erlang"
            /usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/ref_man_processes.xhtml differs (HTML document, ASCII text, with very long lines) --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/ref_man_processes.xhtml" 2025-05-10 20:18:56.917079925 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/ref_man_processes.xhtml" 2025-05-10 20:18:56.937080106 +0000 @@ -34,10 +34,10 @@ Process Creation

            -

            A process is created by calling spawn():

            spawn(Module, Name, Args) -> pid()
            -  Module = Name = atom()
            -  Args = [Arg1,...,ArgN]
            -    ArgI = term()

            spawn() creates a new process and returns the pid.

            The new process starts executing in Module:Name(Arg1,...,ArgN) where the +

            A process is created by calling spawn():

            spawn(Module, Name, Args) -> pid()
            +  Module = Name = atom()
            +  Args = [Arg1,...,ArgN]
            +    ArgI = term()

            spawn() creates a new process and returns the pid.

            The new process starts executing in Module:Name(Arg1,...,ArgN) where the arguments are the elements of the (possible empty) Args argument list.

            There exist a number of different spawn BIFs:

            /usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/ref_man_records.xhtml differs (HTML document, ASCII text, with very long lines) --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/ref_man_records.xhtml" 2025-05-10 20:18:56.917079925 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/ref_man_records.xhtml" 2025-05-10 20:18:56.933080070 +0000 @@ -32,9 +32,9 @@

            A record definition consists of the name of the record, followed by the field names of the record. Record and field names must be atoms. Each field can be given an optional default value. If no default value is supplied, undefined is -used.

            -record(Name, {Field1 [= Expr1],
            +used.

            -record(Name, {Field1 [= Expr1],
                            ...
            -               FieldN [= ExprN]}).

            The default value for a field is an arbitrary expression, except that it must + FieldN [= ExprN]}).

            The default value for a field is an arbitrary expression, except that it must not use any variables.

            A record definition can be placed anywhere among the attributes and function declarations of a module, but the definition must come before any usage of the record.

            If a record is used in several modules, it is recommended that the record @@ -52,24 +52,24 @@ default value instead.

            If several fields are to be assigned the same value, the following construction can be used:

            #Name{Field1=Expr1, ..., FieldK=ExprK, _=ExprL}

            Omitted fields then get the value of evaluating ExprL instead of their default values. This feature is primarily intended to be used to create patterns for ETS -and Mnesia match functions.

            Example:

            -record(person, {name, phone, address}).
            +and Mnesia match functions.

            Example:

            -record(person, {name, phone, address}).
             
            -lookup(Name, Tab) ->
            -    ets:match_object(Tab, #person{name=Name, _='_'}).

            +lookup(Name, Tab) -> + ets:match_object(Tab, #person{name=Name, _='_'}).

            Accessing Record Fields

            Expr#Name.Field

            Returns the value of the specified field. Expr is to evaluate to a Name -record.

            Example:

            -record(person, {name, phone, address}).
            +record.

            Example:

            -record(person, {name, phone, address}).
             
            -get_person_name(Person) ->
            +get_person_name(Person) ->
                 Person#person.name.

            The following expression returns the position of the specified field in the -tuple representation of the record:

            #Name.Field

            Example:

            -record(person, {name, phone, address}).
            +tuple representation of the record:

            #Name.Field

            Example:

            -record(person, {name, phone, address}).
             
            -lookup(Name, List) ->
            -    lists:keyfind(Name, #person.name, List).

            +lookup(Name, List) -> + lists:keyfind(Name, #person.name, List).

            @@ -87,13 +87,13 @@

            Since record expressions are expanded to tuple expressions, creating records and accessing record fields are allowed in guards. However, all subexpressions (for initializing fields), must be valid guard -expressions as well.

            Examples:

            handle(Msg, State) when Msg =:= #msg{to=void, no=3} ->
            +expressions as well.

            Examples:

            handle(Msg, State) when Msg =:= #msg{to=void, no=3} ->
                 ...
             
            -handle(Msg, State) when State#state.running =:= true ->
            -    ...

            There is also a type test BIF is_record(Term, RecordTag).

            Example:

            is_person(P) when is_record(P, person) ->
            +handle(Msg, State) when State#state.running =:= true ->
            +    ...

            There is also a type test BIF is_record(Term, RecordTag).

            Example:

            is_person(P) when is_record(P, person) ->
                 true;
            -is_person(_P) ->
            +is_person(_P) ->
                 false.

            @@ -107,11 +107,11 @@ Nested Records

            -

            Assume the following record definitions:

            -record(nrec0, {name = "nested0"}).
            --record(nrec1, {name = "nested1", nrec0=#nrec0{}}).
            --record(nrec2, {name = "nested2", nrec1=#nrec1{}}).
            +

            Assume the following record definitions:

            -record(nrec0, {name = "nested0"}).
            +-record(nrec1, {name = "nested1", nrec0=#nrec0{}}).
            +-record(nrec2, {name = "nested2", nrec1=#nrec1{}}).
             
            -N2 = #nrec2{},

            Accessing or updating nested records can be written without parentheses:

            "nested0" = N2#nrec2.nrec1#nrec1.nrec0#nrec0.name,
            +N2 = #nrec2{},

            Accessing or updating nested records can be written without parentheses:

            "nested0" = N2#nrec2.nrec1#nrec1.nrec0#nrec0.name,
                 N0n = N2#nrec2.nrec1#nrec1.nrec0#nrec0{name = "nested0a"},

            which is equivalent to:

            "nested0" = ((N2#nrec2.nrec1)#nrec1.nrec0)#nrec0.name,
             N0n = ((N2#nrec2.nrec1)#nrec1.nrec0)#nrec0{name = "nested0a"},

            Change

            Before Erlang/OTP R14, parentheses were necessary when accessing or updating nested records.

            @@ -121,9 +121,9 @@ Internal Representation of Records

            Record expressions are translated to tuple expressions during compilation. A -record defined as:

            -record(Name, {Field1, ..., FieldN}).

            is internally represented by the tuple:

            {Name, Value1, ..., ValueN}

            Here each ValueI is the default value for FieldI.

            To each module using records, a pseudo function is added during compilation to -obtain information about records:

            record_info(fields, Record) -> [Field]
            -record_info(size, Record) -> Size

            Size is the size of the tuple representation, that is, one more than the +record defined as:

            -record(Name, {Field1, ..., FieldN}).

            is internally represented by the tuple:

            {Name, Value1, ..., ValueN}

            Here each ValueI is the default value for FieldI.

            To each module using records, a pseudo function is added during compilation to +obtain information about records:

            record_info(fields, Record) -> [Field]
            +record_info(size, Record) -> Size

            Size is the size of the tuple representation, that is, one more than the number of fields.

            /usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/release_handling.xhtml differs (HTML document, ASCII text, with very long lines) --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/release_handling.xhtml" 2025-05-10 20:18:56.917079925 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/release_handling.xhtml" 2025-05-10 20:18:56.933080070 +0000 @@ -132,15 +132,15 @@ Instead, it is necessary to:

            • Suspend the processes using the module (to avoid that they try to handle any requests before the code replacement is completed).
            • Ask them to transform the internal state format and switch to the new version of the module.
            • Remove the old version.
            • Resume the processes.

            This is called synchronized code replacement and for this the following -instructions are used:

            {update, Module, {advanced, Extra}}
            -{update, Module, supervisor}

            update with argument {advanced,Extra} is used when changing the internal +instructions are used:

            {update, Module, {advanced, Extra}}
            +{update, Module, supervisor}

            update with argument {advanced,Extra} is used when changing the internal state of a behaviour as described above. It causes behaviour processes to call the callback function code_change/3, passing the term Extra and some other information as arguments. See the manual pages for the respective behaviours and Appup Cookbook.

            update with argument supervisor is used when changing the start specification of a supervisor. See Appup Cookbook.

            When a module is to be updated, the release handler finds which processes that are using the module by traversing the supervision tree of each running -application and checking all the child specifications:

            {Id, StartFunc, Restart, Shutdown, Type, Modules}

            A process uses a module if the name is listed in Modules in the child +application and checking all the child specifications:

            {Id, StartFunc, Restart, Shutdown, Type, Modules}

            A process uses a module if the name is listed in Modules in the child specification for the process.

            If Modules=dynamic, which is the case for event managers, the event manager process informs the release handler about the list of currently installed event handlers (gen_event), and it is checked if the module name is in this list @@ -152,10 +152,10 @@ add_module and delete_module

            -

            If a new module is introduced, the following instruction is used:

            {add_module, Module}

            This instruction loads module Module. When running Erlang in +

            If a new module is introduced, the following instruction is used:

            {add_module, Module}

            This instruction loads module Module. When running Erlang in embedded mode it is necessary to use this this instruction. It is not strictly required when running Erlang in interactive mode, since the -code server automatically searches for and loads unloaded modules.

            The opposite of add_module is delete_module, which unloads a module:

            {delete_module, Module}

            Any process, in any application, with Module as residence module, is +code server automatically searches for and loads unloaded modules.

            The opposite of add_module is delete_module, which unloads a module:

            {delete_module, Module}

            Any process, in any application, with Module as residence module, is killed when the instruction is evaluated. Therefore, the user must ensure that all such processes are terminated before deleting module Module to avoid a situation with failing supervisor restarts.

            @@ -236,13 +236,13 @@

            To define how to upgrade/downgrade between the current version and previous versions of an application, an application upgrade file, or in short .appup file is created. The file is to be called Application.appup, where -Application is the application name:

            {Vsn,
            - [{UpFromVsn1, InstructionsU1},
            +Application is the application name:

            {Vsn,
            + [{UpFromVsn1, InstructionsU1},
               ...,
            -  {UpFromVsnK, InstructionsUK}],
            - [{DownToVsn1, InstructionsD1},
            +  {UpFromVsnK, InstructionsUK}],
            + [{DownToVsn1, InstructionsD1},
               ...,
            -  {DownToVsnK, InstructionsDK}]}.
            • Vsn, a string, is the current version of the application, as defined in the + {DownToVsnK, InstructionsDK}]}.
            • Vsn, a string, is the current version of the application, as defined in the .app file.
            • Each UpFromVsn is a previous version of the application to upgrade from.
            • Each DownToVsn is a previous version of the application to downgrade to.
            • Each Instructions is a list of release handling instructions.

            UpFromVsn and DownToVsn can also be specified as regular expressions. For more information about the syntax and contents of the .appup file, see appup in SASL.

            Appup Cookbook includes examples of .appup files for @@ -250,52 +250,52 @@ Releases. Assume you want to add a function available/0 to server ch3, which returns the number of available channels (when trying out the example, make the change in a copy of the original -directory, to ensure that the first version is still available):

            -module(ch3).
            --behaviour(gen_server).
            +directory, to ensure that the first version is still available):

            -module(ch3).
            +-behaviour(gen_server).
             
            --export([start_link/0]).
            --export([alloc/0, free/1]).
            --export([available/0]).
            --export([init/1, handle_call/3, handle_cast/2]).
            +-export([start_link/0]).
            +-export([alloc/0, free/1]).
            +-export([available/0]).
            +-export([init/1, handle_call/3, handle_cast/2]).
             
            -start_link() ->
            -    gen_server:start_link({local, ch3}, ch3, [], []).
            +start_link() ->
            +    gen_server:start_link({local, ch3}, ch3, [], []).
             
            -alloc() ->
            -    gen_server:call(ch3, alloc).
            +alloc() ->
            +    gen_server:call(ch3, alloc).
             
            -free(Ch) ->
            -    gen_server:cast(ch3, {free, Ch}).
            +free(Ch) ->
            +    gen_server:cast(ch3, {free, Ch}).
             
            -available() ->
            -    gen_server:call(ch3, available).
            +available() ->
            +    gen_server:call(ch3, available).
             
            -init(_Args) ->
            -    {ok, channels()}.
            +init(_Args) ->
            +    {ok, channels()}.
             
            -handle_call(alloc, _From, Chs) ->
            -    {Ch, Chs2} = alloc(Chs),
            -    {reply, Ch, Chs2};
            -handle_call(available, _From, Chs) ->
            -    N = available(Chs),
            -    {reply, N, Chs}.
            +handle_call(alloc, _From, Chs) ->
            +    {Ch, Chs2} = alloc(Chs),
            +    {reply, Ch, Chs2};
            +handle_call(available, _From, Chs) ->
            +    N = available(Chs),
            +    {reply, N, Chs}.
             
            -handle_cast({free, Ch}, Chs) ->
            -    Chs2 = free(Ch, Chs),
            -    {noreply, Chs2}.

            A new version of the ch_app.app file must now be created, where the version is -updated:

            {application, ch_app,
            - [{description, "Channel allocator"},
            -  {vsn, "2"},
            -  {modules, [ch_app, ch_sup, ch3]},
            -  {registered, [ch3]},
            -  {applications, [kernel, stdlib, sasl]},
            -  {mod, {ch_app,[]}}
            - ]}.

            To upgrade ch_app from "1" to "2" (and to downgrade from "2" to "1"), +handle_cast({free, Ch}, Chs) -> + Chs2 = free(Ch, Chs), + {noreply, Chs2}.

            A new version of the ch_app.app file must now be created, where the version is +updated:

            {application, ch_app,
            + [{description, "Channel allocator"},
            +  {vsn, "2"},
            +  {modules, [ch_app, ch_sup, ch3]},
            +  {registered, [ch3]},
            +  {applications, [kernel, stdlib, sasl]},
            +  {mod, {ch_app,[]}}
            + ]}.

            To upgrade ch_app from "1" to "2" (and to downgrade from "2" to "1"), you only need to load the new (old) version of the ch3 callback module. Create -the application upgrade file ch_app.appup in the ebin directory:

            {"2",
            - [{"1", [{load_module, ch3}]}],
            - [{"1", [{load_module, ch3}]}]
            -}.

            +the application upgrade file ch_app.appup in the ebin directory:

            {"2",
            + [{"1", [{load_module, ch3}]}],
            + [{"1", [{load_module, ch3}]}]
            +}.

            @@ -314,14 +314,14 @@ relup in SASL.

            Example, continued from the previous section: You have a new version "2" of ch_app and an .appup file. A new version of the .rel file is also needed. This time the file is called ch_rel-2.rel and the release version string is -changed from "A" to "B":

            {release,
            - {"ch_rel", "B"},
            - {erts, "14.2.5"},
            - [{kernel, "9.2.4"},
            -  {stdlib, "5.2.3"},
            -  {sasl, "4.2.1"},
            -  {ch_app, "2"}]
            -}.

            Now the relup file can be generated:

            1> systools:make_relup("ch_rel-2", ["ch_rel-1"], ["ch_rel-1"]).
            +changed from "A" to "B":

            {release,
            + {"ch_rel", "B"},
            + {erts, "14.2.5"},
            + [{kernel, "9.2.4"},
            +  {stdlib, "5.2.3"},
            +  {sasl, "4.2.1"},
            +  {ch_app, "2"}]
            +}.

            Now the relup file can be generated:

            1> systools:make_relup("ch_rel-2", ["ch_rel-1"], ["ch_rel-1"]).
             ok

            This generates a relup file with instructions for how to upgrade from version "A" ("ch_rel-1") to version "B" ("ch_rel-2") and how to downgrade from version "B" to version "A".

            Both the old and new versions of the .app and .rel files must be in the code @@ -342,17 +342,17 @@ packages. The release_handler module communicates with this process.

            Assuming there is an operational target system with installation root directory $ROOT, the release package with the new version of the release is to be copied to $ROOT/releases.

            First, unpack the release package. The files are then extracted from the -package:

            release_handler:unpack_release(ReleaseName) => {ok, Vsn}
            • ReleaseName is the name of the release package except the .tar.gz +package:

              release_handler:unpack_release(ReleaseName) => {ok, Vsn}
              • ReleaseName is the name of the release package except the .tar.gz extension.
              • Vsn is the version of the unpacked release, as defined in its .rel file.

              A directory $ROOT/lib/releases/Vsn is created, where the .rel file, the boot script start.boot, the system configuration file sys.config, and relup are placed. For applications with new version numbers, the application directories are placed under $ROOT/lib. Unchanged applications are not affected.

              An unpacked release can be installed. The release handler then evaluates the -instructions in relup, step by step:

              release_handler:install_release(Vsn) => {ok, FromVsn, []}

              If an error occurs during the installation, the system is rebooted using the old +instructions in relup, step by step:

              release_handler:install_release(Vsn) => {ok, FromVsn, []}

              If an error occurs during the installation, the system is rebooted using the old version of the release. If installation succeeds, the system is afterwards using the new version of the release, but if anything happens and the system is rebooted, it starts using the previous version again.

              To be made the default version, the newly installed release must be made permanent, which means the previous version becomes old:

              release_handler:make_permanent(Vsn) => ok

              The system keeps information about which versions are old and permanent in the -files $ROOT/releases/RELEASES and $ROOT/releases/start_erl.data.

              To downgrade from Vsn to FromVsn, install_release must be called again:

              release_handler:install_release(FromVsn) => {ok, Vsn, []}

              An installed, but not permanent, release can be removed. Information about the +files $ROOT/releases/RELEASES and $ROOT/releases/start_erl.data.

              To downgrade from Vsn to FromVsn, install_release must be called again:

              release_handler:install_release(FromVsn) => {ok, Vsn, []}

              An installed, but not permanent, release can be removed. Information about the release is then deleted from $ROOT/releases/RELEASES and the release-specific code, that is, the new application directories and the $ROOT/releases/Vsn directory, are removed.

              release_handler:remove_release(Vsn) => ok

              @@ -371,9 +371,9 @@ ...

            $ROOT is the installation directory of the target system.

            Step 3) In another Erlang shell, generate start scripts and create a release package for the new version "B". Remember to include (a possible updated) sys.config and the relup file. For more information, see -Release Upgrade File.

            1> systools:make_script("ch_rel-2").
            +Release Upgrade File.

            1> systools:make_script("ch_rel-2").
             ok
            -2> systools:make_tar("ch_rel-2").
            +2> systools:make_tar("ch_rel-2").
             ok

            The new release package now also contains version "2" of ch_app and the relup file:

            % tar tf ch_rel-2.tar
             lib/kernel-9.2.4/ebin/kernel.app
            @@ -394,23 +394,23 @@
            /usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/release_structure.xhtml differs (HTML document, ASCII text, with very long lines)
            --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/release_structure.xhtml"	2025-05-10 20:18:56.917079925 +0000
            +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/release_structure.xhtml"	2025-05-10 20:18:56.933080070 +0000
            @@ -45,29 +45,29 @@
             

            To define a release, create a release resource file, or in short a .rel file. In the file, specify the name and version of the release, which ERTS -version it is based on, and which applications it consists of:

            {release, {Name,Vsn}, {erts, EVsn},
            - [{Application1, AppVsn1},
            +version it is based on, and which applications it consists of:

            {release, {Name,Vsn}, {erts, EVsn},
            + [{Application1, AppVsn1},
                ...
            -  {ApplicationN, AppVsnN}]}.

            Name, Vsn, EVsn, and AppVsn are strings.

            The file must be named Rel.rel, where Rel is a unique name.

            Each Application (atom) and AppVsn is the name and version of an application + {ApplicationN, AppVsnN}]}.

            Name, Vsn, EVsn, and AppVsn are strings.

            The file must be named Rel.rel, where Rel is a unique name.

            Each Application (atom) and AppVsn is the name and version of an application included in the release. The minimal release based on Erlang/OTP consists of the Kernel and STDLIB applications, so these applications must be included in the list.

            If the release is to be upgraded, it must also include the SASL application.

            Here is an example showing the .app file for a release of ch_app from -the Applications section:

            {application, ch_app,
            - [{description, "Channel allocator"},
            -  {vsn, "1"},
            -  {modules, [ch_app, ch_sup, ch3]},
            -  {registered, [ch3]},
            -  {applications, [kernel, stdlib, sasl]},
            -  {mod, {ch_app,[]}}
            - ]}.

            The .rel file must also contain kernel, stdlib, and sasl, as these -applications are required by ch_app. The file is called ch_rel-1.rel:

            {release,
            - {"ch_rel", "A"},
            - {erts, "14.2.5"},
            - [{kernel, "9.2.4"},
            -  {stdlib, "5.2.3"},
            -  {sasl, "4.2.1"},
            -  {ch_app, "1"}]
            -}.

            +the Applications section:

            {application, ch_app,
            + [{description, "Channel allocator"},
            +  {vsn, "1"},
            +  {modules, [ch_app, ch_sup, ch3]},
            +  {registered, [ch3]},
            +  {applications, [kernel, stdlib, sasl]},
            +  {mod, {ch_app,[]}}
            + ]}.

            The .rel file must also contain kernel, stdlib, and sasl, as these +applications are required by ch_app. The file is called ch_rel-1.rel:

            {release,
            + {"ch_rel", "A"},
            + {erts, "14.2.5"},
            + [{kernel, "9.2.4"},
            +  {stdlib, "5.2.3"},
            +  {sasl, "4.2.1"},
            +  {ch_app, "1"}]
            +}.

            @@ -99,9 +99,9 @@

            The systools:make_tar/1,2 function takes a .rel file as input and creates a zipped tar file with the code for -the specified applications, a release package:

            1> systools:make_script("ch_rel-1").
            +the specified applications, a release package:

            1> systools:make_script("ch_rel-1").
             ok
            -2> systools:make_tar("ch_rel-1").
            +2> systools:make_tar("ch_rel-1").
             ok

            The release package by default contains:

            • The .app files
            • The .rel file
            • The object code for all applications, structured according to the application directory structure
            • The binary boot script renamed to start.boot
            % tar tf ch_rel-1.tar
             lib/kernel-9.2.4/ebin/kernel.app
            /usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/robustness.xhtml differs (HTML document, ASCII text, with very long lines)
            --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/robustness.xhtml"	2025-05-10 20:18:56.917079925 +0000
            +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/robustness.xhtml"	2025-05-10 20:18:56.933080070 +0000
            @@ -37,36 +37,36 @@
             "pong" so that "pong" can also finish. Another way to let "pong" finish is to
             make "pong" exit if it does not receive a message from ping within a certain
             time. This can be done by adding a time-out to pong as shown in the
            -following example:

            -module(tut19).
            +following example:

            -module(tut19).
             
            --export([start_ping/1, start_pong/0,  ping/2, pong/0]).
            +-export([start_ping/1, start_pong/0,  ping/2, pong/0]).
             
            -ping(0, Pong_Node) ->
            -    io:format("ping finished~n", []);
            +ping(0, Pong_Node) ->
            +    io:format("ping finished~n", []);
             
            -ping(N, Pong_Node) ->
            -    {pong, Pong_Node} ! {ping, self()},
            +ping(N, Pong_Node) ->
            +    {pong, Pong_Node} ! {ping, self()},
                 receive
                     pong ->
            -            io:format("Ping received pong~n", [])
            +            io:format("Ping received pong~n", [])
                 end,
            -    ping(N - 1, Pong_Node).
            +    ping(N - 1, Pong_Node).
             
            -pong() ->
            +pong() ->
                 receive
            -        {ping, Ping_PID} ->
            -            io:format("Pong received ping~n", []),
            +        {ping, Ping_PID} ->
            +            io:format("Pong received ping~n", []),
                         Ping_PID ! pong,
            -            pong()
            +            pong()
                 after 5000 ->
            -            io:format("Pong timed out~n", [])
            +            io:format("Pong timed out~n", [])
                 end.
             
            -start_pong() ->
            -    register(pong, spawn(tut19, pong, [])).
            +start_pong() ->
            +    register(pong, spawn(tut19, pong, [])).
             
            -start_ping(Pong_Node) ->
            -    spawn(tut19, ping, [3, Pong_Node]).

            After this is compiled and the file tut19.beam is copied to the necessary +start_ping(Pong_Node) -> + spawn(tut19, ping, [3, Pong_Node]).

            After this is compiled and the file tut19.beam is copied to the necessary directories, the following is seen on (pong@kosken):

            (pong@kosken)1> tut19:start_pong().
             true
             Pong received ping
            @@ -77,20 +77,20 @@
             Ping received pong
             Ping received pong
             Ping received pong
            -ping finished

            The time-out is set in:

            pong() ->
            +ping finished

            The time-out is set in:

            pong() ->
                 receive
            -        {ping, Ping_PID} ->
            -            io:format("Pong received ping~n", []),
            +        {ping, Ping_PID} ->
            +            io:format("Pong received ping~n", []),
                         Ping_PID ! pong,
            -            pong()
            +            pong()
                 after 5000 ->
            -            io:format("Pong timed out~n", [])
            +            io:format("Pong timed out~n", [])
                 end.

            The time-out (after 5000) is started when receive is entered. The time-out is canceled if {ping,Ping_PID} is received. If {ping,Ping_PID} is not received, the actions following the time-out are done after 5000 milliseconds. after must be last in the receive, that is, preceded by all other message reception specifications in the receive. It is also possible to call a -function that returned an integer for the time-out:

            after pong_timeout() ->

            In general, there are better ways than using time-outs to supervise parts of a +function that returned an integer for the time-out:

            after pong_timeout() ->

            In general, there are better ways than using time-outs to supervise parts of a distributed Erlang system. Time-outs are usually appropriate to supervise external events, for example, if you have expected a message from some external system within a specified time. For example, a time-out can be used to log a @@ -118,36 +118,36 @@ If one of the processes exits abnormally, all the processes in the transaction are killed. As it is often wanted to create a process and link to it at the same time, there is a special BIF, spawn_link that does the -same as spawn, but also creates a link to the spawned process.

            Now an example of the ping pong example using links to terminate "pong":

            -module(tut20).
            +same as spawn, but also creates a link to the spawned process.

            Now an example of the ping pong example using links to terminate "pong":

            -module(tut20).
             
            --export([start/1,  ping/2, pong/0]).
            +-export([start/1,  ping/2, pong/0]).
             
            -ping(N, Pong_Pid) ->
            -    link(Pong_Pid),
            -    ping1(N, Pong_Pid).
            +ping(N, Pong_Pid) ->
            +    link(Pong_Pid),
            +    ping1(N, Pong_Pid).
             
            -ping1(0, _) ->
            -    exit(ping);
            +ping1(0, _) ->
            +    exit(ping);
             
            -ping1(N, Pong_Pid) ->
            -    Pong_Pid ! {ping, self()},
            +ping1(N, Pong_Pid) ->
            +    Pong_Pid ! {ping, self()},
                 receive
                     pong ->
            -            io:format("Ping received pong~n", [])
            +            io:format("Ping received pong~n", [])
                 end,
            -    ping1(N - 1, Pong_Pid).
            +    ping1(N - 1, Pong_Pid).
             
            -pong() ->
            +pong() ->
                 receive
            -        {ping, Ping_PID} ->
            -            io:format("Pong received ping~n", []),
            +        {ping, Ping_PID} ->
            +            io:format("Pong received ping~n", []),
                         Ping_PID ! pong,
            -            pong()
            +            pong()
                 end.
             
            -start(Ping_Node) ->
            -    PongPID = spawn(tut20, pong, []),
            -    spawn(Ping_Node, tut20, ping, [3, PongPID]).
            (s1@bill)3> tut20:start(s2@kosken).
            +start(Ping_Node) ->
            +    PongPID = spawn(tut20, pong, []),
            +    spawn(Ping_Node, tut20, ping, [3, PongPID]).
            (s1@bill)3> tut20:start(s2@kosken).
             Pong received ping
             <3820.41.0>
             Ping received pong
            @@ -161,45 +161,45 @@
             sent to "pong", which also terminates.

            It is possible to modify the default behaviour of a process so that it does not get killed when it receives abnormal exit signals. Instead, all signals are turned into normal messages on the format {'EXIT',FromPID,Reason} and added to -the end of the receiving process' message queue. This behaviour is set by:

            process_flag(trap_exit, true)

            There are several other process flags, see erlang(3). +the end of the receiving process' message queue. This behaviour is set by:

            process_flag(trap_exit, true)

            There are several other process flags, see erlang(3). Changing the default behaviour of a process in this way is usually not done in standard user programs, but is left to the supervisory programs in OTP. However, -the ping pong program is modified to illustrate exit trapping.

            -module(tut21).
            +the ping pong program is modified to illustrate exit trapping.

            -module(tut21).
             
            --export([start/1,  ping/2, pong/0]).
            +-export([start/1,  ping/2, pong/0]).
             
            -ping(N, Pong_Pid) ->
            -    link(Pong_Pid),
            -    ping1(N, Pong_Pid).
            +ping(N, Pong_Pid) ->
            +    link(Pong_Pid),
            +    ping1(N, Pong_Pid).
             
            -ping1(0, _) ->
            -    exit(ping);
            +ping1(0, _) ->
            +    exit(ping);
             
            -ping1(N, Pong_Pid) ->
            -    Pong_Pid ! {ping, self()},
            +ping1(N, Pong_Pid) ->
            +    Pong_Pid ! {ping, self()},
                 receive
                     pong ->
            -            io:format("Ping received pong~n", [])
            +            io:format("Ping received pong~n", [])
                 end,
            -    ping1(N - 1, Pong_Pid).
            +    ping1(N - 1, Pong_Pid).
             
            -pong() ->
            -    process_flag(trap_exit, true),
            -    pong1().
            +pong() ->
            +    process_flag(trap_exit, true),
            +    pong1().
             
            -pong1() ->
            +pong1() ->
                 receive
            -        {ping, Ping_PID} ->
            -            io:format("Pong received ping~n", []),
            +        {ping, Ping_PID} ->
            +            io:format("Pong received ping~n", []),
                         Ping_PID ! pong,
            -            pong1();
            -        {'EXIT', From, Reason} ->
            -            io:format("pong exiting, got ~p~n", [{'EXIT', From, Reason}])
            +            pong1();
            +        {'EXIT', From, Reason} ->
            +            io:format("pong exiting, got ~p~n", [{'EXIT', From, Reason}])
                 end.
             
            -start(Ping_Node) ->
            /usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/seq_prog.xhtml differs (HTML document, ASCII text, with very long lines)
            --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/seq_prog.xhtml"	2025-05-10 20:18:56.917079925 +0000
            +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/seq_prog.xhtml"	2025-05-10 20:18:56.933080070 +0000
            @@ -45,13 +45,13 @@
             more editing commands in the shell (see
             tty - A command line interface in ERTS User's Guide).

            (Notice that many line numbers given by the shell in the following examples are out of sequence. This is because this tutorial was written and code-tested in -separate sessions).

            Here is a bit more complex calculation:

            2> (42 + 77) * 66 / 3.
            +separate sessions).

            Here is a bit more complex calculation:

            2> (42 + 77) * 66 / 3.
             2618.0

            Notice the use of brackets, the multiplication operator *, and the division operator /, as in normal arithmetic (see Expressions).

            Press Control-C to shut down the Erlang system and the Erlang shell.

            The following output is shown:

            BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
                    (v)ersion (k)ill (D)b-tables (d)istribution
             a
            -$

            Type a to leave the Erlang system.

            Another way to shut down the Erlang system is by entering halt/0:

            3> halt().
            +$

            Type a to leave the Erlang system.

            Another way to shut down the Erlang system is by entering halt/0:

            3> halt().
             $

            @@ -65,55 +65,55 @@ editor has an Erlang mode that makes it easier for you to enter and format your code nicely (see The Erlang mode for Emacs in Tools User's Guide), but you can manage perfectly well without. Here is the -code to enter:

            -module(tut).
            --export([double/1]).
            +code to enter:

            -module(tut).
            +-export([double/1]).
             
            -double(X) ->
            +double(X) ->
                 2 * X.

            It is not hard to guess that this program doubles the value of numbers. The first two lines of the code are described later. Let us compile the program. -This can be done in an Erlang shell as follows, where c means compile:

            3> c(tut).
            -{ok,tut}

            The {ok,tut} means that the compilation is OK. If it says error it means +This can be done in an Erlang shell as follows, where c means compile:

            3> c(tut).
            +{ok,tut}

            The {ok,tut} means that the compilation is OK. If it says error it means that there is some mistake in the text that you entered. Additional error messages gives an idea to what is wrong so you can modify the text and then try -to compile the program again.

            Now run the program:

            4> tut:double(10).
            +to compile the program again.

            Now run the program:

            4> tut:double(10).
             20

            As expected, double of 10 is 20.

            Now let us get back to the first two lines of the code. Erlang programs are written in files. Each file contains an Erlang module. The first line of code -in the module is the module name (see Modules):

            -module(tut).

            Thus, the module is called tut. Notice the full stop . at the end of the +in the module is the module name (see Modules):

            -module(tut).

            Thus, the module is called tut. Notice the full stop . at the end of the line. The files which are used to store the module must have the same name as the module but with the extension .erl. In this case the file name is tut.erl. When using a function in another module, the syntax module_name:function_name(arguments) is used. So the following means call -function double in module tut with argument 10.

            4> tut:double(10).

            The second line says that the module tut contains a function called double, -which takes one argument (X in our example):

            -export([double/1]).

            The second line also says that this function can be called from outside the +function double in module tut with argument 10.

            4> tut:double(10).

            The second line says that the module tut contains a function called double, +which takes one argument (X in our example):

            -export([double/1]).

            The second line also says that this function can be called from outside the module tut. More about this later. Again, notice the . at the end of the line.

            Now for a more complicated example, the factorial of a number. For example, the -factorial of 4 is 4 3 2 * 1, which equals 24.

            Enter the following code in a file named tut1.erl:

            -module(tut1).
            --export([fac/1]).
            +factorial of 4 is 4  3  2 * 1, which equals 24.

            Enter the following code in a file named tut1.erl:

            -module(tut1).
            +-export([fac/1]).
             
            -fac(1) ->
            +fac(1) ->
                 1;
            -fac(N) ->
            -    N * fac(N - 1).

            So this is a module, called tut1 that contains a function called fac>, which -takes one argument, N.

            The first part says that the factorial of 1 is 1.:

            fac(1) ->
            +fac(N) ->
            +    N * fac(N - 1).

            So this is a module, called tut1 that contains a function called fac>, which +takes one argument, N.

            The first part says that the factorial of 1 is 1.:

            fac(1) ->
                 1;

            Notice that this part ends with a semicolon ; that indicates that there is more of the function fac> to come.

            The second part says that the factorial of N is N multiplied by the factorial of -N - 1:

            fac(N) ->
            -    N * fac(N - 1).

            Notice that this part ends with a . saying that there are no more parts of -this function.

            Compile the file:

            5> c(tut1).
            -{ok,tut1}

            And now calculate the factorial of 4.

            6> tut1:fac(4).
            +N - 1:

            fac(N) ->
            +    N * fac(N - 1).

            Notice that this part ends with a . saying that there are no more parts of +this function.

            Compile the file:

            5> c(tut1).
            +{ok,tut1}

            And now calculate the factorial of 4.

            6> tut1:fac(4).
             24

            Here the function fac> in module tut1 is called with argument 4.

            A function can have many arguments. Let us expand the module tut1 with the -function to multiply two numbers:

            -module(tut1).
            --export([fac/1, mult/2]).
            +function to multiply two numbers:

            -module(tut1).
            +-export([fac/1, mult/2]).
             
            -fac(1) ->
            +fac(1) ->
                 1;
            -fac(N) ->
            -    N * fac(N - 1).
            +fac(N) ->
            +    N * fac(N - 1).
             
            -mult(X, Y) ->
            +mult(X, Y) ->
                 X * Y.

            Notice that it is also required to expand the -export line with the -information that there is another function mult with two arguments.

            Compile:

            7> c(tut1).
            -{ok,tut1}

            Try out the new function mult:

            8> tut1:mult(3,4).
            +information that there is another function mult with two arguments.

            Compile:

            7> c(tut1).
            +{ok,tut1}

            Try out the new function mult:

            8> tut1:mult(3,4).
             12

            In this example the numbers are integers and the arguments in the functions in the code N, X, and Y are called variables. Variables must start with a capital letter (see Variables). Examples of @@ -127,56 +127,56 @@ Atom), for example, charles, centimeter, and inch. Atoms are simply names, nothing else. They are not like variables, which can have a value.

            Enter the next program in a file named tut2.erl). It can be useful for -converting from inches to centimeters and conversely:

            -module(tut2).
            --export([convert/2]).
            +converting from inches to centimeters and conversely:

            -module(tut2).
            +-export([convert/2]).
             
            -convert(M, inch) ->
            +convert(M, inch) ->
                 M / 2.54;
             
            -convert(N, centimeter) ->
            -    N * 2.54.

            Compile:

            9> c(tut2).
            -{ok,tut2}

            Test:

            10> tut2:convert(3, inch).
            +convert(N, centimeter) ->
            +    N * 2.54.

            Compile:

            9> c(tut2).
            +{ok,tut2}

            Test:

            10> tut2:convert(3, inch).
             1.1811023622047243
            -11> tut2:convert(7, centimeter).
            +11> tut2:convert(7, centimeter).
             17.78

            Notice the introduction of decimals (floating point numbers) without any explanation. Hopefully you can cope with that.

            Let us see what happens if something other than centimeter or inch is -entered in the convert function:

            12> tut2:convert(3, miles).
            +entered in the convert function:

            12> tut2:convert(3, miles).
             ** exception error: no function clause matching tut2:convert(3,miles) (tut2.erl, line 4)

            The two parts of the convert function are called its clauses. As shown, miles is not part of either of the clauses. The Erlang system cannot match either of the clauses so an error message function_clause is returned. The shell formats the error message nicely, but the error tuple is saved in the -shell's history list and can be output by the shell command v/1:

            13> v(12).
            -{'EXIT',{function_clause,[{tut2,convert,
            -                                [3,miles],
            -                                [{file,"tut2.erl"},{line,4}]},
            -                          {erl_eval,do_apply,6,
            -                                    [{file,"erl_eval.erl"},{line,677}]},
            -                          {shell,exprs,7,[{file,"shell.erl"},{line,687}]},
            -                          {shell,eval_exprs,7,[{file,"shell.erl"},{line,642}]},
            -                          {shell,eval_loop,3,
            -                                 [{file,"shell.erl"},{line,627}]}]}}

            +shell's history list and can be output by the shell command v/1:

            13> v(12).
            +{'EXIT',{function_clause,[{tut2,convert,
            +                                [3,miles],
            +                                [{file,"tut2.erl"},{line,4}]},
            +                          {erl_eval,do_apply,6,
            +                                    [{file,"erl_eval.erl"},{line,677}]},
            +                          {shell,exprs,7,[{file,"shell.erl"},{line,687}]},
            +                          {shell,eval_exprs,7,[{file,"shell.erl"},{line,642}]},
            +                          {shell,eval_loop,3,
            +                                 [{file,"shell.erl"},{line,627}]}]}}

            Tuples

            -

            Now the tut2 program is hardly good programming style. Consider:

            tut2:convert(3, inch).

            Does this mean that 3 is in inches? Or does it mean that 3 is in centimeters and +

            Now the tut2 program is hardly good programming style. Consider:

            tut2:convert(3, inch).

            Does this mean that 3 is in inches? Or does it mean that 3 is in centimeters and is to be converted to inches? Erlang has a way to group things together to make things more understandable. These are called tuples and are surrounded by curly brackets, { and }.

            So, {inch,3} denotes 3 inches and {centimeter,5} denotes 5 centimeters. Now let us write a new program that converts centimeters to inches and conversely. -Enter the following code in a file called tut3.erl):

            -module(tut3).
            --export([convert_length/1]).
            +Enter the following code in a file called tut3.erl):

            -module(tut3).
            +-export([convert_length/1]).
             
            -convert_length({centimeter, X}) ->
            -    {inch, X / 2.54};
            -convert_length({inch, Y}) ->
            -    {centimeter, Y * 2.54}.

            Compile and test:

            14> c(tut3).
            -{ok,tut3}
            -15> tut3:convert_length({inch, 5}).
            -{centimeter,12.7}
            -16> tut3:convert_length(tut3:convert_length({inch, 5})).
            -{inch,5.0}

            Notice on line 16 that 5 inches is converted to centimeters and back again and +convert_length({centimeter, X}) -> + {inch, X / 2.54}; +convert_length({inch, Y}) -> + {centimeter, Y * 2.54}.

            Compile and test:

            14> c(tut3).
            +{ok,tut3}
            +15> tut3:convert_length({inch, 5}).
            +{centimeter,12.7}
            +16> tut3:convert_length(tut3:convert_length({inch, 5})).
            +{inch,5.0}

            Notice on line 16 that 5 inches is converted to centimeters and back again and reassuringly get back to the original value. That is, the argument to a function can be the result of another function. Consider how line 16 (above) works. The argument given to the function {inch,5} is first matched against the first @@ -185,9 +185,9 @@ before the ->). This having failed, let us try the head of the next clause that is, convert_length({inch,Y}). This matches, and Y gets the value 5.

            Tuples can have more than two parts, in fact as many parts as you want, and contain any valid Erlang term. For example, to represent the temperature of -various cities of the world:

            {moscow, {c, -10}}
            -{cape_town, {f, 70}}
            -{paris, {f, 28}}

            Tuples have a fixed number of items in them. Each item in a tuple is called an +various cities of the world:

            {moscow, {c, -10}}
            +{cape_town, {f, 70}}
            +{paris, {f, 28}}

            Tuples have a fixed number of items in them. Each item in a tuple is called an element. In the tuple {moscow,{c,-10}}, element 1 is moscow and element 2 is {c,-10}. Here c represents Celsius and f Fahrenheit.

            /usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/spec_proc.xhtml differs (HTML document, ASCII text, with very long lines) --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/spec_proc.xhtml" 2025-05-10 20:18:56.913079888 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/spec_proc.xhtml" 2025-05-10 20:18:56.933080070 +0000 @@ -32,64 +32,64 @@

            The sys module has functions for simple debugging of processes implemented using behaviours. The code_lock example from -gen_statem Behaviour is used to illustrate this:

            Erlang/OTP 27 [erts-15.0] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit]
            +gen_statem Behaviour is used to illustrate this:

            Erlang/OTP 27 [erts-15.0] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit]
             
            -Eshell V15.0 (press Ctrl+G to abort, type help(). for help)
            -1> code_lock:start_link([1,2,3,4]).
            +Eshell V15.0 (press Ctrl+G to abort, type help(). for help)
            +1> code_lock:start_link([1,2,3,4]).
             Lock
            -{ok,<0.90.0>}
            -2> sys:statistics(code_lock, true).
            +{ok,<0.90.0>}
            +2> sys:statistics(code_lock, true).
             ok
            -3> sys:trace(code_lock, true).
            +3> sys:trace(code_lock, true).
             ok
            -4> code_lock:button(1).
            -*DBG* code_lock receive cast {button,1} in state locked
            +4> code_lock:button(1).
            +*DBG* code_lock receive cast {button,1} in state locked
             ok
            -*DBG* code_lock consume cast {button,1} in state locked
            -5> code_lock:button(2).
            -*DBG* code_lock receive cast {button,2} in state locked
            +*DBG* code_lock consume cast {button,1} in state locked
            +5> code_lock:button(2).
            +*DBG* code_lock receive cast {button,2} in state locked
             ok
            -*DBG* code_lock consume cast {button,2} in state locked
            -6> code_lock:button(3).
            -*DBG* code_lock receive cast {button,3} in state locked
            +*DBG* code_lock consume cast {button,2} in state locked
            +6> code_lock:button(3).
            +*DBG* code_lock receive cast {button,3} in state locked
             ok
            -*DBG* code_lock consume cast {button,3} in state locked
            -7> code_lock:button(4).
            -*DBG* code_lock receive cast {button,4} in state locked
            +*DBG* code_lock consume cast {button,3} in state locked
            +7> code_lock:button(4).
            +*DBG* code_lock receive cast {button,4} in state locked
             ok
             Unlock
            -*DBG* code_lock consume cast {button,4} in state locked => open
            -*DBG* code_lock start_timer {state_timeout,10000,lock,[]} in state open
            +*DBG* code_lock consume cast {button,4} in state locked => open
            +*DBG* code_lock start_timer {state_timeout,10000,lock,[]} in state open
             *DBG* code_lock receive state_timeout lock in state open
             Lock
             *DBG* code_lock consume state_timeout lock in state open => locked
            -8> sys:statistics(code_lock, get).
            -{ok,[{start_time,{{2024,5,3},{8,11,1}}},
            -     {current_time,{{2024,5,3},{8,11,48}}},
            -     {reductions,4098},
            -     {messages_in,5},
            -     {messages_out,0}]}
            -9> sys:statistics(code_lock, false).
            +8> sys:statistics(code_lock, get).
            +{ok,[{start_time,{{2024,5,3},{8,11,1}}},
            +     {current_time,{{2024,5,3},{8,11,48}}},
            +     {reductions,4098},
            +     {messages_in,5},
            +     {messages_out,0}]}
            +9> sys:statistics(code_lock, false).
             ok
            -10> sys:trace(code_lock, false).
            +10> sys:trace(code_lock, false).
             ok
            -11> sys:get_status(code_lock).
            -{status,<0.90.0>,
            -        {module,gen_statem},
            -        [[{'$initial_call',{code_lock,init,1}},
            -          {'$ancestors',[<0.88.0>,<0.87.0>,<0.70.0>,<0.65.0>,<0.69.0>,
            -                         <0.64.0>,kernel_sup,<0.47.0>]}],
            -         running,<0.88.0>,[],
            -         [{header,"Status for state machine code_lock"},
            -          {data,[{"Status",running},
            -                 {"Parent",<0.88.0>},
            -                 {"Modules",[code_lock]},
            -                 {"Time-outs",{0,[]}},
            -                 {"Logged Events",[]},
            -                 {"Postponed",[]}]},
            -          {data,[{"State",
            -                  {locked,#{code => [1,2,3,4],
            -                            length => 4,buttons => []}}}]}]]}

            +11> sys:get_status(code_lock). +{status,<0.90.0>, + {module,gen_statem}, + [[{'$initial_call',{code_lock,init,1}}, + {'$ancestors',[<0.88.0>,<0.87.0>,<0.70.0>,<0.65.0>,<0.69.0>, + <0.64.0>,kernel_sup,<0.47.0>]}], + running,<0.88.0>,[], + [{header,"Status for state machine code_lock"}, + {data,[{"Status",running}, + {"Parent",<0.88.0>}, + {"Modules",[code_lock]}, + {"Time-outs",{0,[]}}, + {"Logged Events",[]}, + {"Postponed",[]}]}, + {data,[{"State", + {locked,#{code => [1,2,3,4], + length => 4,buttons => []}}}]}]]}

            @@ -107,109 +107,109 @@

            Here follows the simple server from Overview, -implemented using sys and proc_lib to fit into a supervision tree:

            -module(ch4).
            --export([start_link/0]).
            --export([alloc/0, free/1]).
            --export([init/1]).
            --export([system_continue/3, system_terminate/4,
            +implemented using sys and proc_lib to fit into a supervision tree:

            -module(ch4).
            +-export([start_link/0]).
            +-export([alloc/0, free/1]).
            +-export([init/1]).
            +-export([system_continue/3, system_terminate/4,
                      write_debug/3,
            -         system_get_state/1, system_replace_state/2]).
            +         system_get_state/1, system_replace_state/2]).
             
            -start_link() ->
            -    proc_lib:start_link(ch4, init, [self()]).
            +start_link() ->
            +    proc_lib:start_link(ch4, init, [self()]).
             
            -alloc() ->
            -    ch4 ! {self(), alloc},
            +alloc() ->
            +    ch4 ! {self(), alloc},
                 receive
            -        {ch4, Res} ->
            +        {ch4, Res} ->
                         Res
                 end.
             
            -free(Ch) ->
            -    ch4 ! {free, Ch},
            +free(Ch) ->
            +    ch4 ! {free, Ch},
                 ok.
             
            -init(Parent) ->
            -    register(ch4, self()),
            -    Chs = channels(),
            -    Deb = sys:debug_options([]),
            -    proc_lib:init_ack(Parent, {ok, self()}),
            -    loop(Chs, Parent, Deb).
            +init(Parent) ->
            +    register(ch4, self()),
            +    Chs = channels(),
            +    Deb = sys:debug_options([]),
            +    proc_lib:init_ack(Parent, {ok, self()}),
            +    loop(Chs, Parent, Deb).
             
            -loop(Chs, Parent, Deb) ->
            +loop(Chs, Parent, Deb) ->
                 receive
            -        {From, alloc} ->
            -            Deb2 = sys:handle_debug(Deb, fun ch4:write_debug/3,
            -                                    ch4, {in, alloc, From}),
            -            {Ch, Chs2} = alloc(Chs),
            -            From ! {ch4, Ch},
            -            Deb3 = sys:handle_debug(Deb2, fun ch4:write_debug/3,
            -                                    ch4, {out, {ch4, Ch}, From}),
            -            loop(Chs2, Parent, Deb3);
            -        {free, Ch} ->
            -            Deb2 = sys:handle_debug(Deb, fun ch4:write_debug/3,
            -                                    ch4, {in, {free, Ch}}),
            -            Chs2 = free(Ch, Chs),
            -            loop(Chs2, Parent, Deb2);
            -
            -        {system, From, Request} ->
            -            sys:handle_system_msg(Request, From, Parent,
            -                                  ch4, Deb, Chs)
            +        {From, alloc} ->
            +            Deb2 = sys:handle_debug(Deb, fun ch4:write_debug/3,
            +                                    ch4, {in, alloc, From}),
            +            {Ch, Chs2} = alloc(Chs),
            +            From ! {ch4, Ch},
            +            Deb3 = sys:handle_debug(Deb2, fun ch4:write_debug/3,
            +                                    ch4, {out, {ch4, Ch}, From}),
            +            loop(Chs2, Parent, Deb3);
            +        {free, Ch} ->
            +            Deb2 = sys:handle_debug(Deb, fun ch4:write_debug/3,
            +                                    ch4, {in, {free, Ch}}),
            +            Chs2 = free(Ch, Chs),
            +            loop(Chs2, Parent, Deb2);
            +
            +        {system, From, Request} ->
            +            sys:handle_system_msg(Request, From, Parent,
            +                                  ch4, Deb, Chs)
            /usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/statem.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines)
            --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/statem.xhtml"	2025-05-10 20:18:56.913079888 +0000
            +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/statem.xhtml"	2025-05-10 20:18:56.933080070 +0000
            @@ -33,7 +33,7 @@
             a state transition and the output is actions executed during
             the state transition.  Analogously to the mathematical model
             of a Finite State Machine, it can be described as a set of relations
            -of the following form:

            State(S) x Event(E) -> Actions(A), State(S')

            These relations are interpreted as follows: if we are in state S, +of the following form:

            State(S) x Event(E) -> Actions(A), State(S')

            These relations are interpreted as follows: if we are in state S, and event E occurs, we are to perform actions A, and make a transition to state S'. Notice that S' can be equal to S, and that A can be empty.

            In gen_statem we define a state change as a state transition in which the @@ -314,12 +314,12 @@ mode, automatically call the state callback with special arguments whenever the state changes, so you can write state enter actions near the rest of the state transition rules. -It typically looks like this:

            StateName(enter, OldState, Data) ->
            +It typically looks like this:

            StateName(enter, OldState, Data) ->
                 ... code for state enter actions here ...
            -    {keep_state, NewData};
            -StateName(EventType, EventContent, Data) ->
            +    {keep_state, NewData};
            +StateName(EventType, EventContent, Data) ->
                 ... code for actions here ...
            -    {next_state, NewStateName, NewData}.

            Since the state enter call is not an event there are restrictions on the + {next_state, NewStateName, NewData}.

            Since the state enter call is not an event there are restrictions on the allowed return value and state transition actions. You must not change the state, postpone this non-event, insert any events, or change the @@ -408,55 +408,55 @@ open --> open : {button, Digit} open --> locked : state_timeout\n* do_lock()

            This code lock state machine can be implemented using gen_statem with -the following callback module:

            -module(code_lock).
            --behaviour(gen_statem).
            --define(NAME, code_lock).
            +the following callback module:

            -module(code_lock).
            +-behaviour(gen_statem).
            +-define(NAME, code_lock).
             
            --export([start_link/1]).
            --export([button/1]).
            --export([init/1,callback_mode/0,terminate/3]).
            --export([locked/3,open/3]).
            -
            -start_link(Code) ->
            -    gen_statem:start_link({local,?NAME}, ?MODULE, Code, []).
            -
            -button(Button) ->
            -    gen_statem:cast(?NAME, {button,Button}).
            -
            -init(Code) ->
            -    do_lock(),
            -    Data = #{code => Code, length => length(Code), buttons => []},
            -    {ok, locked, Data}.
            -
            -callback_mode() ->
            -    state_functions.
            locked(
            -  cast, {button,Button},
            -  #{code := Code, length := Length, buttons := Buttons} = Data) ->
            +-export([start_link/1]).
            +-export([button/1]).
            +-export([init/1,callback_mode/0,terminate/3]).
            +-export([locked/3,open/3]).
            +
            +start_link(Code) ->
            +    gen_statem:start_link({local,?NAME}, ?MODULE, Code, []).
            +
            +button(Button) ->
            +    gen_statem:cast(?NAME, {button,Button}).
            +
            +init(Code) ->
            +    do_lock(),
            +    Data = #{code => Code, length => length(Code), buttons => []},
            +    {ok, locked, Data}.
            +
            +callback_mode() ->
            +    state_functions.
            locked(
            +  cast, {button,Button},
            +  #{code := Code, length := Length, buttons := Buttons} = Data) ->
                 NewButtons =
                     if
            -            length(Buttons) < Length ->
            +            length(Buttons) < Length ->
                             Buttons;
                         true ->
            -                tl(Buttons)
            -        end ++ [Button],
            +                tl(Buttons)
            +        end ++ [Button],
                 if
                     NewButtons =:= Code -> % Correct
            -	    do_unlock(),
            -            {next_state, open, Data#{buttons := []},
            -             [{state_timeout,10_000,lock}]}; % Time in milliseconds
            +	    do_unlock(),
            +            {next_state, open, Data#{buttons := []},
            +             [{state_timeout,10_000,lock}]}; % Time in milliseconds
             	true -> % Incomplete | Incorrect
            -            {next_state, locked, Data#{buttons := NewButtons}}
            -    end.
            open(state_timeout, lock,  Data) ->
            -    do_lock(),
            -    {next_state, locked, Data};
            -open(cast, {button,_}, Data) ->
            -    {next_state, open, Data}.
            do_lock() ->
            -    io:format("Lock~n", []).
            -do_unlock() ->
            -    io:format("Unlock~n", []).
            +            {next_state, locked, Data#{buttons := NewButtons}}
            +    end.
            open(state_timeout, lock,  Data) ->
            +    do_lock(),
            +    {next_state, locked, Data};
            +open(cast, {button,_}, Data) ->
            +    {next_state, open, Data}.
            do_lock() ->
            +    io:format("Lock~n", []).
            +do_unlock() ->
            +    io:format("Unlock~n", []).
             
            -terminate(_Reason, State, _Data) ->
            -    State =/= locked andalso do_lock(),
            +terminate(_Reason, State, _Data) ->
            +    State =/= locked andalso do_lock(),
                 ok.

            The code is explained in the next sections.

            @@ -464,8 +464,8 @@ Starting gen_statem

            In the example in the previous section, gen_statem is started by calling -code_lock:start_link(Code):

            start_link(Code) ->
            -    gen_statem:start_link({local,?NAME}, ?MODULE, Code, []).

            start_link/1 calls function gen_statem:start_link/4, +code_lock:start_link(Code):

            start_link(Code) ->
            +    gen_statem:start_link({local,?NAME}, ?MODULE, Code, []).

            start_link/1 calls function gen_statem:start_link/4, which spawns and links to a new process, a gen_statem.

            • The first argument, {local,?NAME}, specifies the name. In this case, the gen_statem is locally registered as code_lock through the macro ?NAME.

              If the name is omitted, the gen_statem is not registered. Instead its pid must be used. The name can also be specified as {global, Name}, then the @@ -483,10 +483,10 @@ Data is the internal server data of the gen_statem. Here the server data is a map() with key code that stores the correct button sequence, key length store its length, and key buttons -that stores the collected buttons up to the same length.

              init(Code) ->
              -    do_lock(),
              -    Data = #{code => Code, length => length(Code), buttons => []},
              -    {ok, locked, Data}.

              Function gen_statem:start_link/3,4 +that stores the collected buttons up to the same length.

              init(Code) ->
              +    do_lock(),
              +    Data = #{code => Code, length => length(Code), buttons => []},
              +    {ok, locked, Data}.

              Function gen_statem:start_link/3,4 is synchronous. It does not return until the gen_statem is initialized and is ready to receive events.

              Function gen_statem:start_link/3,4 must be used if the gen_statem is part of a supervision tree, that is, @@ -495,7 +495,7 @@ a standalone gen_statem, meaning it is not part of a supervision tree.

              Function Module:callback_mode/0 selects the CallbackMode for the callback module, in this case state_functions. -That is, each state has its own handler function:

              callback_mode() ->
              +That is, each state has its own handler function:

              callback_mode() ->
                   state_functions.

              @@ -503,8 +503,8 @@ Handling Events

              The function notifying the code lock about a button event is implemented using -gen_statem:cast/2:

              button(Button) ->
              -    gen_statem:cast(?NAME, {button,Button}).

              The first argument is the name of the gen_statem and must agree with +gen_statem:cast/2:

              button(Button) ->
              +    gen_statem:cast(?NAME, {button,Button}).

              The first argument is the name of the gen_statem and must agree with the name used to start it. So, we use the same macro ?NAME as when starting. {button, Button} is the event content.

              The event is sent to the gen_statem. When the event is received, the gen_statem calls StateName(cast, Event, Data), which is expected @@ -512,30 +512,30 @@ {next_state, NewStateName, NewData, Actions}. StateName is the name of the current state and NewStateName is the name of the next state. NewData is a new value for the server data of the gen_statem, -and Actions is a list of actions to be performed by the gen_statem engine.

              locked(
              -  cast, {button,Button},
              -  #{code := Code, length := Length, buttons := Buttons} = Data) ->
              +and Actions is a list of actions to be performed by the gen_statem engine.

              locked(
              +  cast, {button,Button},
              +  #{code := Code, length := Length, buttons := Buttons} = Data) ->
                   NewButtons =
                       if
              -            length(Buttons) < Length ->
              +            length(Buttons) < Length ->
                               Buttons;
                           true ->
              -                tl(Buttons)
              -        end ++ [Button],
              +                tl(Buttons)
              +        end ++ [Button],
                   if
                       NewButtons =:= Code -> % Correct
              -	    do_unlock(),
              -            {next_state, open, Data#{buttons := []},
              -             [{state_timeout,10_000,lock}]}; % Time in milliseconds
              +	    do_unlock(),
              +            {next_state, open, Data#{buttons := []},
              +             [{state_timeout,10_000,lock}]}; % Time in milliseconds
               	true -> % Incomplete | Incorrect
              -            {next_state, locked, Data#{buttons := NewButtons}}
              /usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/sup_princ.xhtml differs (HTML document, ASCII text, with very long lines)
              --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/sup_princ.xhtml"	2025-05-10 20:18:56.913079888 +0000
              +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/sup_princ.xhtml"	2025-05-10 20:18:56.933080070 +0000
              @@ -37,24 +37,24 @@
                 Example
               

            The callback module for a supervisor starting the server from -gen_server Behaviour can look as follows:

            -module(ch_sup).
            --behaviour(supervisor).
            +gen_server Behaviour can look as follows:

            -module(ch_sup).
            +-behaviour(supervisor).
             
            --export([start_link/0]).
            --export([init/1]).
            +-export([start_link/0]).
            +-export([init/1]).
             
            -start_link() ->
            -    supervisor:start_link(ch_sup, []).
            +start_link() ->
            +    supervisor:start_link(ch_sup, []).
             
            -init(_Args) ->
            -    SupFlags = #{strategy => one_for_one, intensity => 1, period => 5},
            -    ChildSpecs = [#{id => ch3,
            -                    start => {ch3, start_link, []},
            +init(_Args) ->
            +    SupFlags = #{strategy => one_for_one, intensity => 1, period => 5},
            +    ChildSpecs = [#{id => ch3,
            +                    start => {ch3, start_link, []},
                                 restart => permanent,
                                 shutdown => brutal_kill,
                                 type => worker,
            -                    modules => [ch3]}],
            -    {ok, {SupFlags, ChildSpecs}}.

            The SupFlags variable in the return value from init/1 represents the + modules => [ch3]}], + {ok, {SupFlags, ChildSpecs}}.

            The SupFlags variable in the return value from init/1 represents the supervisor flags.

            The ChildSpecs variable in the return value from init/1 is a list of child specifications.

            @@ -62,15 +62,15 @@ Supervisor Flags

            -

            This is the type definition for the supervisor flags:

            sup_flags() = #{strategy => strategy(),           % optional
            -                intensity => non_neg_integer(),   % optional
            -                period => pos_integer(),          % optional
            -                auto_shutdown => auto_shutdown()} % optional
            -    strategy() = one_for_all
            +

            This is the type definition for the supervisor flags:

            sup_flags() = #{strategy => strategy(),           % optional
            +                intensity => non_neg_integer(),   % optional
            +                period => pos_integer(),          % optional
            +                auto_shutdown => auto_shutdown()} % optional
            +    strategy() = one_for_all
                            | one_for_one
                            | rest_for_one
                            | simple_one_for_one
            -    auto_shutdown() = never
            +    auto_shutdown() = never
                                 | any_significant
                                 | all_significant

            -

            The type definition for a child specification is as follows:

            child_spec() = #{id => child_id(),             % mandatory
            -                 start => mfargs(),            % mandatory
            -                 restart => restart(),         % optional
            -                 significant => significant(), % optional
            -                 shutdown => shutdown(),       % optional
            -                 type => worker(),             % optional
            -                 modules => modules()}         % optional
            -    child_id() = term()
            -    mfargs() = {M :: module(), F :: atom(), A :: [term()]}
            -    modules() = [module()] | dynamic
            -    restart() = permanent | transient | temporary
            -    significant() = boolean()
            -    shutdown() = brutal_kill | timeout()
            -    worker() = worker | supervisor
            • id is used to identify the child specification internally by the supervisor.

              The id key is mandatory.

              Note that this identifier occasionally has been called "name". As far as +

              The type definition for a child specification is as follows:

              child_spec() = #{id => child_id(),             % mandatory
              +                 start => mfargs(),            % mandatory
              +                 restart => restart(),         % optional
              +                 significant => significant(), % optional
              +                 shutdown => shutdown(),       % optional
              +                 type => worker(),             % optional
              +                 modules => modules()}         % optional
              +    child_id() = term()
              +    mfargs() = {M :: module(), F :: atom(), A :: [term()]}
              +    modules() = [module()] | dynamic
              +    restart() = permanent | transient | temporary
              +    significant() = boolean()
              +    shutdown() = brutal_kill | timeout()
              +    worker() = worker | supervisor
              • id is used to identify the child specification internally by the supervisor.

                The id key is mandatory.

                Note that this identifier occasionally has been called "name". As far as possible, the terms "identifier" or "id" are now used but in order to keep backwards compatibility, some occurrences of "name" can still be found, for example in error messages.

              • start defines the function call used to start the child process. It is a @@ -366,32 +366,32 @@ name of the callback module.

              This information is used by the release handler during upgrades and downgrades; see Release Handling.

              The modules key is optional. If it is not given, it defaults to [M], where M comes from the child's start {M,F,A}.

            Example: The child specification to start the server ch3 in the previous -example look as follows:

            #{id => ch3,
            -  start => {ch3, start_link, []},
            +example look as follows:

            #{id => ch3,
            +  start => {ch3, start_link, []},
               restart => permanent,
               shutdown => brutal_kill,
               type => worker,
            -  modules => [ch3]}

            or simplified, relying on the default values:

            #{id => ch3,
            +  modules => [ch3]}

            or simplified, relying on the default values:

            #{id => ch3,
               start => {ch3, start_link, []},
               shutdown => brutal_kill}

            Example: A child specification to start the event manager from the chapter about -gen_event:

            #{id => error_man,
            -  start => {gen_event, start_link, [{local, error_man}]},
            -  modules => dynamic}

            Both server and event manager are registered processes which can be expected to +gen_event:

            #{id => error_man,
            +  start => {gen_event, start_link, [{local, error_man}]},
            +  modules => dynamic}

            Both server and event manager are registered processes which can be expected to be always accessible. Thus they are specified to be permanent.

            ch3 does not need to do any cleaning up before termination. Thus, no shutdown time is needed, but brutal_kill is sufficient. error_man can need some time for the event handlers to clean up, thus the shutdown time is set to 5000 ms -(which is the default value).

            Example: A child specification to start another supervisor:

            #{id => sup,
            -  start => {sup, start_link, []},
            +(which is the default value).

            Example: A child specification to start another supervisor:

            #{id => sup,
            +  start => {sup, start_link, []},
               restart => transient,
            -  type => supervisor} % will cause default shutdown=>infinity

            + type => supervisor} % will cause default shutdown=>infinity

            Starting a Supervisor

            In the previous example, the supervisor is started by calling -ch_sup:start_link():

            start_link() ->
            -    supervisor:start_link(ch_sup, []).

            ch_sup:start_link calls function supervisor:start_link/2, which spawns and +ch_sup:start_link():

            start_link() ->
            +    supervisor:start_link(ch_sup, []).

            ch_sup:start_link calls function supervisor:start_link/2, which spawns and links to a new process, a supervisor.

            • The first argument, ch_sup, is the name of the callback module, that is, the module where the init callback function is located.
            • The second argument, [], is a term that is passed as is to the callback function init. Here, init does not need any data and ignores the argument.

            In this case, the supervisor is not registered. Instead its pid must be used. A @@ -399,12 +399,12 @@ supervisor:start_link({local, Name}, Module, Args) or supervisor:start_link({global, Name}, Module, Args).

            The new supervisor process calls the callback function ch_sup:init([]). init -has to return {ok, {SupFlags, ChildSpecs}}:

            init(_Args) ->
            -    SupFlags = #{},
            -    ChildSpecs = [#{id => ch3,
            -                    start => {ch3, start_link, []},
            -                    shutdown => brutal_kill}],
            -    {ok, {SupFlags, ChildSpecs}}.

            Subsequently, the supervisor starts its child processes according to the child +has to return {ok, {SupFlags, ChildSpecs}}:

            init(_Args) ->
            +    SupFlags = #{},
            +    ChildSpecs = [#{id => ch3,
            +                    start => {ch3, start_link, []},
            +                    shutdown => brutal_kill}],
            +    {ok, {SupFlags, ChildSpecs}}.

            Subsequently, the supervisor starts its child processes according to the child specifications in the start specification. In this case there is a single child process, called ch3.

            supervisor:start_link/3 is synchronous. It does not return until all child processes have been started.

            @@ -441,23 +441,23 @@

            A supervisor with restart strategy simple_one_for_one is a simplified one_for_one supervisor, where all child processes are dynamically added instances of the same process.

            The following is an example of a callback module for a simple_one_for_one -supervisor:

            -module(simple_sup).
            --behaviour(supervisor).
            +supervisor:

            -module(simple_sup).
            +-behaviour(supervisor).
             
            --export([start_link/0]).
            --export([init/1]).
            +-export([start_link/0]).
            +-export([init/1]).
             
            -start_link() ->
            -    supervisor:start_link(simple_sup, []).
            +start_link() ->
            +    supervisor:start_link(simple_sup, []).
             
            -init(_Args) ->
            -    SupFlags = #{strategy => simple_one_for_one,
            +init(_Args) ->
            +    SupFlags = #{strategy => simple_one_for_one,
                              intensity => 0,
            -                 period => 1},
            -    ChildSpecs = [#{id => call,
            -                    start => {call, start_link, []},
            -                    shutdown => brutal_kill}],
            -    {ok, {SupFlags, ChildSpecs}}.

            When started, the supervisor does not start any child + period => 1}, + ChildSpecs = [#{id => call, + start => {call, start_link, []}, + shutdown => brutal_kill}], + {ok, {SupFlags, ChildSpecs}}.

            When started, the supervisor does not start any child processes. Instead, all child processes need to be added dynamically by calling supervisor:start_child(Sup, List).

            Sup is the pid, or name, of the supervisor. List is an arbitrary list of terms, which are added to the list of arguments specified in the child /usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/tablesdatabases.xhtml differs (HTML document, ASCII text, with very long lines) --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/tablesdatabases.xhtml" 2025-05-10 20:18:56.913079888 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/tablesdatabases.xhtml" 2025-05-10 20:18:56.929080034 +0000 @@ -55,11 +55,11 @@

            The delete operation is considered successful if the element was not present in the table. Hence all attempts to check that the element is present in the Ets/Mnesia table before deletion are unnecessary. Here follows an example for -Ets tables:

            DO

            ets:delete(Tab, Key),

            DO NOT

            case ets:lookup(Tab, Key) of
            -    [] ->
            +Ets tables:

            DO

            ets:delete(Tab, Key),

            DO NOT

            case ets:lookup(Tab, Key) of
            +    [] ->
                     ok;
            -    [_|_] ->
            -        ets:delete(Tab, Key)
            +    [_|_] ->
            +        ets:delete(Tab, Key)
             end,

            @@ -71,49 +71,49 @@ functions print_name/1, print_age/1, and print_occupation/1.

            Note

            If the function print_name/1, and so on, had been interface functions, the situation would have been different, as you do not want the user of the interface to know about the internal data representation.

            DO

            %%% Interface function
            -print_person(PersonId) ->
            +print_person(PersonId) ->
                 %% Look up the person in the named table person,
            -    case ets:lookup(person, PersonId) of
            -        [Person] ->
            -            print_name(Person),
            -            print_age(Person),
            -            print_occupation(Person);
            -        [] ->
            -            io:format("No person with ID = ~p~n", [PersonID])
            +    case ets:lookup(person, PersonId) of
            +        [Person] ->
            +            print_name(Person),
            +            print_age(Person),
            +            print_occupation(Person);
            +        [] ->
            +            io:format("No person with ID = ~p~n", [PersonID])
                 end.
             
             %%% Internal functions
            -print_name(Person) ->
            -    io:format("No person ~p~n", [Person#person.name]).
            +print_name(Person) ->
            +    io:format("No person ~p~n", [Person#person.name]).
             
            -print_age(Person) ->
            -    io:format("No person ~p~n", [Person#person.age]).
            +print_age(Person) ->
            +    io:format("No person ~p~n", [Person#person.age]).
             
            -print_occupation(Person) ->
            -    io:format("No person ~p~n", [Person#person.occupation]).

            DO NOT

            %%% Interface function
            -print_person(PersonId) ->
            +print_occupation(Person) ->
            +    io:format("No person ~p~n", [Person#person.occupation]).

            DO NOT

            %%% Interface function
            +print_person(PersonId) ->
                 %% Look up the person in the named table person,
            -    case ets:lookup(person, PersonId) of
            -        [Person] ->
            -            print_name(PersonID),
            -            print_age(PersonID),
            -            print_occupation(PersonID);
            -        [] ->
            -            io:format("No person with ID = ~p~n", [PersonID])
            +    case ets:lookup(person, PersonId) of
            +        [Person] ->
            +            print_name(PersonID),
            +            print_age(PersonID),
            +            print_occupation(PersonID);
            +        [] ->
            +            io:format("No person with ID = ~p~n", [PersonID])
                 end.
             
             %%% Internal functions
            -print_name(PersonID) ->
            -    [Person] = ets:lookup(person, PersonId),
            -    io:format("No person ~p~n", [Person#person.name]).
            -
            -print_age(PersonID) ->
            -    [Person] = ets:lookup(person, PersonId),
            -    io:format("No person ~p~n", [Person#person.age]).
            -
            -print_occupation(PersonID) ->
            -    [Person] = ets:lookup(person, PersonId),
            -    io:format("No person ~p~n", [Person#person.occupation]).

            +print_name(PersonID) -> + [Person] = ets:lookup(person, PersonId), + io:format("No person ~p~n", [Person#person.name]). + +print_age(PersonID) -> + [Person] = ets:lookup(person, PersonId), + io:format("No person ~p~n", [Person#person.age]). + +print_occupation(PersonID) -> + [Person] = ets:lookup(person, PersonId), + io:format("No person ~p~n", [Person#person.occupation]).

            @@ -135,30 +135,30 @@ #person{idno = 4, name = "Carl", age = 25, occupation = "mailman"}]

            If you must return all data stored in the Ets table, you can use ets:tab2list/1. However, usually you are only interested in a subset of the information in which case ets:tab2list/1 is expensive. If you only want to -extract one field from each record, for example, the age of every person, then:

            DO

            ets:select(Tab, [{#person{idno='_',
            +extract one field from each record, for example, the age of every person, then:

            DO

            ets:select(Tab, [{#person{idno='_',
                                       name='_',
                                       age='$1',
            -                          occupation = '_'},
            -                [],
            -                ['$1']}]),

            DO NOT

            TabList = ets:tab2list(Tab),
            -lists:map(fun(X) -> X#person.age end, TabList),

            If you are only interested in the age of all persons named "Bryan", then:

            DO

            ets:select(Tab, [{#person{idno='_',
            +                          occupation = '_'},
            +                [],
            +                ['$1']}]),

            DO NOT

            TabList = ets:tab2list(Tab),
            +lists:map(fun(X) -> X#person.age end, TabList),

            If you are only interested in the age of all persons named "Bryan", then:

            DO

            ets:select(Tab, [{#person{idno='_',
                                       name="Bryan",
                                       age='$1',
            -                          occupation = '_'},
            -                [],
            -                ['$1']}])

            DO NOT

            TabList = ets:tab2list(Tab),
            -lists:foldl(fun(X, Acc) -> case X#person.name of
            +                          occupation = '_'},
            +                [],
            +                ['$1']}])

            DO NOT

            TabList = ets:tab2list(Tab),
            +lists:foldl(fun(X, Acc) -> case X#person.name of
                                             "Bryan" ->
            -                                    [X#person.age|Acc];
            +                                    [X#person.age|Acc];
                                              _ ->
                                                  Acc
                                        end
            -             end, [], TabList)

            If you need all information stored in the Ets table about persons named "Bryan", -then:

            DO

            ets:select(Tab, [{#person{idno='_',
            +             end, [], TabList)

            If you need all information stored in the Ets table about persons named "Bryan", +then:

            DO

            ets:select(Tab, [{#person{idno='_',
                                       name="Bryan",
                                       age='_',
            -                          occupation = '_'}, [], ['$_']}]),

            DO NOT

            TabList = ets:tab2list(Tab),
            -lists:filter(fun(X) -> X#person.name == "Bryan" end, TabList),

            + occupation = '_'}, [], ['$_']}]),

            DO NOT

            TabList = ets:tab2list(Tab),
            +lists:filter(fun(X) -> X#person.name == "Bryan" end, TabList),

            @@ -202,12 +202,12 @@ #index_entry{name="Bryan", idno=2}, #index_entry{name="Bryan", idno=3}, #index_entry{name="Carl", idno=4}]

            Given this index table, a lookup of the age fields for all persons named -"Bryan" can be done as follows:

            MatchingIDs = ets:lookup(IndexTable,"Bryan"),
            -lists:map(fun(#index_entry{idno = ID}) ->
            -                 [#person{age = Age}] = ets:lookup(PersonTable, ID),
            +"Bryan" can be done as follows:

            MatchingIDs = ets:lookup(IndexTable,"Bryan"),
            +lists:map(fun(#index_entry{idno = ID}) ->
            +                 [#person{age = Age}] = ets:lookup(PersonTable, ID),
                              Age
                       end,
            -          MatchingIDs),

            Notice that this code does not use ets:match/2, but instead uses the + MatchingIDs),

            Notice that this code does not use ets:match/2, but instead uses the ets:lookup/2 call. The lists:map/2 call is only used to traverse the idnos matching the name "Bryan" in the table; thus the number of lookups in the master table is minimized.

            Keeping an index table introduces some overhead when inserting records in the @@ -230,17 +230,17 @@ mnesia:match_object() as these function traverse the whole table. Instead, you can create a secondary index and use mnesia:index_read/3 to get faster access at the expense of using more -memory.

            Example:

            -record(person, {idno, name, age, occupation}).
            +memory.

            Example:

            -record(person, {idno, name, age, occupation}).
                     ...
            -{atomic, ok} =
            -mnesia:create_table(person, [{index,[#person.age]},
            -                              {attributes,
            -                                    record_info(fields, person)}]),
            -{atomic, ok} = mnesia:add_table_index(person, age),
            +{atomic, ok} =
            +mnesia:create_table(person, [{index,[#person.age]},
            +                              {attributes,
            +                                    record_info(fields, person)}]),
            +{atomic, ok} = mnesia:add_table_index(person, age),
             ...
             
             PersonsAge42 =
            -     mnesia:dirty_index_read(person, 42, #person.age),

            + mnesia:dirty_index_read(person, 42, #person.age),

            @@ -254,19 +254,19 @@ the table. Other processes must send update requests to that process.

            Example:

            ...
             %% Using transaction
             
            -Fun = fun() ->
            -          [mnesia:read({Table, Key}),
            -           mnesia:read({Table2, Key2})]
            +Fun = fun() ->
            +          [mnesia:read({Table, Key}),
            +           mnesia:read({Table2, Key2})]
                   end,
             
            /usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/typespec.xhtml differs (HTML document, ASCII text, with very long lines)
            --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/typespec.xhtml"	2025-05-10 20:18:56.913079888 +0000
            +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/typespec.xhtml"	2025-05-10 20:18:56.929080034 +0000
            @@ -147,11 +147,11 @@
             predefined aliases for the type unions also shown in the table.

            Built-in typeDefined as
            term/0any/0
            binary/0<<_:_*8>>
            nonempty_binary/0<<_:8, _:_*8>>
            bitstring/0<<_:_*1>>
            nonempty_bitstring/0<<_:1, _:_*1>>
            boolean/0'false' | 'true'
            byte/00..255
            char/00..16#10ffff
            nil/0[]
            number/0integer/0 | float/0
            list/0[any()]
            maybe_improper_list/0maybe_improper_list(any(), any())
            nonempty_list/0nonempty_list(any())
            string/0[char()]
            nonempty_string/0[char(),...]
            iodata/0iolist() | binary()
            iolist/0maybe_improper_list(byte() | binary() | iolist(), binary() | [])
            map/0#{any() => any()}
            function/0fun()
            module/0atom/0
            mfa/0{module(),atom(),arity()}
            arity/00..255
            identifier/0pid() | port() | reference()
            node/0atom/0
            timeout/0'infinity' | non_neg_integer()
            no_return/0none/0

            Table: Built-in types, predefined aliases

            In addition, the following three built-in types exist and can be thought as defined below, though strictly their "type definition" is not valid syntax according to the type language defined above.

            Built-in typeCan be thought defined by the syntax
            non_neg_integer/00..
            pos_integer/01..
            neg_integer/0..-1

            Table: Additional built-in types

            Note

            The following built-in list types also exist, but they are expected to be -rarely used. Hence, they have long names:

            nonempty_maybe_improper_list() :: nonempty_maybe_improper_list(any(), any())
            -nonempty_improper_list(Type1, Type2)
            -nonempty_maybe_improper_list(Type1, Type2)

            where the last two types define the set of Erlang terms one would expect.

            Also for convenience, record notation is allowed to be used. Records are -shorthands for the corresponding tuples:

            Record :: #Erlang_Atom{}
            -        | #Erlang_Atom{Fields}

            Records are extended to possibly contain type information. This is described in +rarely used. Hence, they have long names:

            nonempty_maybe_improper_list() :: nonempty_maybe_improper_list(any(), any())
            +nonempty_improper_list(Type1, Type2)
            +nonempty_maybe_improper_list(Type1, Type2)

            where the last two types define the set of Erlang terms one would expect.

            Also for convenience, record notation is allowed to be used. Records are +shorthands for the corresponding tuples:

            Record :: #Erlang_Atom{}
            +        | #Erlang_Atom{Fields}

            Records are extended to possibly contain type information. This is described in Type Information in Record Declarations.

            @@ -162,8 +162,8 @@ name as a built-in type.

            It is recommended to avoid deliberately reusing built-in names because it can be confusing. However, when an Erlang/OTP release introduces a new type, code that happened to define its own type having the same name will continue to work.

            As an example, imagine that the Erlang/OTP 42 release introduces a new type -gadget() defined like this:

            -type gadget() :: {'gadget', reference()}.

            Further imagine that some code has its own (different) definition of gadget(), -for example:

            -type gadget() :: #{}.

            Since redefinitions are allowed, the code will still compile (but with a +gadget() defined like this:

            -type gadget() :: {'gadget', reference()}.

            Further imagine that some code has its own (different) definition of gadget(), +for example:

            -type gadget() :: #{}.

            Since redefinitions are allowed, the code will still compile (but with a warning), and Dialyzer will not emit any additional warnings.

            @@ -172,8 +172,8 @@

            As seen, the basic syntax of a type is an atom followed by closed parentheses. New types are declared using -type and -opaque attributes as in the -following:

            -type my_struct_type() :: Type.
            --opaque my_opaq_type() :: Type.

            The type name is the atom my_struct_type, followed by parentheses. Type is a +following:

            -type my_struct_type() :: Type.
            +-opaque my_opaq_type() :: Type.

            The type name is the atom my_struct_type, followed by parentheses. Type is a type as defined in the previous section. A current restriction is that Type can contain only predefined types, or user-defined types which are either of the following:

            • Module-local type, that is, with a definition that is present in the code of @@ -183,10 +183,10 @@ similar restriction currently exists for records.)

              Type declarations can also be parameterized by including type variables between the parentheses. The syntax of type variables is the same as Erlang variables, that is, starts with an upper-case letter. These variables is to -appear on the RHS of the definition. A concrete example follows:

              -type orddict(Key, Val) :: [{Key, Val}].

              A module can export some types to declare that other modules are allowed to -refer to them as remote types. This declaration has the following form:

              -export_type([T1/A1, ..., Tk/Ak]).

              Here the Tis are atoms (the name of the type) and the Ais are their arguments.

              Example:

              -export_type([my_struct_type/0, orddict/2]).

              Assuming that these types are exported from module 'mod', you can refer to -them from other modules using remote type expressions like the following:

              mod:my_struct_type()
              -mod:orddict(atom(), term())

              It is not allowed to refer to types that are not declared as exported.

              Types declared as opaque represent sets of terms whose structure is not +appear on the RHS of the definition. A concrete example follows:

              -type orddict(Key, Val) :: [{Key, Val}].

              A module can export some types to declare that other modules are allowed to +refer to them as remote types. This declaration has the following form:

              -export_type([T1/A1, ..., Tk/Ak]).

              Here the Tis are atoms (the name of the type) and the Ais are their arguments.

              Example:

              -export_type([my_struct_type/0, orddict/2]).

              Assuming that these types are exported from module 'mod', you can refer to +them from other modules using remote type expressions like the following:

              mod:my_struct_type()
              +mod:orddict(atom(), term())

              It is not allowed to refer to types that are not declared as exported.

              Types declared as opaque represent sets of terms whose structure is not supposed to be visible from outside of their defining module. That is, only the module defining them is allowed to depend on their term structure. Consequently, such types do not make much sense as module local - module local types are not @@ -197,33 +197,33 @@ Type Information in Record Declarations

            The types of record fields can be specified in the declaration of the record. -The syntax for this is as follows:

            -record(rec, {field1 :: Type1, field2, field3 :: Type3}).

            For fields without type annotations, their type defaults to any(). That is, the -previous example is a shorthand for the following:

            -record(rec, {field1 :: Type1, field2 :: any(), field3 :: Type3}).

            In the presence of initial values for fields, the type must be declared after -the initialization, as follows:

            -record(rec, {field1 = [] :: Type1, field2, field3 = 42 :: Type3}).

            The initial values for fields are to be compatible with (that is, a member of) +The syntax for this is as follows:

            -record(rec, {field1 :: Type1, field2, field3 :: Type3}).

            For fields without type annotations, their type defaults to any(). That is, the +previous example is a shorthand for the following:

            -record(rec, {field1 :: Type1, field2 :: any(), field3 :: Type3}).

            In the presence of initial values for fields, the type must be declared after +the initialization, as follows:

            -record(rec, {field1 = [] :: Type1, field2, field3 = 42 :: Type3}).

            The initial values for fields are to be compatible with (that is, a member of) the corresponding types. This is checked by the compiler and results in a compilation error if a violation is detected.

            Change

            Before Erlang/OTP 19, for fields without initial values, the singleton type 'undefined' was added to all declared types. In other words, the following -two record declarations had identical effects:

            -record(rec, {f1 = 42 :: integer(),
            -             f2      :: float(),
            -             f3      :: 'a' | 'b'}).
            +two record declarations had identical effects:

            -record(rec, {f1 = 42 :: integer(),
            +             f2      :: float(),
            +             f3      :: 'a' | 'b'}).
             
            --record(rec, {f1 = 42 :: integer(),
            -              f2      :: 'undefined' | float(),
            -              f3      :: 'undefined' | 'a' | 'b'}).

            This is no longer the case. If you require 'undefined' in your record field +-record(rec, {f1 = 42 :: integer(), + f2 :: 'undefined' | float(), + f3 :: 'undefined' | 'a' | 'b'}).

            This is no longer the case. If you require 'undefined' in your record field type, you must explicitly add it to the typespec, as in the 2nd example.

            Any record, containing type information or not, once defined, can be used as a type using the following syntax:

            #rec{}

            In addition, the record fields can be further specified when using a record type by adding type information about the field as follows:

            #rec{some_field :: Type}

            Any unspecified fields are assumed to have the type in the original record declaration.

            Note

            When records are used to create patterns for ETS and Mnesia match functions, -Dialyzer may need some help not to emit bad warnings. For example:

            -type height() :: pos_integer().
            --record(person, {name :: string(), height :: height()}).
            +Dialyzer may need some help not to emit bad warnings. For example:

            -type height() :: pos_integer().
            +-record(person, {name :: string(), height :: height()}).
             
            -lookup(Name, Tab) ->
            -    ets:match_object(Tab, #person{name = Name, _ = '_'}).

            Dialyzer will emit a warning since '_' is not in the type of record field +lookup(Name, Tab) -> + ets:match_object(Tab, #person{name = Name, _ = '_'}).

            Dialyzer will emit a warning since '_' is not in the type of record field height.

            The recommended way of dealing with this is to declare the smallest record field types to accommodate all your needs, and then create refinements as -needed. The modified example:

            -record(person, {name :: string(), height :: height() | '_'}).
            +needed. The modified example:

            -record(person, {name :: string(), height :: height() | '_'}).
             
            --type person() :: #person{height :: height()}.

            In specifications and type declarations the type person() is to be preferred +-type person() :: #person{height :: height()}.

            In specifications and type declarations the type person() is to be preferred before #person{}.

            @@ -236,27 +236,27 @@ arguments, otherwise the compilation fails.

            The following longer format with module name is also valid as long as Module is the name of the current module. This can be useful for documentation purposes.

            -spec Module:Function(ArgType1, ..., ArgTypeN) -> ReturnType.

            Also, for documentation purposes, argument names can be given:

            -spec Function(ArgName1 :: Type1, ..., ArgNameN :: TypeN) -> RT.

            A function specification can be overloaded. That is, it can have several types, -separated by a semicolon (;). For example:

            -spec foo(T1, T2) -> T3;
            -         (T4, T5) -> T6.

            A current restriction, which currently results in a warning by Dialyzer, is that +separated by a semicolon (;). For example:

            -spec foo(T1, T2) -> T3;
            +         (T4, T5) -> T6.

            A current restriction, which currently results in a warning by Dialyzer, is that the domains of the argument types cannot overlap. For example, the following -specification results in a warning:

            -spec foo(pos_integer()) -> pos_integer();
            -         (integer()) -> integer().

            Type variables can be used in specifications to specify relations for the input +specification results in a warning:

            -spec foo(pos_integer()) -> pos_integer();
            +         (integer()) -> integer().

            Type variables can be used in specifications to specify relations for the input and output arguments of a function. For example, the following specification defines the type of a polymorphic identity function:

            -spec id(X) -> X.

            Notice that the above specification does not restrict the input and output type in any way. These types can be constrained by guard-like subtype constraints and -provide bounded quantification:

            -spec id(X) -> X when X :: tuple().

            Currently, the :: constraint (read as "is a subtype of") is the only guard +provide bounded quantification:

            -spec id(X) -> X when X :: tuple().

            Currently, the :: constraint (read as "is a subtype of") is the only guard constraint that can be used in the when part of a -spec attribute.

            Note

            The above function specification uses multiple occurrences of the same type variable. That provides more type information than the following function -specification, where the type variables are missing:

            -spec id(tuple()) -> tuple().

            The latter specification says that the function takes some tuple and returns +specification, where the type variables are missing:

            -spec id(tuple()) -> tuple().

            The latter specification says that the function takes some tuple and returns some tuple. The specification with the X type variable specifies that the function takes a tuple and returns the same tuple.

            However, it is up to the tools that process the specifications to choose whether to take this extra information into account or not.

            The scope of a :: constraint is the (...) -> RetType specification after which it appears. To avoid confusion, it is suggested that different variables are used in different constituents of an overloaded contract, as shown in the -following example:

            -spec foo({X, integer()}) -> X when X :: atom();
            -         ([Y]) -> Y when Y :: number().

            Some functions in Erlang are not meant to return; either because they define +following example:

            -spec foo({X, integer()}) -> X when X :: atom();
            +         ([Y]) -> Y when Y :: number().

            Some functions in Erlang are not meant to return; either because they define servers or because they are used to throw exceptions, as in the following -function:

            my_error(Err) -> throw({error, Err}).

            For such functions, it is recommended to use the special no_return/0 type +function:

            my_error(Err) -> throw({error, Err}).

            For such functions, it is recommended to use the special no_return/0 type for their "return", through a contract of the following form:

            -spec my_error(term()) -> no_return().

            Note

            Erlang uses the shorthand version _ as an anonymous type variable equivalent to term/0 or any/0. For example, the following function

            -spec Function(string(), _) -> string().

            is equivalent to:

            -spec Function(string(), any()) -> string().
            /usr/share/doc/packages/erlang-doc/doc/system/applications.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/applications.html 2025-05-10 20:18:57.561085763 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/applications.html 2025-05-10 20:18:57.569085835 +0000 @@ -139,8 +139,8 @@ Application Callback Module

            How to start and stop the code for the application, including its supervision -tree, is described by two callback functions:

            start(StartType, StartArgs) -> {ok, Pid} | {ok, Pid, State}
            -stop(State)
            • start/2 is called when starting the application and is to create the +tree, is described by two callback functions:

              start(StartType, StartArgs) -> {ok, Pid} | {ok, Pid, State}
              +stop(State)
              • start/2 is called when starting the application and is to create the supervision tree by starting the top supervisor. It is expected to return the pid of the top supervisor and an optional term, State, which defaults to []. This term is passed as is to stop/1.
              • StartType is usually the atom normal. It has other values only in the case @@ -150,15 +150,15 @@ necessary cleaning up. The actual stopping of the application, that is, shutting down the supervision tree, is handled automatically as described in Starting and Stopping Applications.

              Example of an application callback module for packaging the supervision tree -from Supervisor Behaviour:

              -module(ch_app).
              --behaviour(application).
              +from Supervisor Behaviour:

              -module(ch_app).
              +-behaviour(application).
               
              --export([start/2, stop/1]).
              +-export([start/2, stop/1]).
               
              -start(_Type, _Args) ->
              -    ch_sup:start_link().
              +start(_Type, _Args) ->
              +    ch_sup:start_link().
               
              -stop(_State) ->
              +stop(_State) ->
                   ok.

              A library application that cannot be started or stopped does not need any application callback module.

              @@ -177,14 +177,14 @@ in this case ch_app and [], respectively. This means that the following is called when the application is to be started:

              ch_app:start(normal, [])

              The following is called when the application is stopped:

              ch_app:stop([])

              When using systools, the Erlang/OTP tools for packaging code (see Section Releases), the keys description, vsn, modules, -registered, and applications are also to be specified:

              {application, ch_app,
              - [{description, "Channel allocator"},
              -  {vsn, "1"},
              -  {modules, [ch_app, ch_sup, ch3]},
              -  {registered, [ch3]},
              -  {applications, [kernel, stdlib, sasl]},
              -  {mod, {ch_app,[]}}
              - ]}.
              • description - A short description, a string. Defaults to "".
              • vsn - Version number, a string. Defaults to "".
              • modules - All modules introduced by this application. systools uses +registered, and applications are also to be specified:

                {application, ch_app,
                + [{description, "Channel allocator"},
                +  {vsn, "1"},
                +  {modules, [ch_app, ch_sup, ch3]},
                +  {registered, [ch3]},
                +  {applications, [kernel, stdlib, sasl]},
                +  {mod, {ch_app,[]}}
                + ]}.
                • description - A short description, a string. Defaults to "".
                • vsn - Version number, a string. Defaults to "".
                • modules - All modules introduced by this application. systools uses this list when generating boot scripts and tar files. A module must only be included in one application. Defaults to [].
                • registered - All names of registered processes in the application. systools uses this list to detect name clashes between applications. @@ -304,30 +304,30 @@ Loading and Unloading Applications

              Before an application can be started, it must be loaded. The application -controller reads and stores the information from the .app file:

              1> application:load(ch_app).
              +controller reads and stores the information from the .app file:

              1> application:load(ch_app).
               ok
              -2> application:loaded_applications().
              -[{kernel,"ERTS  CXC 138 10","2.8.1.3"},
              - {stdlib,"ERTS  CXC 138 10","1.11.4.3"},
              - {ch_app,"Channel allocator","1"}]

              An application that has been stopped, or has never been started, can be +2> application:loaded_applications(). +[{kernel,"ERTS CXC 138 10","2.8.1.3"}, + {stdlib,"ERTS CXC 138 10","1.11.4.3"}, + {ch_app,"Channel allocator","1"}]

              An application that has been stopped, or has never been started, can be unloaded. The information about the application is erased from the internal -database of the application controller.

              3> application:unload(ch_app).
              +database of the application controller.

              3> application:unload(ch_app).
               ok
              -4> application:loaded_applications().
              -[{kernel,"ERTS  CXC 138 10","2.8.1.3"},
              - {stdlib,"ERTS  CXC 138 10","1.11.4.3"}]

              Note

              Loading/unloading an application does not load/unload the code used by the +4> application:loaded_applications(). +[{kernel,"ERTS CXC 138 10","2.8.1.3"}, + {stdlib,"ERTS CXC 138 10","1.11.4.3"}]

              Note

              Loading/unloading an application does not load/unload the code used by the application. Code loading is handled in the usual way by the code server.

              Starting and Stopping Applications

              -

              An application is started by calling:

              5> application:start(ch_app).
              +

              An application is started by calling:

              5> application:start(ch_app).
               ok
              -6> application:which_applications().
              -[{kernel,"ERTS  CXC 138 10","2.8.1.3"},
              - {stdlib,"ERTS  CXC 138 10","1.11.4.3"},
              - {ch_app,"Channel allocator","1"}]

              If the application is not already loaded, the application controller first loads +6> application:which_applications(). +[{kernel,"ERTS CXC 138 10","2.8.1.3"}, + {stdlib,"ERTS CXC 138 10","1.11.4.3"}, + {ch_app,"Channel allocator","1"}]

              If the application is not already loaded, the application controller first loads it using application:load/1. It checks the value of the applications key to ensure that all applications that are to be started before this application are running.

              Following that, the application controller creates an application master for @@ -351,47 +351,47 @@ Configuring an Application

            An application can be configured using configuration parameters. These are a -list of {Par,Val} tuples specified by a key env in the .app file:

            {application, ch_app,
            - [{description, "Channel allocator"},
            -  {vsn, "1"},
            -  {modules, [ch_app, ch_sup, ch3]},
            -  {registered, [ch3]},
            -  {applications, [kernel, stdlib, sasl]},
            -  {mod, {ch_app,[]}},
            -  {env, [{file, "/usr/local/log"}]}
            - ]}.

            Par is to be an atom. Val is any term. The application can retrieve the +list of {Par,Val} tuples specified by a key env in the .app file:

            {application, ch_app,
            + [{description, "Channel allocator"},
            +  {vsn, "1"},
            +  {modules, [ch_app, ch_sup, ch3]},
            +  {registered, [ch3]},
            +  {applications, [kernel, stdlib, sasl]},
            +  {mod, {ch_app,[]}},
            +  {env, [{file, "/usr/local/log"}]}
            + ]}.

            Par is to be an atom. Val is any term. The application can retrieve the value of a configuration parameter by calling application:get_env(App, Par) or a number of similar functions. For more information, see module application in Kernel.

            Example:

            % erl
            -Erlang (BEAM) emulator version 5.2.3.6 [hipe] [threads:0]
            +Erlang (BEAM) emulator version 5.2.3.6 [hipe] [threads:0]
             
            -Eshell V5.2.3.6  (abort with ^G)
            -1> application:start(ch_app).
            +Eshell V5.2.3.6  (abort with ^G)
            +1> application:start(ch_app).
             ok
            -2> application:get_env(ch_app, file).
            -{ok,"/usr/local/log"}

            The values in the .app file can be overridden by values in a system +2> application:get_env(ch_app, file). +{ok,"/usr/local/log"}

            The values in the .app file can be overridden by values in a system configuration file. This is a file that contains configuration parameters for -relevant applications:

            [{Application1, [{Par11,Val11},...]},
            +relevant applications:

            [{Application1, [{Par11,Val11},...]},
              ...,
            - {ApplicationN, [{ParN1,ValN1},...]}].

            The system configuration is to be called Name.config and Erlang is to be + {ApplicationN, [{ParN1,ValN1},...]}].

            The system configuration is to be called Name.config and Erlang is to be started with the command-line argument -config Name. For details, see config in Kernel.

            Example:

            A file test.config is created with the following contents:

            [{ch_app, [{file, "testlog"}]}].

            The value of file overrides the value of file as defined in the .app file:

            % erl -config test
            -Erlang (BEAM) emulator version 5.2.3.6 [hipe] [threads:0]
            +Erlang (BEAM) emulator version 5.2.3.6 [hipe] [threads:0]
             
            -Eshell V5.2.3.6  (abort with ^G)
            -1> application:start(ch_app).
            +Eshell V5.2.3.6  (abort with ^G)
            +1> application:start(ch_app).
             ok
            -2> application:get_env(ch_app, file).
            -{ok,"testlog"}

            If release handling is used, exactly one system +2> application:get_env(ch_app, file). +{ok,"testlog"}

            If release handling is used, exactly one system configuration file is to be used and that file is to be called sys.config.

            The values in the .app file and the values in a system configuration file can be overridden directly from the command line:

            % erl -ApplName Par1 Val1 ... ParN ValN

            Example:

            % erl -ch_app file '"testlog"'
            -Erlang (BEAM) emulator version 5.2.3.6 [hipe] [threads:0]
            +Erlang (BEAM) emulator version 5.2.3.6 [hipe] [threads:0]
             
            -Eshell V5.2.3.6  (abort with ^G)
            -1> application:start(ch_app).
            +Eshell V5.2.3.6  (abort with ^G)
            +1> application:start(ch_app).
             ok
            -2> application:get_env(ch_app, file).
            -{ok,"testlog"}

            +2> application:get_env(ch_app, file). +{ok,"testlog"}

            @@ -457,7 +457,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/doc/system/appup_cookbook.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/appup_cookbook.html 2025-05-10 20:18:57.601086126 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/appup_cookbook.html 2025-05-10 20:18:57.613086235 +0000 @@ -124,10 +124,10 @@

            When a functional module has been changed, for example, if a new function has been added or a bug has been corrected, simple code replacement is sufficient, -for example:

            {"2",
            - [{"1", [{load_module, m}]}],
            - [{"1", [{load_module, m}]}]
            -}.

            +for example:

            {"2",
            + [{"1", [{load_module, m}]}],
            + [{"1", [{load_module, m}]}]
            +}.

            @@ -146,10 +146,10 @@

            A callback module is a functional module, and for code extensions simple code replacement is sufficient.

            Example

            When adding a function to ch3, as described in the example in -Release Handling, ch_app.appup looks as follows:

            {"2",
            - [{"1", [{load_module, ch3}]}],
            - [{"1", [{load_module, ch3}]}]
            -}.

            OTP also supports changing the internal state of behaviour processes; see +Release Handling, ch_app.appup looks as follows:

            {"2",
            + [{"1", [{load_module, ch3}]}],
            + [{"1", [{load_module, ch3}]}]
            +}.

            OTP also supports changing the internal state of behaviour processes; see Changing Internal State.

            @@ -163,21 +163,21 @@ gen_server Behaviour. The internal state is a term Chs representing the available channels. Assume you want to add a counter N, which keeps track of the number of alloc requests so far. This means that the -format must be changed to {Chs,N}.

            The .appup file can look as follows:

            {"2",
            - [{"1", [{update, ch3, {advanced, []}}]}],
            - [{"1", [{update, ch3, {advanced, []}}]}]
            -}.

            The third element of the update instruction is a tuple {advanced,Extra}, +format must be changed to {Chs,N}.

            The .appup file can look as follows:

            {"2",
            + [{"1", [{update, ch3, {advanced, []}}]}],
            + [{"1", [{update, ch3, {advanced, []}}]}]
            +}.

            The third element of the update instruction is a tuple {advanced,Extra}, which says that the affected processes are to do a state transformation before loading the new version of the module. This is done by the processes calling the callback function code_change/3 (see gen_server in STDLIB). -The term Extra, in this case [], is passed as is to the function:

            -module(ch3).
            +The term Extra, in this case [], is passed as is to the function:

            -module(ch3).
             ...
            --export([code_change/3]).
            +-export([code_change/3]).
             ...
            -code_change({down, _Vsn}, {Chs, N}, _Extra) ->
            -    {ok, Chs};
            -code_change(_Vsn, Chs, _Extra) ->
            -    {ok, {Chs, 0}}.

            The first argument is {down,Vsn} if there is a downgrade, or Vsn if there is +code_change({down, _Vsn}, {Chs, N}, _Extra) -> + {ok, Chs}; +code_change(_Vsn, Chs, _Extra) -> + {ok, {Chs, 0}}.

            The first argument is {down,Vsn} if there is a downgrade, or Vsn if there is a upgrade. The term Vsn is fetched from the 'original' version of the module, that is, the version you are upgrading from, or downgrading to.

            The version is defined by the module attribute vsn, if any. There is no such attribute in ch3, so in this case the version is the checksum (a huge integer) @@ -194,29 +194,29 @@ can occur during release upgrade if the new version of m1 is loaded first and calls ch3:available/0 before the new version of ch3 is loaded.

            Thus, ch3 must be loaded before m1, in the upgrade case, and conversely in the downgrade case. m1 is said to be dependent on ch3. In a release -handling instruction, this is expressed by the DepMods element:

            {load_module, Module, DepMods}
            -{update, Module, {advanced, Extra}, DepMods}

            DepMods is a list of modules, on which Module is dependent.

            Example

            The module m1 in application myapp is dependent on ch3 when +handling instruction, this is expressed by the DepMods element:

            {load_module, Module, DepMods}
            +{update, Module, {advanced, Extra}, DepMods}

            DepMods is a list of modules, on which Module is dependent.

            Example

            The module m1 in application myapp is dependent on ch3 when upgrading from "1" to "2", or downgrading from "2" to "1":

            myapp.appup:
             
            -{"2",
            - [{"1", [{load_module, m1, [ch3]}]}],
            - [{"1", [{load_module, m1, [ch3]}]}]
            -}.
            +{"2",
            + [{"1", [{load_module, m1, [ch3]}]}],
            + [{"1", [{load_module, m1, [ch3]}]}]
            +}.
             
             ch_app.appup:
             
            -{"2",
            - [{"1", [{load_module, ch3}]}],
            - [{"1", [{load_module, ch3}]}]
            -}.

            If instead m1 and ch3 belong to the same application, the .appup file can -look as follows:

            {"2",
            - [{"1",
            -   [{load_module, ch3},
            -    {load_module, m1, [ch3]}]}],
            - [{"1",
            -   [{load_module, ch3},
            -    {load_module, m1, [ch3]}]}]
            -}.

            m1 is dependent on ch3 also when downgrading. systools knows the +{"2", + [{"1", [{load_module, ch3}]}], + [{"1", [{load_module, ch3}]}] +}.

            If instead m1 and ch3 belong to the same application, the .appup file can +look as follows:

            {"2",
            + [{"1",
            +   [{load_module, ch3},
            +    {load_module, m1, [ch3]}]}],
            + [{"1",
            +   [{load_module, ch3},
            +    {load_module, m1, [ch3]}]}]
            +}.

            m1 is dependent on ch3 also when downgrading. systools knows the difference between up- and downgrading and generates a correct relup, where ch3 is loaded before m1 when upgrading, but m1 is loaded before ch3 when downgrading.

            @@ -231,22 +231,22 @@ synchronized code replacement must be used.

            Note

            The name(s) of the user-defined residence module(s) must be listed in the Modules part of the child specification for the special process. Otherwise the release handler cannot find the process.

            Example

            Consider the example ch4 in sys and proc_lib. -When started by a supervisor, the child specification can look as follows:

            {ch4, {ch4, start_link, []},
            - permanent, brutal_kill, worker, [ch4]}

            If ch4 is part of the application sp_app and a new version of the module is +When started by a supervisor, the child specification can look as follows:

            {ch4, {ch4, start_link, []},
            + permanent, brutal_kill, worker, [ch4]}

            If ch4 is part of the application sp_app and a new version of the module is to be loaded when upgrading from version "1" to "2" of this application, -sp_app.appup can look as follows:

            {"2",
            - [{"1", [{update, ch4, {advanced, []}}]}],
            - [{"1", [{update, ch4, {advanced, []}}]}]
            -}.

            The update instruction must contain the tuple {advanced,Extra}. The +sp_app.appup can look as follows:

            {"2",
            + [{"1", [{update, ch4, {advanced, []}}]}],
            + [{"1", [{update, ch4, {advanced, []}}]}]
            +}.

            The update instruction must contain the tuple {advanced,Extra}. The instruction makes the special process call the callback function system_code_change/4, a function the user must implement. The term Extra, in -this case [], is passed as is to system_code_change/4:

            -module(ch4).
            +this case [], is passed as is to system_code_change/4:

            -module(ch4).
             ...
            --export([system_code_change/4]).
            +-export([system_code_change/4]).
             ...
             
            -system_code_change(Chs, _Module, _OldVsn, _Extra) ->
            -    {ok, Chs}.
            • The first argument is the internal state State, passed from +system_code_change(Chs, _Module, _OldVsn, _Extra) -> + {ok, Chs}.
            • The first argument is the internal state State, passed from function sys:handle_system_msg(Request, From, Parent, Module, Deb, State), and called by the special process when a system message is received. In ch4, the internal state is the set of available channels Chs.
            • The second argument is the name of the module (ch4).
            • The third argument is Vsn or {down,Vsn}, as described for @@ -275,24 +275,24 @@ of upgrade and downgrade. Then the new return value of init/1 can be checked and the internal state be changed accordingly.

              The following upgrade instruction is used for supervisors:

              {update, Module, supervisor}

              Example

              To change the restart strategy of ch_sup (from Supervisor Behaviour) from one_for_one to one_for_all, -change the callback function init/1 in ch_sup.erl:

              -module(ch_sup).
              +change the callback function init/1 in ch_sup.erl:

              -module(ch_sup).
               ...
               
              -init(_Args) ->
              -    {ok, {#{strategy => one_for_all, ...}, ...}}.

              The file ch_app.appup:

              {"2",
              - [{"1", [{update, ch_sup, supervisor}]}],
              - [{"1", [{update, ch_sup, supervisor}]}]
              -}.

              +init(_Args) -> + {ok, {#{strategy => one_for_all, ...}, ...}}.

              The file ch_app.appup:

              {"2",
              + [{"1", [{update, ch_sup, supervisor}]}],
              + [{"1", [{update, ch_sup, supervisor}]}]
              +}.

              Changing Child Specifications

              The instruction, and thus the .appup file, when changing an existing child -specification, is the same as when changing properties as described earlier:

              {"2",
              - [{"1", [{update, ch_sup, supervisor}]}],
              - [{"1", [{update, ch_sup, supervisor}]}]
              -}.

              The changes do not affect existing child processes. For example, changing the +specification, is the same as when changing properties as described earlier:

              {"2",
              + [{"1", [{update, ch_sup, supervisor}]}],
              + [{"1", [{update, ch_sup, supervisor}]}]
              +}.

              The changes do not affect existing child processes. For example, changing the start function only specifies how the child process is to be restarted, if needed later on.

              The id of the child specification cannot be changed.

              Changing the Modules field of the child specification can affect the release handling process itself, as this field is used to identify which processes are @@ -307,34 +307,34 @@ Child processes are not automatically started or terminated, this must be done using apply instructions.

              Example

              Assume a new child process m1 is to be added to ch_sup when upgrading ch_app from "1" to "2". This means m1 is to be deleted when -downgrading from "2" to "1":

              {"2",
              - [{"1",
              -   [{update, ch_sup, supervisor},
              -    {apply, {supervisor, restart_child, [ch_sup, m1]}}
              -   ]}],
              - [{"1",
              -   [{apply, {supervisor, terminate_child, [ch_sup, m1]}},
              -    {apply, {supervisor, delete_child, [ch_sup, m1]}},
              -    {update, ch_sup, supervisor}
              -   ]}]
              -}.

              The order of the instructions is important.

              The supervisor must be registered as ch_sup for the script to work. If the +downgrading from "2" to "1":

              {"2",
              + [{"1",
              +   [{update, ch_sup, supervisor},
              +    {apply, {supervisor, restart_child, [ch_sup, m1]}}
              +   ]}],
              /usr/share/doc/packages/erlang-doc/doc/system/benchmarking.html differs (HTML document, UTF-8 Unicode text, with very long lines)
              --- old//usr/share/doc/packages/erlang-doc/doc/system/benchmarking.html	2025-05-10 20:18:57.633086417 +0000
              +++ new//usr/share/doc/packages/erlang-doc/doc/system/benchmarking.html	2025-05-10 20:18:57.637086453 +0000
              @@ -148,8 +148,8 @@
               crypto:strong_rand_bytes(100).          1    1915 Ki     522 ns   90%

              rand:bytes/1 is still faster when we generate 100 bytes at the time, but the relative difference is smaller.

              % erlperf 'rand:bytes(1000).' 'crypto:strong_rand_bytes(1000).'
               Code                                    ||        QPS       Time   Rel
              -crypto:strong_rand_bytes(1000).          1    1518 Ki     658 ns  100%
              -rand:bytes(1000).                        1     284 Ki    3521 ns   19%

              When we generate 1000 bytes at the time, crypto:strong_rand_bytes/1 is +crypto:strong_rand_bytes(1000). 1 1518 Ki 658 ns 100% +rand:bytes(1000). 1 284 Ki 3521 ns 19%

            When we generate 1000 bytes at the time, crypto:strong_rand_bytes/1 is now the fastest.

            @@ -223,7 +223,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/doc/system/binaryhandling.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/binaryhandling.html 2025-05-10 20:18:57.661086670 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/binaryhandling.html 2025-05-10 20:18:57.665086707 +0000 @@ -118,35 +118,35 @@

            This section gives a few examples on how to handle binaries in an efficient way. The sections that follow take an in-depth look at how binaries are implemented and how to best take advantages of the optimizations done by the compiler and -runtime system.

            Binaries can be efficiently built in the following way:

            DO

            my_list_to_binary(List) ->
            -    my_list_to_binary(List, <<>>).
            +runtime system.

            Binaries can be efficiently built in the following way:

            DO

            my_list_to_binary(List) ->
            +    my_list_to_binary(List, <<>>).
             
            -my_list_to_binary([H|T], Acc) ->
            -    my_list_to_binary(T, <<Acc/binary,H>>);
            -my_list_to_binary([], Acc) ->
            +my_list_to_binary([H|T], Acc) ->
            +    my_list_to_binary(T, <<Acc/binary,H>>);
            +my_list_to_binary([], Acc) ->
                 Acc.

            Appending data to a binary as in the example is efficient because it is specially optimized by the runtime system to avoid copying the Acc binary -every time.

            Prepending data to a binary in a loop is not efficient:

            DO NOT

            rev_list_to_binary(List) ->
            -    rev_list_to_binary(List, <<>>).
            +every time.

            Prepending data to a binary in a loop is not efficient:

            DO NOT

            rev_list_to_binary(List) ->
            +    rev_list_to_binary(List, <<>>).
             
            -rev_list_to_binary([H|T], Acc) ->
            -    rev_list_to_binary(T, <<H,Acc/binary>>);
            -rev_list_to_binary([], Acc) ->
            +rev_list_to_binary([H|T], Acc) ->
            +    rev_list_to_binary(T, <<H,Acc/binary>>);
            +rev_list_to_binary([], Acc) ->
                 Acc.

            This is not efficient for long lists because the Acc binary is copied every -time. One way to make the function more efficient is like this:

            DO NOT

            rev_list_to_binary(List) ->
            -    rev_list_to_binary(lists:reverse(List), <<>>).
            +time. One way to make the function more efficient is like this:

            DO NOT

            rev_list_to_binary(List) ->
            +    rev_list_to_binary(lists:reverse(List), <<>>).
             
            -rev_list_to_binary([H|T], Acc) ->
            -    rev_list_to_binary(T, <<Acc/binary,H>>);
            -rev_list_to_binary([], Acc) ->
            -    Acc.

            Another way to avoid copying the binary each time is like this:

            DO

            rev_list_to_binary([H|T]) ->
            -    RevTail = rev_list_to_binary(T),
            +rev_list_to_binary([H|T], Acc) ->
            +    rev_list_to_binary(T, <<Acc/binary,H>>);
            +rev_list_to_binary([], Acc) ->
            +    Acc.

            Another way to avoid copying the binary each time is like this:

            DO

            rev_list_to_binary([H|T]) ->
            +    RevTail = rev_list_to_binary(T),
                 <<RevTail/binary,H>>;
            -rev_list_to_binary([]) ->
            +rev_list_to_binary([]) ->
                 <<>>.

            Note that in each of the DO examples, the binary to be appended to is always -given as the first segment.

            Binaries can be efficiently matched in the following way:

            DO

            my_binary_to_list(<<H,T/binary>>) ->
            -    [H|my_binary_to_list(T)];
            -my_binary_to_list(<<>>) -> [].

            +given as the first segment.

            Binaries can be efficiently matched in the following way:

            DO

            my_binary_to_list(<<H,T/binary>>) ->
            +    [H|my_binary_to_list(T)];
            +my_binary_to_list(<<>>) -> [].

            @@ -223,7 +223,7 @@ Bin2 = <<Bin1/binary,4,5,6>>, %% 3 Bin3 = <<Bin2/binary,7,8,9>>, %% 4 Bin4 = <<Bin1/binary,17>>, %% 5 !!! -{Bin4,Bin3} %% 6

            • Line 1 (marked with the %% 1 comment), assigns a +{Bin4,Bin3} %% 6

            • Line 1 (marked with the %% 1 comment), assigns a heap binary to the Bin0 variable.

            • Line 2 is an append operation. As Bin0 has not been involved in an append operation, a new refc binary is created and the contents of Bin0 is copied into it. The ProcBin part of the refc @@ -257,15 +257,15 @@ for every append operation, the runtime system must create a sub binary.

              When the compiler can determine that none of those situations need to be handled and that the append operation cannot possibly fail, the compiler generates code that causes the runtime system to apply a more efficient variant of the -optimization.

              Example:

              -module(repack).
              --export([repack/1]).
              +optimization.

              Example:

              -module(repack).
              +-export([repack/1]).
               
              -repack(Bin) when is_binary(Bin) ->
              -    repack(Bin, <<>>).
              +repack(Bin) when is_binary(Bin) ->
              +    repack(Bin, <<>>).
               
              -repack(<<C:8,T/binary>>, Result) ->
              -    repack(T, <<Result/binary,C:16>>);
              -repack(<<>>, Result) ->
              +repack(<<C:8,T/binary>>, Result) ->
              +    repack(T, <<Result/binary,C:16>>);
              +repack(<<>>, Result) ->
                   Result.

              The repack/2 function only keeps a single version of the binary, so there is never any need to copy the binary. The compiler rewrites the creation of the empty binary in repack/1 to instead create a refc binary with 256 bytes @@ -308,9 +308,9 @@ Matching Binaries

            -

            Let us revisit the example in the beginning of the previous section:

            DO

            my_binary_to_list(<<H,T/binary>>) ->
            -    [H|my_binary_to_list(T)];
            -my_binary_to_list(<<>>) -> [].

            The first time my_binary_to_list/1 is called, a +

            Let us revisit the example in the beginning of the previous section:

            DO

            my_binary_to_list(<<H,T/binary>>) ->
            +    [H|my_binary_to_list(T)];
            +my_binary_to_list(<<>>) -> [].

            The first time my_binary_to_list/1 is called, a match context is created. The match context points to the first byte of the binary. 1 byte is matched out and the match context is updated to point to the second byte in the binary.

            At this point it would make sense to create a @@ -325,24 +325,24 @@ there is no longer any reference to it).

            To summarize, my_binary_to_list/1 only needs to create one match context and no sub binaries.

            Notice that the match context in my_binary_to_list/1 was discarded when the entire binary had been traversed. What happens if the iteration stops before it -has reached the end of the binary? Will the optimization still work?

            after_zero(<<0,T/binary>>) ->
            +has reached the end of the binary? Will the optimization still work?

            after_zero(<<0,T/binary>>) ->
                 T;
            -after_zero(<<_,T/binary>>) ->
            -    after_zero(T);
            -after_zero(<<>>) ->
            +after_zero(<<_,T/binary>>) ->
            +    after_zero(T);
            +after_zero(<<>>) ->
                 <<>>.

            Yes, it will. The compiler will remove the building of the sub binary in the second clause:

            ...
            -after_zero(<<_,T/binary>>) ->
            -    after_zero(T);
            -...

            But it will generate code that builds a sub binary in the first clause:

            after_zero(<<0,T/binary>>) ->
            +after_zero(<<_,T/binary>>) ->
            +    after_zero(T);
            +...

            But it will generate code that builds a sub binary in the first clause:

            after_zero(<<0,T/binary>>) ->
                 T;
             ...

            Therefore, after_zero/1 builds one match context and one sub binary (assuming -it is passed a binary that contains a zero byte).

            Code like the following will also be optimized:

            all_but_zeroes_to_list(Buffer, Acc, 0) ->
            -    {lists:reverse(Acc),Buffer};
            -all_but_zeroes_to_list(<<0,T/binary>>, Acc, Remaining) ->
            -    all_but_zeroes_to_list(T, Acc, Remaining-1);
            -all_but_zeroes_to_list(<<Byte,T/binary>>, Acc, Remaining) ->
            -    all_but_zeroes_to_list(T, [Byte|Acc], Remaining-1).

            The compiler removes building of sub binaries in the second and third clauses, +it is passed a binary that contains a zero byte).

            Code like the following will also be optimized:

            all_but_zeroes_to_list(Buffer, Acc, 0) ->
            +    {lists:reverse(Acc),Buffer};
            +all_but_zeroes_to_list(<<0,T/binary>>, Acc, Remaining) ->
            +    all_but_zeroes_to_list(T, Acc, Remaining-1);
            +all_but_zeroes_to_list(<<Byte,T/binary>>, Acc, Remaining) ->
            +    all_but_zeroes_to_list(T, [Byte|Acc], Remaining-1).

            The compiler removes building of sub binaries in the second and third clauses, and it adds an instruction to the first clause that converts Buffer from a match context to a sub binary (or do nothing if Buffer is a binary already).

            But in more complicated code, how can one know whether the optimization is applied or not?

            @@ -358,13 +358,13 @@ practical approach.

            The warnings look as follows:

            ./efficiency_guide.erl:60: Warning: NOT OPTIMIZED: binary is returned from the function
             ./efficiency_guide.erl:62: Warning: OPTIMIZED: match context reused

            To make it clearer exactly what code the warnings refer to, the warnings in the following examples are inserted as comments after the clause they refer to, for -example:

            after_zero(<<0,T/binary>>) ->
            +example:

            after_zero(<<0,T/binary>>) ->
                      %% BINARY CREATED: binary is returned from the function
                 T;
            -after_zero(<<_,T/binary>>) ->
            +after_zero(<<_,T/binary>>) ->
                      %% OPTIMIZED: match context reused
            -    after_zero(T);
            -after_zero(<<>>) ->
            +    after_zero(T);
            +after_zero(<<>>) ->
                 <<>>.

            The warning for the first clause says that the creation of a sub binary cannot be delayed, because it will be returned. The warning for the second clause says that a sub binary will not be created (yet).

            @@ -374,14 +374,14 @@ Unused Variables

            The compiler figures out if a variable is unused. The same code is generated for -each of the following functions:

            count1(<<_,T/binary>>, Count) -> count1(T, Count+1);
            -count1(<<>>, Count) -> Count.
            +each of the following functions:

            count1(<<_,T/binary>>, Count) -> count1(T, Count+1);
            +count1(<<>>, Count) -> Count.
             
            -count2(<<H,T/binary>>, Count) -> count2(T, Count+1);
            -count2(<<>>, Count) -> Count.
            +count2(<<H,T/binary>>, Count) -> count2(T, Count+1);
            +count2(<<>>, Count) -> Count.
             
            -count3(<<_H,T/binary>>, Count) -> count3(T, Count+1);
            -count3(<<>>, Count) -> Count.

            In each iteration, the first 8 bits in the binary will be skipped, not matched +count3(<<_H,T/binary>>, Count) -> count3(T, Count+1); +count3(<<>>, Count) -> Count.

            In each iteration, the first 8 bits in the binary will be skipped, not matched out.

            @@ -433,7 +433,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/doc/system/bit_syntax.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/bit_syntax.html 2025-05-10 20:18:57.689086924 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/bit_syntax.html 2025-05-10 20:18:57.693086960 +0000 @@ -145,17 +145,17 @@ variables, and Bin2 is bound, as in Example 2:

            <<D:16, E, F/binary>> = Bin2

            This gives D = 273, E = 00, and F binds to a binary of size 1: binary_to_list(F) = [42].

            Example 4: The following is a more elaborate example of matching. Here, Dgram is bound to the consecutive bytes of an IP datagram of IP protocol -version 4. The ambition is to extract the header and the data of the datagram:

            -define(IP_VERSION, 4).
            --define(IP_MIN_HDR_LEN, 5).
            +version 4. The ambition is to extract the header and the data of the datagram:

            -define(IP_VERSION, 4).
            +-define(IP_MIN_HDR_LEN, 5).
             
            -DgramSize = byte_size(Dgram),
            +DgramSize = byte_size(Dgram),
             case Dgram of
                 <<?IP_VERSION:4, HLen:4, SrvcType:8, TotLen:16,
                   ID:16, Flgs:3, FragOff:13,
                   TTL:8, Proto:8, HdrChkSum:16,
                   SrcIP:32,
                   DestIP:32, RestDgram/binary>> when HLen>=5, 4*HLen=<DgramSize ->
            -        OptsLen = 4*(HLen - ?IP_MIN_HDR_LEN),
            +        OptsLen = 4*(HLen - ?IP_MIN_HDR_LEN),
                     <<Opts:OptsLen/binary,Data/binary>> = RestDgram,
                 ...
             end.

            Here, the segment corresponding to the Opts variable has a type modifier, @@ -233,7 +233,7 @@ However, for syntactical reasons, both Value and Size must be enclosed in parenthesis if the expression consists of anything more than a single literal or a variable. The following gives a compiler syntax error:

            <<X+1:8>>

            This expression must be rewritten into the following, to be accepted by the -compiler:

            <<(X+1):8>>

            +compiler:

            <<(X+1):8>>

            @@ -253,11 +253,11 @@ restrictions on the size. A segment of type float must have size 64 or 32.

            As mentioned earlier, segments have the following general syntax:

            Value:Size/TypeSpecifierList

            When matching Value, value must be either a variable or an integer, or a floating point literal. Expressions are not allowed.

            Size must be a guard expression, which can use -literals and previously bound variables. The following is not allowed:

            foo(N, <<X:N,T/binary>>) ->
            -   {X,T}.

            The two occurrences of N are not related. The compiler will complain that the -N in the size field is unbound.

            The correct way to write this example is as follows:

            foo(N, Bin) ->
            +literals and previously bound variables. The following is not allowed:

            foo(N, <<X:N,T/binary>>) ->
            +   {X,T}.

            The two occurrences of N are not related. The compiler will complain that the +N in the size field is unbound.

            The correct way to write this example is as follows:

            foo(N, Bin) ->
                <<X:N,T/binary>> = Bin,
            -   {X,T}.

            Note

            Before OTP 23, Size was restricted to be an integer or a variable bound to + {X,T}.

            Note

            Before OTP 23, Size was restricted to be an integer or a variable bound to an integer.

            @@ -266,28 +266,28 @@

            There is one exception to the rule that a variable that is used as size must be previously bound. It is possible to match and bind a variable, and use it as a -size within the same binary pattern. For example:

            bar(<<Sz:8,Payload:Sz/binary-unit:8,Rest/binary>>) ->
            -   {Payload,Rest}.

            Here Sz is bound to the value in the first byte of the binary. Sz is then -used at the number of bytes to match out as a binary.

            Starting in OTP 23, the size can be a guard expression:

            bar(<<Sz:8,Payload:((Sz-1)*8)/binary,Rest/binary>>) ->
            -   {Payload,Rest}.

            Here Sz is the combined size of the header and the payload, so we will need to +size within the same binary pattern. For example:

            bar(<<Sz:8,Payload:Sz/binary-unit:8,Rest/binary>>) ->
            +   {Payload,Rest}.

            Here Sz is bound to the value in the first byte of the binary. Sz is then +used at the number of bytes to match out as a binary.

            Starting in OTP 23, the size can be a guard expression:

            bar(<<Sz:8,Payload:((Sz-1)*8)/binary,Rest/binary>>) ->
            +   {Payload,Rest}.

            Here Sz is the combined size of the header and the payload, so we will need to subtract one byte to get the size of the payload.

            Getting the Rest of the Binary or Bitstring

            -

            To match out the rest of a binary, specify a binary field without size:

            foo(<<A:8,Rest/binary>>) ->

            The size of the tail must be evenly divisible by 8.

            To match out the rest of a bitstring, specify a field without size:

            foo(<<A:8,Rest/bitstring>>) ->

            There are no restrictions on the number of bits in the tail.

            +

            To match out the rest of a binary, specify a binary field without size:

            foo(<<A:8,Rest/binary>>) ->

            The size of the tail must be evenly divisible by 8.

            To match out the rest of a bitstring, specify a field without size:

            foo(<<A:8,Rest/bitstring>>) ->

            There are no restrictions on the number of bits in the tail.

            Appending to a Binary

            -

            Appending to a binary in an efficient way can be done as follows:

            triples_to_bin(T) ->
            -    triples_to_bin(T, <<>>).
            +

            Appending to a binary in an efficient way can be done as follows:

            triples_to_bin(T) ->
            +    triples_to_bin(T, <<>>).
             
            -triples_to_bin([{X,Y,Z} | T], Acc) ->
            -    triples_to_bin(T, <<Acc/binary,X:32,Y:32,Z:32>>);
            -triples_to_bin([], Acc) ->
            +triples_to_bin([{X,Y,Z} | T], Acc) ->
            +    triples_to_bin(T, <<Acc/binary,X:32,Y:32,Z:32>>);
            +triples_to_bin([], Acc) ->
                 Acc.
            @@ -339,7 +339,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/doc/system/c_port.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/c_port.html 2025-05-10 20:18:57.721087214 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/c_port.html 2025-05-10 20:18:57.725087250 +0000 @@ -152,93 +152,93 @@ length indicator is to be used to simplify the communication between C and Erlang. The Erlang port automatically adds the length indicator, but this must be done explicitly in the external C program.

            The process is also set to trap exits, which enables detection of failure of the -external program:

            -module(complex1).
            --export([start/1, init/1]).
            +external program:

            -module(complex1).
            +-export([start/1, init/1]).
             
            -start(ExtPrg) ->
            -  spawn(?MODULE, init, [ExtPrg]).
            +start(ExtPrg) ->
            +  spawn(?MODULE, init, [ExtPrg]).
             
            -init(ExtPrg) ->
            -  register(complex, self()),
            -  process_flag(trap_exit, true),
            -  Port = open_port({spawn, ExtPrg}, [{packet, 2}]),
            -  loop(Port).

            Now complex1:foo/1 and complex1:bar/1 can be implemented. Both send a -message to the complex process and receive the following replies:

            foo(X) ->
            -  call_port({foo, X}).
            -bar(Y) ->
            -  call_port({bar, Y}).
            +init(ExtPrg) ->
            +  register(complex, self()),
            +  process_flag(trap_exit, true),
            +  Port = open_port({spawn, ExtPrg}, [{packet, 2}]),
            +  loop(Port).

            Now complex1:foo/1 and complex1:bar/1 can be implemented. Both send a +message to the complex process and receive the following replies:

            foo(X) ->
            +  call_port({foo, X}).
            +bar(Y) ->
            +  call_port({bar, Y}).
             
            -call_port(Msg) ->
            -  complex ! {call, self(), Msg},
            +call_port(Msg) ->
            +  complex ! {call, self(), Msg},
               receive
            -    {complex, Result} ->
            +    {complex, Result} ->
                   Result
            -  end.

            The complex process does the following:

            • Encodes the message into a sequence of bytes.
            • Sends it to the port.
            • Waits for a reply.
            • Decodes the reply.
            • Sends it back to the caller:
            loop(Port) ->
            +  end.

            The complex process does the following:

            • Encodes the message into a sequence of bytes.
            • Sends it to the port.
            • Waits for a reply.
            • Decodes the reply.
            • Sends it back to the caller:
            loop(Port) ->
               receive
            -    {call, Caller, Msg} ->
            -      Port ! {self(), {command, encode(Msg)}},
            +    {call, Caller, Msg} ->
            +      Port ! {self(), {command, encode(Msg)}},
                   receive
            -        {Port, {data, Data}} ->
            -          Caller ! {complex, decode(Data)}
            +        {Port, {data, Data}} ->
            +          Caller ! {complex, decode(Data)}
                   end,
            -      loop(Port)
            +      loop(Port)
               end.

            Assuming that both the arguments and the results from the C functions are less than 256, a simple encoding/decoding scheme is employed. In this scheme, foo is represented by byte 1, bar is represented by 2, and the argument/result is -represented by a single byte as well:

            encode({foo, X}) -> [1, X];
            -encode({bar, Y}) -> [2, Y].
            +represented by a single byte as well:

            encode({foo, X}) -> [1, X];
            +encode({bar, Y}) -> [2, Y].
             
            -decode([Int]) -> Int.

            The resulting Erlang program, including functionality for stopping the port and -detecting port failures, is as follows:

            -module(complex1).
            --export([start/1, stop/0, init/1]).
            --export([foo/1, bar/1]).
            -
            -start(ExtPrg) ->
            -    spawn(?MODULE, init, [ExtPrg]).
            -stop() ->
            +decode([Int]) -> Int.

            The resulting Erlang program, including functionality for stopping the port and +detecting port failures, is as follows:

            -module(complex1).
            +-export([start/1, stop/0, init/1]).
            +-export([foo/1, bar/1]).
            +
            +start(ExtPrg) ->
            +    spawn(?MODULE, init, [ExtPrg]).
            +stop() ->
                 complex ! stop.
             
            -foo(X) ->
            -    call_port({foo, X}).
            -bar(Y) ->
            -    call_port({bar, Y}).
            +foo(X) ->
            +    call_port({foo, X}).
            +bar(Y) ->
            +    call_port({bar, Y}).
             
            -call_port(Msg) ->
            -    complex ! {call, self(), Msg},
            +call_port(Msg) ->
            +    complex ! {call, self(), Msg},
                 receive
            -	{complex, Result} ->
            +	{complex, Result} ->
             	    Result
                 end.
             
            -init(ExtPrg) ->
            -    register(complex, self()),
            -    process_flag(trap_exit, true),
            -    Port = open_port({spawn, ExtPrg}, [{packet, 2}]),
            -    loop(Port).
            +init(ExtPrg) ->
            +    register(complex, self()),
            +    process_flag(trap_exit, true),
            +    Port = open_port({spawn, ExtPrg}, [{packet, 2}]),
            +    loop(Port).
             
            -loop(Port) ->
            +loop(Port) ->
                 receive
            -	{call, Caller, Msg} ->
            -	    Port ! {self(), {command, encode(Msg)}},
            +	{call, Caller, Msg} ->
            +	    Port ! {self(), {command, encode(Msg)}},
             	    receive
            -		{Port, {data, Data}} ->
            -		    Caller ! {complex, decode(Data)}
            +		{Port, {data, Data}} ->
            +		    Caller ! {complex, decode(Data)}
             	    end,
            -	    loop(Port);
            +	    loop(Port);
             	stop ->
            -	    Port ! {self(), close},
            +	    Port ! {self(), close},
             	    receive
            -		{Port, closed} ->
            -		    exit(normal)
            +		{Port, closed} ->
            +		    exit(normal)
             	    end;
            -	{'EXIT', Port, Reason} ->
            -	    exit(port_terminated)
            +	{'EXIT', Port, Reason} ->
            +	    exit(port_terminated)
                 end.
             
            -encode({foo, X}) -> [1, X];
            -encode({bar, Y}) -> [2, Y].
            +encode({foo, X}) -> [1, X];
            +encode({bar, Y}) -> [2, Y].
             
            -decode([Int]) -> Int.

            +decode([Int]) -> Int.

            @@ -255,55 +255,55 @@ typedef unsigned char byte; -int read_exact(byte *buf, int len) -{ +int read_exact(byte *buf, int len) +{ int i, got=0; - do { - if ((i = read(0, buf+got, len-got)) <= 0){ - return(i); - } + do { + if ((i = read(0, buf+got, len-got)) <= 0){ + return(i); + } got += i; - } while (got<len); + } while (got<len); - return(len); -} + return(len); +} -int write_exact(byte *buf, int len) -{ +int write_exact(byte *buf, int len) +{ int i, wrote = 0; - do { - if ((i = write(1, buf+wrote, len-wrote)) <= 0) - return (i); + do { + if ((i = write(1, buf+wrote, len-wrote)) <= 0) + return (i); wrote += i; - } while (wrote<len); + } while (wrote<len); - return (len); -} + return (len); /usr/share/doc/packages/erlang-doc/doc/system/c_portdriver.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/c_portdriver.html 2025-05-10 20:18:57.757087541 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/c_portdriver.html 2025-05-10 20:18:57.753087504 +0000 @@ -155,104 +155,104 @@ argument.

            The port is then created using the BIF open_port/2, with the tuple {spawn, DriverName} as the first argument. The string SharedLib is the name of the port driver. The second argument is a list of options, none in this -case:

            -module(complex5).
            --export([start/1, init/1]).
            +case:

            -module(complex5).
            +-export([start/1, init/1]).
             
            -start(SharedLib) ->
            -    case erl_ddll:load_driver(".", SharedLib) of
            +start(SharedLib) ->
            +    case erl_ddll:load_driver(".", SharedLib) of
                     ok -> ok;
            -        {error, already_loaded} -> ok;
            -        _ -> exit({error, could_not_load_driver})
            +        {error, already_loaded} -> ok;
            +        _ -> exit({error, could_not_load_driver})
                 end,
            -    spawn(?MODULE, init, [SharedLib]).
            +    spawn(?MODULE, init, [SharedLib]).
             
            -init(SharedLib) ->
            -  register(complex, self()),
            -  Port = open_port({spawn, SharedLib}, []),
            -  loop(Port).

            Now complex5:foo/1 and complex5:bar/1 can be implemented. Both send a -message to the complex process and receive the following reply:

            foo(X) ->
            -    call_port({foo, X}).
            -bar(Y) ->
            -    call_port({bar, Y}).
            +init(SharedLib) ->
            +  register(complex, self()),
            +  Port = open_port({spawn, SharedLib}, []),
            +  loop(Port).

            Now complex5:foo/1 and complex5:bar/1 can be implemented. Both send a +message to the complex process and receive the following reply:

            foo(X) ->
            +    call_port({foo, X}).
            +bar(Y) ->
            +    call_port({bar, Y}).
             
            -call_port(Msg) ->
            -    complex ! {call, self(), Msg},
            +call_port(Msg) ->
            +    complex ! {call, self(), Msg},
                 receive
            -        {complex, Result} ->
            +        {complex, Result} ->
                         Result
            -    end.

            The complex process performs the following:

            • Encodes the message into a sequence of bytes.
            • Sends it to the port.
            • Waits for a reply.
            • Decodes the reply.
            • Sends it back to the caller:
            loop(Port) ->
            +    end.

            The complex process performs the following:

            • Encodes the message into a sequence of bytes.
            • Sends it to the port.
            • Waits for a reply.
            • Decodes the reply.
            • Sends it back to the caller:
            loop(Port) ->
                 receive
            -        {call, Caller, Msg} ->
            -            Port ! {self(), {command, encode(Msg)}},
            +        {call, Caller, Msg} ->
            +            Port ! {self(), {command, encode(Msg)}},
                         receive
            -                {Port, {data, Data}} ->
            -                    Caller ! {complex, decode(Data)}
            +                {Port, {data, Data}} ->
            +                    Caller ! {complex, decode(Data)}
                         end,
            -            loop(Port)
            +            loop(Port)
                 end.

            Assuming that both the arguments and the results from the C functions are less than 256, a simple encoding/decoding scheme is employed. In this scheme, foo is represented by byte 1, bar is represented by 2, and the argument/result is -represented by a single byte as well:

            encode({foo, X}) -> [1, X];
            -encode({bar, Y}) -> [2, Y].
            +represented by a single byte as well:

            encode({foo, X}) -> [1, X];
            +encode({bar, Y}) -> [2, Y].
             
            -decode([Int]) -> Int.

            The resulting Erlang program, including functions for stopping the port and +decode([Int]) -> Int.

            The resulting Erlang program, including functions for stopping the port and detecting port failures, is as follows:

            
            --module(complex5).
            --export([start/1, stop/0, init/1]).
            --export([foo/1, bar/1]).
            +-module(complex5).
            +-export([start/1, stop/0, init/1]).
            +-export([foo/1, bar/1]).
             
            -start(SharedLib) ->
            -    case erl_ddll:load_driver(".", SharedLib) of
            +start(SharedLib) ->
            +    case erl_ddll:load_driver(".", SharedLib) of
             	ok -> ok;
            -	{error, already_loaded} -> ok;
            -	_ -> exit({error, could_not_load_driver})
            +	{error, already_loaded} -> ok;
            +	_ -> exit({error, could_not_load_driver})
                 end,
            -    spawn(?MODULE, init, [SharedLib]).
            +    spawn(?MODULE, init, [SharedLib]).
             
            -init(SharedLib) ->
            -    register(complex, self()),
            -    Port = open_port({spawn, SharedLib}, []),
            -    loop(Port).
            +init(SharedLib) ->
            +    register(complex, self()),
            +    Port = open_port({spawn, SharedLib}, []),
            +    loop(Port).
             
            -stop() ->
            +stop() ->
                 complex ! stop.
             
            -foo(X) ->
            -    call_port({foo, X}).
            -bar(Y) ->
            -    call_port({bar, Y}).
            +foo(X) ->
            +    call_port({foo, X}).
            +bar(Y) ->
            +    call_port({bar, Y}).
             
            -call_port(Msg) ->
            -    complex ! {call, self(), Msg},
            +call_port(Msg) ->
            +    complex ! {call, self(), Msg},
                 receive
            -	{complex, Result} ->
            +	{complex, Result} ->
             	    Result
                 end.
             
            -loop(Port) ->
            +loop(Port) ->
                 receive
            -	{call, Caller, Msg} ->
            -	    Port ! {self(), {command, encode(Msg)}},
            +	{call, Caller, Msg} ->
            +	    Port ! {self(), {command, encode(Msg)}},
             	    receive
            -		{Port, {data, Data}} ->
            -		    Caller ! {complex, decode(Data)}
            +		{Port, {data, Data}} ->
            +		    Caller ! {complex, decode(Data)}
             	    end,
            -	    loop(Port);
            +	    loop(Port);
             	stop ->
            -	    Port ! {self(), close},
            +	    Port ! {self(), close},
             	    receive
            -		{Port, closed} ->
            -		    exit(normal)
            +		{Port, closed} ->
            +		    exit(normal)
             	    end;
            -	{'EXIT', Port, Reason} ->
            -	    io:format("~p ~n", [Reason]),
            -	    exit(port_terminated)
            +	{'EXIT', Port, Reason} ->
            +	    io:format("~p ~n", [Reason]),
            +	    exit(port_terminated)
                 end.
             
            -encode({foo, X}) -> [1, X];
            -encode({bar, Y}) -> [2, Y].
            +encode({foo, X}) -> [1, X];
            +encode({bar, Y}) -> [2, Y].
             
            -decode([Int]) -> Int.

            +decode([Int]) -> Int.

            @@ -277,36 +277,36 @@ #include <stdio.h> #include "erl_driver.h" -typedef struct { +typedef struct { ErlDrvPort port; -} example_data; +} example_data; -static ErlDrvData example_drv_start(ErlDrvPort port, char *buff) -{ - example_data* d = (example_data*)driver_alloc(sizeof(example_data)); +static ErlDrvData example_drv_start(ErlDrvPort port, char *buff) +{ + example_data* d = (example_data*)driver_alloc(sizeof(example_data)); d->port = port; - return (ErlDrvData)d; -} + return (ErlDrvData)d; +} -static void example_drv_stop(ErlDrvData handle) -{ - driver_free((char*)handle); -} - -static void example_drv_output(ErlDrvData handle, char *buff, - ErlDrvSizeT bufflen) -{ - example_data* d = (example_data*)handle; /usr/share/doc/packages/erlang-doc/doc/system/character_set.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/character_set.html 2025-05-10 20:18:57.777087722 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/character_set.html 2025-05-10 20:18:57.781087758 +0000 @@ -190,7 +190,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/doc/system/cnode.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/system/cnode.html 2025-05-10 20:18:57.797087902 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/cnode.html 2025-05-10 20:18:57.801087940 +0000 @@ -168,7 +168,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/doc/system/code_loading.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/code_loading.html 2025-05-10 20:18:57.821088121 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/code_loading.html 2025-05-10 20:18:57.825088157 +0000 @@ -126,8 +126,8 @@

            Erlang programs must be compiled to object code. The compiler can generate a new file that contains the object code. The current abstract machine, which runs the object code, is called BEAM, therefore the object files get the suffix -.beam. The compiler can also generate a binary which can be loaded directly.

            The compiler is located in the module compile in Compiler.

            compile:file(Module)
            -compile:file(Module, Options)

            The Erlang shell understands the command c(Module), which both compiles and +.beam. The compiler can also generate a binary which can be loaded directly.

            The compiler is located in the module compile in Compiler.

            compile:file(Module)
            +compile:file(Module, Options)

            The Erlang shell understands the command c(Module), which both compiles and loads Module.

            There is also a module make, which provides a set of functions similar to the UNIX type Make functions, see module make in Tools.

            The compiler can also be accessed from the OS prompt using the erl executable in ERTS.

            % erl -compile Module1...ModuleN
            @@ -160,16 +160,16 @@
             evaluated because of processes lingering in the old code.

            If a third instance of the module is loaded, the code server removes (purges) the old code and any processes lingering in it is terminated. Then the third instance becomes 'current' and the previously current code becomes 'old'.

            To change from old code to current code, a process must make a fully qualified -function call.

            Example:

            -module(m).
            --export([loop/0]).
            +function call.

            Example:

            -module(m).
            +-export([loop/0]).
             
            -loop() ->
            +loop() ->
                 receive
                     code_switch ->
            -            m:loop();
            +            m:loop();
                     Msg ->
                         ...
            -            loop()
            +            loop()
                 end.

            To make the process change code, send the message code_switch to it. The process then makes a fully qualified call to m:loop() and changes to current code. Notice that m:loop/0 must be exported.

            For code replacement of funs to work, use the syntax @@ -180,7 +180,7 @@ Running a Function When a Module is Loaded

            The -on_load() directive names a function that is to be run automatically when -a module is loaded.

            Its syntax is as follows:

            -on_load(Name/0).

            It is not necessary to export the function. It is called in a freshly spawned +a module is loaded.

            Its syntax is as follows:

            -on_load(Name/0).

            It is not necessary to export the function. It is called in a freshly spawned process (which terminates as soon as the function returns).

            The function must return ok if the module is to become the new current code for the module and become callable.

            Returning any other value or generating an exception causes the new code to be unloaded. If the return value is not an atom, a warning error report is sent to @@ -193,13 +193,13 @@ code would become old, essentially leaving the system without any working and reachable instance of the module.

            In embedded mode, first all modules are loaded. Then all on_load functions are called. The system is terminated unless all of the on_load functions return -ok.

            Example:

            -module(m).
            --on_load(load_my_nifs/0).
            +ok.

            Example:

            -module(m).
            +-on_load(load_my_nifs/0).
             
            -load_my_nifs() ->
            +load_my_nifs() ->
                 NifPath = ...,    %Set up the path to the NIF library.
                 Info = ...,       %Initialize the Info term
            -    erlang:load_nif(NifPath, Info).

            If the call to erlang:load_nif/2 fails, the module is unloaded and a warning + erlang:load_nif(NifPath, Info).

            If the call to erlang:load_nif/2 fails, the module is unloaded and a warning report is sent to the error loader.

            @@ -251,7 +251,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/doc/system/commoncaveats.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/commoncaveats.html 2025-05-10 20:18:57.845088338 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/commoncaveats.html 2025-05-10 20:18:57.853088411 +0000 @@ -122,23 +122,23 @@ Operator ++

            The ++ operator copies its left-hand side operand. That is clearly -seen if we do our own implementation in Erlang:

            my_plus_plus([H|T], Tail) ->
            -    [H|my_plus_plus(T, Tail)];
            -my_plus_plus([], Tail) ->
            -    Tail.

            We must be careful how we use ++ in a loop. First is how not to use it:

            DO NOT

            naive_reverse([H|T]) ->
            -    naive_reverse(T) ++ [H];
            -naive_reverse([]) ->
            -    [].

            As the ++ operator copies its left-hand side operand, the growing -result is copied repeatedly, leading to quadratic complexity.

            On the other hand, using ++ in loop like this is perfectly fine:

            OK

            naive_but_ok_reverse(List) ->
            -    naive_but_ok_reverse(List, []).
            -
            -naive_but_ok_reverse([H|T], Acc) ->
            -    naive_but_ok_reverse(T, [H] ++ Acc);
            -naive_but_ok_reverse([], Acc) ->
            +seen if we do our own implementation in Erlang:

            my_plus_plus([H|T], Tail) ->
            +    [H|my_plus_plus(T, Tail)];
            +my_plus_plus([], Tail) ->
            +    Tail.

            We must be careful how we use ++ in a loop. First is how not to use it:

            DO NOT

            naive_reverse([H|T]) ->
            +    naive_reverse(T) ++ [H];
            +naive_reverse([]) ->
            +    [].

            As the ++ operator copies its left-hand side operand, the growing +result is copied repeatedly, leading to quadratic complexity.

            On the other hand, using ++ in loop like this is perfectly fine:

            OK

            naive_but_ok_reverse(List) ->
            +    naive_but_ok_reverse(List, []).
            +
            +naive_but_ok_reverse([H|T], Acc) ->
            +    naive_but_ok_reverse(T, [H] ++ Acc);
            +naive_but_ok_reverse([], Acc) ->
                 Acc.

            Each list element is copied only once. The growing result Acc is the right-hand -side operand, which it is not copied.

            Experienced Erlang programmers would probably write as follows:

            DO

            vanilla_reverse([H|T], Acc) ->
            -    vanilla_reverse(T, [H|Acc]);
            -vanilla_reverse([], Acc) ->
            +side operand, which it is not copied.

            Experienced Erlang programmers would probably write as follows:

            DO

            vanilla_reverse([H|T], Acc) ->
            +    vanilla_reverse(T, [H|Acc]);
            +vanilla_reverse([], Acc) ->
                 Acc.

            In principle, this is slightly more efficient because the list element [H] is not built before being copied and discarded. In practice, the compiler rewrites [H] ++ Acc to [H|Acc].

            @@ -164,41 +164,41 @@ Accidental Copying and Loss of Sharing

            When spawning a new process using a fun, one can accidentally copy more data to -the process than intended. For example:

            DO NOT

            accidental1(State) ->
            -    spawn(fun() ->
            -                  io:format("~p\n", [State#state.info])
            -          end).

            The code in the fun will extract one element from the record and print it. The +the process than intended. For example:

            DO NOT

            accidental1(State) ->
            +    spawn(fun() ->
            +                  io:format("~p\n", [State#state.info])
            +          end).

            The code in the fun will extract one element from the record and print it. The rest of the state record is not used. However, when the spawn/1 -function is executed, the entire record is copied to the newly created process.

            The same kind of problem can happen with a map:

            DO NOT

            accidental2(State) ->
            -    spawn(fun() ->
            -                  io:format("~p\n", [map_get(info, State)])
            -          end).

            In the following example (part of a module implementing the gen_server -behavior) the created fun is sent to another process:

            DO NOT

            handle_call(give_me_a_fun, _From, State) ->
            -    Fun = fun() -> State#href_anchor"ss">state.size =:= 42 end,
            -    {reply, Fun, State}.

            How bad that unnecessary copy is depends on the contents of the record or the -map.

            For example, if the state record is initialized like this:

            init1() ->
            -    #state{data=lists:seq(1, 10000)}.

            a list with 10000 elements (or about 20000 heap words) will be copied to the +function is executed, the entire record is copied to the newly created process.

            The same kind of problem can happen with a map:

            DO NOT

            accidental2(State) ->
            +    spawn(fun() ->
            +                  io:format("~p\n", [map_get(info, State)])
            +          end).

            In the following example (part of a module implementing the gen_server +behavior) the created fun is sent to another process:

            DO NOT

            handle_call(give_me_a_fun, _From, State) ->
            +    Fun = fun() -> State#href_anchor"ss">state.size =:= 42 end,
            +    {reply, Fun, State}.

            How bad that unnecessary copy is depends on the contents of the record or the +map.

            For example, if the state record is initialized like this:

            init1() ->
            +    #state{data=lists:seq(1, 10000)}.

            a list with 10000 elements (or about 20000 heap words) will be copied to the newly created process.

            An unnecessary copy of 10000 element list can be bad enough, but it can get even worse if the state record contains shared subterms. Here is a simple example -of a term with a shared subterm:

            {SubTerm, SubTerm}

            When a term is copied to another process, sharing of subterms will be lost and -the copied term can be many times larger than the original term. For example:

            init2() ->
            -    SharedSubTerms = lists:foldl(fun(_, A) -> [A|A] end, [0], lists:seq(1, 15)),
            -    #state{data=Shared}.

            In the process that calls init2/0, the size of the data field in the state +of a term with a shared subterm:

            {SubTerm, SubTerm}

            When a term is copied to another process, sharing of subterms will be lost and +the copied term can be many times larger than the original term. For example:

            init2() ->
            +    SharedSubTerms = lists:foldl(fun(_, A) -> [A|A] end, [0], lists:seq(1, 15)),
            +    #state{data=Shared}.

            In the process that calls init2/0, the size of the data field in the state record will be 32 heap words. When the record is copied to the newly created process, sharing will be lost and the size of the copied data field will be 131070 heap words. More details about loss off sharing are found in a later section.

            To avoid the problem, outside of the fun extract only the fields of the record -that are actually used:

            DO

            fixed_accidental1(State) ->
            +that are actually used:

            DO

            fixed_accidental1(State) ->
                 Info = State#state.info,
            -    spawn(fun() ->
            -                  io:format("~p\n", [Info])
            -          end).

            Similarly, outside of the fun extract only the map elements that are actually -used:

            DO

            fixed_accidental2(State) ->
            -    Info = map_get(info, State),
            -    spawn(fun() ->
            -                  io:format("~p\n", [Info])
            -          end).

            + spawn(fun() -> + io:format("~p\n", [Info]) + end).

            Similarly, outside of the fun extract only the map elements that are actually +used:

            DO

            fixed_accidental2(State) ->
            +    Info = map_get(info, State),
            +    spawn(fun() ->
            +                  io:format("~p\n", [Info])
            +          end).

            @@ -213,7 +213,7 @@ to guard against a denial-of-service attack. (All atoms that are allowed must have been created earlier, for example, by using all of them in a module and loading that module.)

            Using list_to_atom/1 to construct an atom that -is passed to apply/3 is quite expensive.

            DO NOT

            apply(list_to_atom("some_prefix"++Var), foo, Args)

            +is passed to apply/3 is quite expensive.

            DO NOT

            apply(list_to_atom("some_prefix"++Var), foo, Args)

            @@ -225,8 +225,8 @@ execute in constant time.

            Normally, there is no need to worry about the speed of length/1, because it is efficiently implemented in C. In time-critical code, you might want to avoid it if the input list could potentially be very long.

            Some uses of length/1 can be replaced by matching. For example, -the following code:

            foo(L) when length(L) >= 3 ->
            -    ...

            can be rewritten to:

            foo([_,_,_|_]=L) ->
            +the following code:

            foo(L) when length(L) >= 3 ->
            +    ...

            can be rewritten to:

            foo([_,_,_|_]=L) ->
                ...

            One slight difference is that length(L) fails if L is an improper list, while the pattern in the second code fragment accepts an improper list.

            @@ -242,10 +242,10 @@ as if the tuple was copied, the call to setelement/3 is replaced with a special destructive setelement instruction. In the following code sequence, the first setelement/3 call copies the tuple -and modifies the ninth element:

            multiple_setelement(T0) when tuple_size(T0) =:= 9 ->
            -    T1 = setelement(9, T0, bar),
            -    T2 = setelement(7, T1, foobar),
            -    setelement(5, T2, new_value).

            The two following setelement/3 calls modify the tuple in +and modifies the ninth element:

            multiple_setelement(T0) when tuple_size(T0) =:= 9 ->
            +    T1 = setelement(9, T0, bar),
            +    T2 = setelement(7, T1, foobar),
            +    setelement(5, T2, new_value).

            The two following setelement/3 calls modify the tuple in place.

            For the optimization to be applied, all the following conditions must be true:

            • The tuple argument must be known to be a tuple of a known size.
            • The indices must be integer literals, not variables or expressions.
            • The indices must be given in descending order.
            • There must be no calls to another function in between the calls to setelement/3.
            • The tuple returned from one setelement/3 call must only be used in the subsequent call to setelement/3.

            If the code cannot be structured as in the multiple_setelement/1 example, the @@ -321,7 +321,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/doc/system/conc_prog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/conc_prog.html 2025-05-10 20:18:57.893088774 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/conc_prog.html 2025-05-10 20:18:57.913088954 +0000 @@ -136,21 +136,21 @@ Threads of execution in Erlang share no data, that is why they are called processes).

            The Erlang BIF spawn is used to create a new process: spawn(Module, Exported_Function, List of Arguments). Consider the following -module:

            -module(tut14).
            +module:

            -module(tut14).
             
            --export([start/0, say_something/2]).
            +-export([start/0, say_something/2]).
             
            -say_something(What, 0) ->
            +say_something(What, 0) ->
                 done;
            -say_something(What, Times) ->
            -    io:format("~p~n", [What]),
            -    say_something(What, Times - 1).
            -
            -start() ->
            -    spawn(tut14, say_something, [hello, 3]),
            -    spawn(tut14, say_something, [goodbye, 3]).
            5> c(tut14).
            -{ok,tut14}
            -6> tut14:say_something(hello, 3).
            +say_something(What, Times) ->
            +    io:format("~p~n", [What]),
            +    say_something(What, Times - 1).
            +
            +start() ->
            +    spawn(tut14, say_something, [hello, 3]),
            +    spawn(tut14, say_something, [goodbye, 3]).
            5> c(tut14).
            +{ok,tut14}
            +6> tut14:say_something(hello, 3).
             hello
             hello
             hello
            @@ -159,7 +159,7 @@
             processes, one that writes "hello" three times and one that writes "goodbye"
             three times. Both processes use the function say_something. Notice that a
             function used in this way by spawn, to start a process, must be exported from
            -the module (that is, in the -export at the start of the module).

            9> tut14:start().
            +the module (that is, in the -export at the start of the module).

            9> tut14:start().
             hello
             goodbye
             <0.63.0>
            @@ -170,7 +170,7 @@
             Instead, the first process wrote a "hello", the second a "goodbye", the first
             another "hello" and so forth. But where did the <0.63.0> come from? The return
             value of a function is the return value of the last "thing" in the function. The
            -last thing in the function start is

            spawn(tut14, say_something, [goodbye, 3]).

            spawn returns a process identifier, or pid, which uniquely identifies the +last thing in the function start is

            spawn(tut14, say_something, [goodbye, 3]).

            spawn returns a process identifier, or pid, which uniquely identifies the process. So <0.63.0> is the pid of the spawn function call above. The next example shows how to use pids.

            Notice also that ~p is used instead of ~w in io:format/2. To quote the manual:

            ~p Writes the data with standard syntax in the same way as ~w, but breaks terms whose printed representation is longer than one line into many lines and indents @@ -182,37 +182,37 @@ Message Passing

            In the following example two processes are created and they send messages to -each other a number of times.

            -module(tut15).
            +each other a number of times.

            -module(tut15).
             
            --export([start/0, ping/2, pong/0]).
            +-export([start/0, ping/2, pong/0]).
             
            -ping(0, Pong_PID) ->
            +ping(0, Pong_PID) ->
                 Pong_PID ! finished,
            -    io:format("ping finished~n", []);
            +    io:format("ping finished~n", []);
             
            -ping(N, Pong_PID) ->
            -    Pong_PID ! {ping, self()},
            +ping(N, Pong_PID) ->
            +    Pong_PID ! {ping, self()},
                 receive
                     pong ->
            -            io:format("Ping received pong~n", [])
            +            io:format("Ping received pong~n", [])
                 end,
            -    ping(N - 1, Pong_PID).
            +    ping(N - 1, Pong_PID).
             
            -pong() ->
            +pong() ->
                 receive
                     finished ->
            -            io:format("Pong finished~n", []);
            -        {ping, Ping_PID} ->
            -            io:format("Pong received ping~n", []),
            +            io:format("Pong finished~n", []);
            +        {ping, Ping_PID} ->
            +            io:format("Pong received ping~n", []),
                         Ping_PID ! pong,
            -            pong()
            +            pong()
                 end.
             
            -start() ->
            -    Pong_PID = spawn(tut15, pong, []),
            -    spawn(tut15, ping, [3, Pong_PID]).
            1> c(tut15).
            -{ok,tut15}
            -2> tut15: start().
            +start() ->
            +    Pong_PID = spawn(tut15, pong, []),
            +    spawn(tut15, ping, [3, Pong_PID]).
            1> c(tut15).
            +{ok,tut15}
            +2> tut15: start().
             <0.36.0>
             Pong received ping
             Ping received pong
            @@ -221,14 +221,14 @@
             Pong received ping
             Ping received pong
             ping finished
            -Pong finished

            The function start first creates a process, let us call it "pong":

            Pong_PID = spawn(tut15, pong, [])

            This process executes tut15:pong(). Pong_PID is the process identity of the -"pong" process. The function start now creates another process "ping":

            spawn(tut15, ping, [3, Pong_PID]),

            This process executes:

            tut15:ping(3, Pong_PID)

            <0.36.0> is the return value from the start function.

            The process "pong" now does:

            receive
            +Pong finished

            The function start first creates a process, let us call it "pong":

            Pong_PID = spawn(tut15, pong, [])

            This process executes tut15:pong(). Pong_PID is the process identity of the +"pong" process. The function start now creates another process "ping":

            spawn(tut15, ping, [3, Pong_PID]),

            This process executes:

            tut15:ping(3, Pong_PID)

            <0.36.0> is the return value from the start function.

            The process "pong" now does:

            receive
                 finished ->
            -        io:format("Pong finished~n", []);
            -    {ping, Ping_PID} ->
            -        io:format("Pong received ping~n", []),
            +        io:format("Pong finished~n", []);
            +    {ping, Ping_PID} ->
            +        io:format("Pong received ping~n", []),
                     Ping_PID ! pong,
            -        pong()
            +        pong()
             end.

            The receive construct is used to allow processes to wait for messages from other processes. It has the following format:

            receive
                pattern1 ->
            @@ -257,21 +257,21 @@
             procedure is repeated.

            The Erlang implementation is "clever" and minimizes the number of times each message is tested against the patterns in each receive.

            Now back to the ping pong example.

            "Pong" is waiting for messages. If the atom finished is received, "pong" writes "Pong finished" to the output and, as it has nothing more to do, -terminates. If it receives a message with the format:

            {ping, Ping_PID}

            it writes "Pong received ping" to the output and sends the atom pong to the +terminates. If it receives a message with the format:

            {ping, Ping_PID}

            it writes "Pong received ping" to the output and sends the atom pong to the process "ping":

            Ping_PID ! pong

            Notice how the operator "!" is used to send messages. The syntax of "!" is:

            Pid ! Message

            That is, Message (any Erlang term) is sent to the process with identity Pid.

            After sending the message pong to the process "ping", "pong" calls the pong function again, which causes it to get back to the receive again and wait for -another message.

            Now let us look at the process "ping". Recall that it was started by executing:

            tut15:ping(3, Pong_PID)

            Looking at the function ping/2, the second clause of ping/2 is executed +another message.

            Now let us look at the process "ping". Recall that it was started by executing:

            tut15:ping(3, Pong_PID)

            Looking at the function ping/2, the second clause of ping/2 is executed since the value of the first argument is 3 (not 0) (first clause head is -ping(0,Pong_PID), second clause head is ping(N,Pong_PID), so N becomes 3).

            The second clause sends a message to "pong":

            Pong_PID ! {ping, self()},

            self/0 returns the pid of the process that executes self/0, in this case the +ping(0,Pong_PID), second clause head is ping(N,Pong_PID), so N becomes 3).

            The second clause sends a message to "pong":

            Pong_PID ! {ping, self()},

            self/0 returns the pid of the process that executes self/0, in this case the pid of "ping". (Recall the code for "pong", this lands up in the variable Ping_PID in the receive previously explained.)

            "Ping" now waits for a reply from "pong":

            receive
                 pong ->
            -        io:format("Ping received pong~n", [])
            +        io:format("Ping received pong~n", [])
             end,

            It writes "Ping received pong" when this reply arrives, after which "ping" calls -the ping function again.

            ping(N - 1, Pong_PID)

            N-1 causes the first argument to be decremented until it becomes 0. When this -occurs, the first clause of ping/2 is executed:

            ping(0, Pong_PID) ->
            +the ping function again.

            ping(N - 1, Pong_PID)

            N-1 causes the first argument to be decremented until it becomes 0. When this +occurs, the first clause of ping/2 is executed:

            ping(0, Pong_PID) ->
                 Pong_PID !  finished,
            -    io:format("ping finished~n", []);

            The atom finished is sent to "pong" (causing it to terminate as described + io:format("ping finished~n", []);

            The atom finished is sent to "pong" (causing it to terminate as described above) and "ping finished" is written to the output. "Ping" then terminates as it has nothing left to do.

            @@ -285,38 +285,38 @@ processes which need to know each other's identities are started independently of each other. Erlang thus provides a mechanism for processes to be given names so that these names can be used as identities instead of pids. This is done by -using the register BIF:

            register(some_atom, Pid)

            Let us now rewrite the ping pong example using this and give the name pong to -the "pong" process:

            -module(tut16).
            +using the register BIF:

            register(some_atom, Pid)

            Let us now rewrite the ping pong example using this and give the name pong to +the "pong" process:

            -module(tut16).
             
            --export([start/0, ping/1, pong/0]).
            +-export([start/0, ping/1, pong/0]).
             
            -ping(0) ->
            +ping(0) ->
                 pong ! finished,
            -    io:format("ping finished~n", []);
            +    io:format("ping finished~n", []);
             
            -ping(N) ->
            -    pong ! {ping, self()},
            +ping(N) ->
            +    pong ! {ping, self()},
                 receive
                     pong ->
            -            io:format("Ping received pong~n", [])
            +            io:format("Ping received pong~n", [])
                 end,
            -    ping(N - 1).
            +    ping(N - 1).
             
            -pong() ->
            +pong() ->
                 receive
                     finished ->
            -            io:format("Pong finished~n", []);
            -        {ping, Ping_PID} ->
            -            io:format("Pong received ping~n", []),
            +            io:format("Pong finished~n", []);
            +        {ping, Ping_PID} ->
            +            io:format("Pong received ping~n", []),
            /usr/share/doc/packages/erlang-doc/doc/system/create_target.html differs (HTML document, UTF-8 Unicode text, with very long lines)
            --- old//usr/share/doc/packages/erlang-doc/doc/system/create_target.html	2025-05-10 20:18:57.949089281 +0000
            +++ new//usr/share/doc/packages/erlang-doc/doc/system/create_target.html	2025-05-10 20:18:57.965089426 +0000
            @@ -142,13 +142,13 @@
             SASL), which specifies the ERTS version and lists all applications that are to
             be included in the new basic target system. An example is the following
             mysystem.rel file:

            %% mysystem.rel
            -{release,
            - {"MYSYSTEM", "FIRST"},
            - {erts, "5.10.4"},
            - [{kernel, "2.16.4"},
            -  {stdlib, "1.19.4"},
            -  {sasl, "2.3.4"},
            -  {pea, "1.0"}]}.

            The listed applications are not only original Erlang/OTP applications but +{release, + {"MYSYSTEM", "FIRST"}, + {erts, "5.10.4"}, + [{kernel, "2.16.4"}, + {stdlib, "1.19.4"}, + {sasl, "2.3.4"}, + {pea, "1.0"}]}.

            The listed applications are not only original Erlang/OTP applications but possibly also new applications that you have written (here exemplified by the application Pea (pea)).

            Step 2. Start Erlang/OTP from the directory where the mysystem.rel file resides:

            % erl -pa /home/user/target_system/myapps/pea-1.0/ebin

            The -pa argument prepends the path to the ebin directory for @@ -246,17 +246,17 @@

            In this example the Pea application has been changed, and so are the applications ERTS, Kernel, STDLIB and SASL.

            Step 1. Create the file .rel:

            %% mysystem2.rel
            -{release,
            - {"MYSYSTEM", "SECOND"},
            - {erts, "6.0"},
            - [{kernel, "3.0"},
            -  {stdlib, "2.0"},
            -  {sasl, "2.4"},
            -  {pea, "2.0"}]}.

            Step 2. Create the application upgrade file (see +{release, + {"MYSYSTEM", "SECOND"}, + {erts, "6.0"}, + [{kernel, "3.0"}, + {stdlib, "2.0"}, + {sasl, "2.4"}, + {pea, "2.0"}]}.

            Step 2. Create the application upgrade file (see appup in SASL) for Pea, for example:

            %% pea.appup
            -{"2.0",
            - [{"1.0",[{load_module,pea_lib}]}],
            - [{"1.0",[{load_module,pea_lib}]}]}.

            Step 3. From the directory where the file mysystem2.rel resides, start the +{"2.0", + [{"1.0",[{load_module,pea_lib}]}], + [{"1.0",[{load_module,pea_lib}]}]}.

            Step 3. From the directory where the file mysystem2.rel resides, start the Erlang/OTP system, giving the path to the new version of Pea:

            % erl -pa /home/user/target_system/myapps/pea-2.0/ebin

            Step 4. Create the release upgrade file (see relup in SASL):

            1> systools:make_relup("mysystem2",["mysystem"],["mysystem"],
                 [{path,["/home/user/target_system/myapps/pea-1.0/ebin",
            @@ -296,21 +296,21 @@
             release_handler:install_release/1 means that the release_handler has
             restarted the node by using heart. This is always done when the upgrade
             involves a change of the applications ERTS, Kernel, STDLIB, or SASL. For more
            -information, see Upgrade when Erlang/OTP has Changed.

            The node is accessible through a new pipe:

            % /usr/local/erl-target/bin/to_erl /tmp/erlang.pipe.2

            List the available releases in the system:

            1> release_handler:which_releases().
            -[{"MYSYSTEM","SECOND",
            -  ["kernel-3.0","stdlib-2.0","sasl-2.4","pea-2.0"],
            -  current},
            - {"MYSYSTEM","FIRST",
            -  ["kernel-2.16.4","stdlib-1.19.4","sasl-2.3.4","pea-1.0"],
            -  permanent}]

            Our new release, "SECOND", is now the current release, but we can also see that +information, see Upgrade when Erlang/OTP has Changed.

            The node is accessible through a new pipe:

            % /usr/local/erl-target/bin/to_erl /tmp/erlang.pipe.2

            List the available releases in the system:

            1> release_handler:which_releases().
            +[{"MYSYSTEM","SECOND",
            +  ["kernel-3.0","stdlib-2.0","sasl-2.4","pea-2.0"],
            +  current},
            + {"MYSYSTEM","FIRST",
            +  ["kernel-2.16.4","stdlib-1.19.4","sasl-2.3.4","pea-1.0"],
            +  permanent}]

            Our new release, "SECOND", is now the current release, but we can also see that our "FIRST" release is still permanent. This means that if the node would be -restarted now, it would come up running the "FIRST" release again.

            Step 3. Make the new release permanent:

            2> release_handler:make_permanent("SECOND").

            Check the releases again:

            3> release_handler:which_releases().
            -[{"MYSYSTEM","SECOND",
            -  ["kernel-3.0","stdlib-2.0","sasl-2.4","pea-2.0"],
            -  permanent},
            - {"MYSYSTEM","FIRST",
            -  ["kernel-2.16.4","stdlib-1.19.4","sasl-2.3.4","pea-1.0"],
            -  old}]

            We see that the new release version is permanent, so it would be safe to +restarted now, it would come up running the "FIRST" release again.

            Step 3. Make the new release permanent:

            2> release_handler:make_permanent("SECOND").

            Check the releases again:

            3> release_handler:which_releases().
            +[{"MYSYSTEM","SECOND",
            +  ["kernel-3.0","stdlib-2.0","sasl-2.4","pea-2.0"],
            +  permanent},
            + {"MYSYSTEM","FIRST",
            +  ["kernel-2.16.4","stdlib-1.19.4","sasl-2.3.4","pea-1.0"],
            +  old}]

            We see that the new release version is permanent, so it would be safe to restart the node.

            @@ -319,8 +319,8 @@

            This module can also be found in the examples directory of the SASL application.

            
            --module(target_system).
            --export([create/1, create/2, install/2]).
            +-module(target_system).
            +-export([create/1, create/2, install/2]).
             
             %% Note: RelFileName below is the *stem* without trailing .rel,
             %% .script etc.
            @@ -328,176 +328,176 @@
             
             %% create(RelFileName)
             %%
            -create(RelFileName) ->
            -    create(RelFileName,[]).
            +create(RelFileName) ->
            +    create(RelFileName,[]).
             
            -create(RelFileName,SystoolsOpts) ->
            +create(RelFileName,SystoolsOpts) ->
                 RelFile = RelFileName ++ ".rel",
            -    Dir = filename:dirname(RelFileName),
            -    PlainRelFileName = filename:join(Dir,"plain"),
            +    Dir = filename:dirname(RelFileName),
            +    PlainRelFileName = filename:join(Dir,"plain"),
                 PlainRelFile = PlainRelFileName ++ ".rel",
            -    io:fwrite("Reading file: ~ts ...~n", [RelFile]),
            -    {ok, [RelSpec]} = file:consult(RelFile),
            -    io:fwrite("Creating file: ~ts from ~ts ...~n",
            -              [PlainRelFile, RelFile]),
            -    {release,
            -     {RelName, RelVsn},
            -     {erts, ErtsVsn},
            -     AppVsns} = RelSpec,
            -    PlainRelSpec = {release,
            -                    {RelName, RelVsn},
            -                    {erts, ErtsVsn},
            -                    lists:filter(fun({kernel, _}) ->
            +    io:fwrite("Reading file: ~ts ...~n", [RelFile]),
            +    {ok, [RelSpec]} = file:consult(RelFile),
            +    io:fwrite("Creating file: ~ts from ~ts ...~n",
            +              [PlainRelFile, RelFile]),
            +    {release,
            +     {RelName, RelVsn},
            +     {erts, ErtsVsn},
            +     AppVsns} = RelSpec,
            +    PlainRelSpec = {release,
            +                    {RelName, RelVsn},
            +                    {erts, ErtsVsn},
            +                    lists:filter(fun({kernel, _}) ->
                                                      true;
            -                                    ({stdlib, _}) ->
            +                                    ({stdlib, _}) ->
                                                      true;
            -                                    (_) ->
            +                                    (_) ->
                                                      false
            -                                 end, AppVsns)
            -                   },
            -    {ok, Fd} = file:open(PlainRelFile, [write]),
            -    io:fwrite(Fd, "~p.~n", [PlainRelSpec]),
            -    file:close(Fd),
            -
            -    io:fwrite("Making \"~ts.script\" and \"~ts.boot\" files ...~n",
            -	      [PlainRelFileName,PlainRelFileName]),
            -    make_script(PlainRelFileName,SystoolsOpts),
            -
            -    io:fwrite("Making \"~ts.script\" and \"~ts.boot\" files ...~n",
            -              [RelFileName, RelFileName]),
            -    make_script(RelFileName,SystoolsOpts),
            +                                 end, AppVsns)
            +                   },
            +    {ok, Fd} = file:open(PlainRelFile, [write]),
            +    io:fwrite(Fd, "~p.~n", [PlainRelSpec]),
            +    file:close(Fd),
            +
            +    io:fwrite("Making \"~ts.script\" and \"~ts.boot\" files ...~n",
            +	      [PlainRelFileName,PlainRelFileName]),
            +    make_script(PlainRelFileName,SystoolsOpts),
            +
            +    io:fwrite("Making \"~ts.script\" and \"~ts.boot\" files ...~n",
            +              [RelFileName, RelFileName]),
            +    make_script(RelFileName,SystoolsOpts),
             
                 TarFileName = RelFileName ++ ".tar.gz",
            -    io:fwrite("Creating tar file ~ts ...~n", [TarFileName]),
            -    make_tar(RelFileName,SystoolsOpts),
            +    io:fwrite("Creating tar file ~ts ...~n", [TarFileName]),
            +    make_tar(RelFileName,SystoolsOpts),
             
            -    TmpDir = filename:join(Dir,"tmp"),
            -    io:fwrite("Creating directory ~tp ...~n",[TmpDir]),
            -    file:make_dir(TmpDir),
            -
            -    io:fwrite("Extracting ~ts into directory ~ts ...~n", [TarFileName,TmpDir]),
            -    extract_tar(TarFileName, TmpDir),
            -
            -    TmpBinDir = filename:join([TmpDir, "bin"]),
            -    ErtsBinDir = filename:join([TmpDir, "erts-" ++ ErtsVsn, "bin"]),
            -    io:fwrite("Deleting \"erl\" and \"start\" in directory ~ts ...~n",
            -              [ErtsBinDir]),
            -    file:delete(filename:join([ErtsBinDir, "erl"])),
            -    file:delete(filename:join([ErtsBinDir, "start"])),
            -
            -    io:fwrite("Creating temporary directory ~ts ...~n", [TmpBinDir]),
            -    file:make_dir(TmpBinDir),
            -
            -    io:fwrite("Copying file \"~ts.boot\" to ~ts ...~n",
            -              [PlainRelFileName, filename:join([TmpBinDir, "start.boot"])]),
            -    copy_file(PlainRelFileName++".boot",filename:join([TmpBinDir, "start.boot"])),
            +    TmpDir = filename:join(Dir,"tmp"),
            /usr/share/doc/packages/erlang-doc/doc/system/data_types.html differs (HTML document, UTF-8 Unicode text, with very long lines)
            --- old//usr/share/doc/packages/erlang-doc/doc/system/data_types.html	2025-05-10 20:18:57.993089680 +0000
            +++ new//usr/share/doc/packages/erlang-doc/doc/system/data_types.html	2025-05-10 20:18:58.005089789 +0000
            @@ -196,10 +196,10 @@
             arithmetic operations. This is because floats are represented by a fixed number
             of bits in a base-2 system while printed floats are represented with a base-10
             system. Erlang uses 64-bit floats. Here are examples of this phenomenon:

            1> 0.1+0.2.
            -0.30000000000000004

            The real numbers 0.1 and 0.2 cannot be represented exactly as floats.

            1> {36028797018963968.0, 36028797018963968 == 36028797018963968.0,
            -  36028797018963970.0, 36028797018963970 == 36028797018963970.0}.
            -{3.602879701896397e16, true,
            - 3.602879701896397e16, false}.

            The value 36028797018963968 can be represented exactly as a float value but +0.30000000000000004

            The real numbers 0.1 and 0.2 cannot be represented exactly as floats.

            1> {36028797018963968.0, 36028797018963968 == 36028797018963968.0,
            +  36028797018963970.0, 36028797018963970 == 36028797018963970.0}.
            +{3.602879701896397e16, true,
            + 3.602879701896397e16, false}.

            The value 36028797018963968 can be represented exactly as a float value but Erlang's pretty printer rounds 36028797018963968.0 to 3.602879701896397e16 (=36028797018963970.0) as all values in the range [36028797018963966.0, 36028797018963972.0] are represented by @@ -240,11 +240,11 @@ 3> <<1:1,0:1>>. <<2:2>>

            The is_bitstring/1 BIF tests whether a term is a bit string, and the is_binary/1 -BIF tests whether a term is a binary.

            Examples:

            1> is_bitstring(<<1:1>>).
            +BIF tests whether a term is a binary.

            Examples:

            1> is_bitstring(<<1:1>>).
             true
            -2> is_binary(<<1:1>>).
            +2> is_binary(<<1:1>>).
             false
            -3> is_binary(<<42>>).
            +3> is_binary(<<42>>).
             true
             

            For more examples, see Programming Examples.

            @@ -256,9 +256,9 @@ among connected nodes. A reference is created by calling the make_ref/0 BIF. The is_reference/1 BIF tests whether a term -is a reference.

            Examples:

            1> Ref = make_ref().
            +is a reference.

            Examples:

            1> Ref = make_ref().
             #Ref<0.76482849.3801088007.198204>
            -2> is_reference(Ref).
            +2> is_reference(Ref).
             true

            @@ -267,17 +267,17 @@

            A fun is a functional object. Funs make it possible to create an anonymous function and pass the function itself — not its name — as argument to other -functions.

            Examples:

            1> Fun1 = fun (X) -> X+1 end.
            +functions.

            Examples:

            1> Fun1 = fun (X) -> X+1 end.
             #Fun<erl_eval.6.39074546>
            -2> Fun1(2).
            +2> Fun1(2).
             3

            The is_function/1 and is_function/2 -BIFs tests whether a term is a fun.

            Examples:

            1> F = fun() -> ok end.
            +BIFs tests whether a term is a fun.

            Examples:

            1> F = fun() -> ok end.
             #Fun<erl_eval.43.105768164>
            -2> is_function(F).
            +2> is_function(F).
             true
            -3> is_function(F, 0).
            +3> is_function(F, 0).
             true
            -4> is_function(F, 1).
            +4> is_function(F, 1).
             false

            Read more about funs in Fun Expressions. For more examples, see Programming Examples.

            @@ -303,17 +303,17 @@ a message, which is the case when calling the spawn_request/5 BIF. A Pid is typically used when when sending a process a signal. The -is_pid/1 BIF tests whether a term is a Pid.

            Example:

            -module(m).
            --export([loop/0]).
            +is_pid/1 BIF tests whether a term is a Pid.

            Example:

            -module(m).
            +-export([loop/0]).
             
            -loop() ->
            +loop() ->
                 receive
                     who_are_you ->
            -            io:format("I am ~p~n", [self()]),
            -            loop()
            +            io:format("I am ~p~n", [self()]),
            +            loop()
                 end.
             
            -1> P = spawn(m, loop, []).
            +1> P = spawn(m, loop, []).
             <0.58.0>
             2> P ! who_are_you.
             I am <0.58.0>
            @@ -324,19 +324,19 @@
               Tuple
             

            A tuple is a compound data type with a fixed number of terms:

            {Term1,...,TermN}

            Each term Term in the tuple is called an element. The number of elements is -said to be the size of the tuple.

            There exists a number of BIFs to manipulate tuples.

            Examples:

            1> P = {adam,24,{july,29}}.
            -{adam,24,{july,29}}
            -2> element(1,P).
            +said to be the size of the tuple.

            There exists a number of BIFs to manipulate tuples.

            Examples:

            1> P = {adam,24,{july,29}}.
            +{adam,24,{july,29}}
            +2> element(1,P).
             adam
            -3> element(3,P).
            -{july,29}
            -4> P2 = setelement(2,P,25).
            -{adam,25,{july,29}}
            -5> tuple_size(P).
            +3> element(3,P).
            +{july,29}
            +4> P2 = setelement(2,P,25).
            +{adam,25,{july,29}}
            +5> tuple_size(P).
             3
            -6> tuple_size({}).
            +6> tuple_size({}).
             0
            -7> is_tuple({a,b,c}).
            +7> is_tuple({a,b,c}).
             true

            @@ -345,17 +345,17 @@

            A map is a compound data type with a variable number of key-value associations:

            #{Key1 => Value1, ..., KeyN => ValueN}

            Each key-value association in the map is called an association pair. The key and value parts of the pair are called elements. The number of association -pairs is said to be the size of the map.

            There exists a number of BIFs to manipulate maps.

            Examples:

            1> M1 = #{name => adam, age => 24, date => {july,29}}.
            -#{age => 24,date => {july,29},name => adam}
            -2> maps:get(name, M1).
            +pairs is said to be the size of the map.

            There exists a number of BIFs to manipulate maps.

            Examples:

            1> M1 = #{name => adam, age => 24, date => {july,29}}.
            +#{age => 24,date => {july,29},name => adam}
            +2> maps:get(name, M1).
             adam
            -3> maps:get(date, M1).
            -{july,29}
            -4> M2 = maps:update(age, 25, M1).
            -#{age => 25,date => {july,29},name => adam}
            -5> map_size(M).
            +3> maps:get(date, M1).
            +{july,29}
            +4> M2 = maps:update(age, 25, M1).
            +#{age => 25,date => {july,29},name => adam}
            +5> map_size(M).
             3
            -6> map_size(#{}).
            +6> map_size(#{}).
             0

            A collection of maps processing functions are found in module maps in STDLIB.

            Read more about maps in Map Expressions.

            Change

            Maps were introduced as an experimental feature in Erlang/OTP R17. Their functionality was extended and became fully supported in Erlang/OTP 18.

            @@ -370,19 +370,19 @@ latter can be expressed as [H|T]. The notation [Term1,...,TermN] above is equivalent with the list [Term1|[...|[TermN|[]]]].

            Example:

            [] is a list, thus
            [c|[]] is a list, thus
            [b|[c|[]]] is a list, thus
            [a|[b|[c|[]]]] is a list, or in short [a,b,c]

            A list where the tail is a list is sometimes called a proper list. It is allowed to have a list where the tail is not a list, for example, [a|b]. -However, this type of list is of little practical use.

            Examples:

            1> L1 = [a,2,{c,4}].
            -[a,2,{c,4}]
            -2> [H|T] = L1.
            -[a,2,{c,4}]
            +However, this type of list is of little practical use.

            Examples:

            1> L1 = [a,2,{c,4}].
            +[a,2,{c,4}]
            +2> [H|T] = L1.
            +[a,2,{c,4}]
             3> H.
             a
             4> T.
            -[2,{c,4}]
            -5> L2 = [d|T].
            -[d,2,{c,4}]
            -6> length(L1).
            +[2,{c,4}]
            +5> L2 = [d|T].
            +[d,2,{c,4}]
            +6> length(L1).
             3
            -7> length([]).
            +7> length([]).
             0

            A collection of list processing functions are found in module lists in STDLIB.

            @@ -510,16 +510,16 @@ data type. Instead, record expressions are translated to tuple expressions during compilation. Therefore, record expressions are not understood by the shell unless special actions are taken. For details, see module shell -in STDLIB.

            Examples:

            -module(person).
            --export([new/2]).
            +in STDLIB.

            Examples:

            -module(person).
            +-export([new/2]).
             
            --record(person, {name, age}).
            +-record(person, {name, age}).
             
            -new(Name, Age) ->
            -    #href_anchor"ss">person{name=Name, age=Age}.
            +new(Name, Age) ->
            +    #href_anchor"ss">person{name=Name, age=Age}.
             
            -1> person:new(ernie, 44).
            -{person,ernie,44}

            Read more about records in Records. More examples are +1> person:new(ernie, 44). +{person,ernie,44}

            Read more about records in Records. More examples are found in Programming Examples.

            /usr/share/doc/packages/erlang-doc/doc/system/debugging.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/debugging.html 2025-05-10 20:18:58.025089970 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/debugging.html 2025-05-10 20:18:58.029090006 +0000 @@ -335,7 +335,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/doc/system/design_principles.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/design_principles.html 2025-05-10 20:18:58.061090297 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/design_principles.html 2025-05-10 20:18:58.069090369 +0000 @@ -156,94 +156,94 @@ specific part. Consider the following code (written in plain Erlang) for a simple server, which keeps track of a number of "channels". Other processes can allocate and free the channels by calling the functions alloc/0 and free/1, -respectively.

            -module(ch1).
            --export([start/0]).
            --export([alloc/0, free/1]).
            --export([init/0]).
            +respectively.

            -module(ch1).
            +-export([start/0]).
            +-export([alloc/0, free/1]).
            +-export([init/0]).
             
            -start() ->
            -    spawn(ch1, init, []).
            +start() ->
            +    spawn(ch1, init, []).
             
            -alloc() ->
            -    ch1 ! {self(), alloc},
            +alloc() ->
            +    ch1 ! {self(), alloc},
                 receive
            -        {ch1, Res} ->
            +        {ch1, Res} ->
                         Res
                 end.
             
            -free(Ch) ->
            -    ch1 ! {free, Ch},
            +free(Ch) ->
            +    ch1 ! {free, Ch},
                 ok.
             
            -init() ->
            -    register(ch1, self()),
            -    Chs = channels(),
            -    loop(Chs).
            +init() ->
            +    register(ch1, self()),
            +    Chs = channels(),
            +    loop(Chs).
             
            -loop(Chs) ->
            +loop(Chs) ->
                 receive
            -        {From, alloc} ->
            -            {Ch, Chs2} = alloc(Chs),
            -            From ! {ch1, Ch},
            -            loop(Chs2);
            -        {free, Ch} ->
            -            Chs2 = free(Ch, Chs),
            -            loop(Chs2)
            -    end.

            The code for the server can be rewritten into a generic part server.erl:

            -module(server).
            --export([start/1]).
            --export([call/2, cast/2]).
            --export([init/1]).
            +        {From, alloc} ->
            +            {Ch, Chs2} = alloc(Chs),
            +            From ! {ch1, Ch},
            +            loop(Chs2);
            +        {free, Ch} ->
            +            Chs2 = free(Ch, Chs),
            +            loop(Chs2)
            +    end.

            The code for the server can be rewritten into a generic part server.erl:

            -module(server).
            +-export([start/1]).
            +-export([call/2, cast/2]).
            +-export([init/1]).
             
            -start(Mod) ->
            -    spawn(server, init, [Mod]).
            +start(Mod) ->
            +    spawn(server, init, [Mod]).
             
            -call(Name, Req) ->
            -    Name ! {call, self(), Req},
            +call(Name, Req) ->
            +    Name ! {call, self(), Req},
                 receive
            -        {Name, Res} ->
            +        {Name, Res} ->
                         Res
                 end.
             
            -cast(Name, Req) ->
            -    Name ! {cast, Req},
            +cast(Name, Req) ->
            +    Name ! {cast, Req},
                 ok.
             
            -init(Mod) ->
            -    register(Mod, self()),
            -    State = Mod:init(),
            -    loop(Mod, State).
            +init(Mod) ->
            +    register(Mod, self()),
            +    State = Mod:init(),
            +    loop(Mod, State).
             
            -loop(Mod, State) ->
            +loop(Mod, State) ->
                 receive
            -        {call, From, Req} ->
            -            {Res, State2} = Mod:handle_call(Req, State),
            -            From ! {Mod, Res},
            -            loop(Mod, State2);
            -        {cast, Req} ->
            -            State2 = Mod:handle_cast(Req, State),
            -            loop(Mod, State2)
            -    end.

            And a callback module ch2.erl:

            -module(ch2).
            --export([start/0]).
            --export([alloc/0, free/1]).
            --export([init/0, handle_call/2, handle_cast/2]).
            -
            -start() ->
            -    server:start(ch2).
            -
            -alloc() ->
            -    server:call(ch2, alloc).
            -
            -free(Ch) ->
            -    server:cast(ch2, {free, Ch}).
            +        {call, From, Req} ->
            +            {Res, State2} = Mod:handle_call(Req, State),
            +            From ! {Mod, Res},
            +            loop(Mod, State2);
            +        {cast, Req} ->
            +            State2 = Mod:handle_cast(Req, State),
            +            loop(Mod, State2)
            +    end.

            And a callback module ch2.erl:

            -module(ch2).
            +-export([start/0]).
            +-export([alloc/0, free/1]).
            +-export([init/0, handle_call/2, handle_cast/2]).
            +
            +start() ->
            +    server:start(ch2).
            +
            +alloc() ->
            +    server:call(ch2, alloc).
            +
            +free(Ch) ->
            +    server:cast(ch2, {free, Ch}).
             
            -init() ->
            -    channels().
            +init() ->
            +    channels().
             
            -handle_call(alloc, Chs) ->
            -    alloc(Chs). % => {Ch,Chs2}
            +handle_call(alloc, Chs) ->
            +    alloc(Chs). % => {Ch,Chs2}
             
            -handle_cast({free, Ch}, Chs) ->
            -    free(Ch, Chs). % => Chs2

            Notice the following:

            • The code in server can be reused to build many different servers.
            • The server name, in this example the atom ch2, is hidden from the users of +handle_cast({free, Ch}, Chs) -> + free(Ch, Chs). % => Chs2

            Notice the following:

            • The code in server can be reused to build many different servers.
            • The server name, in this example the atom ch2, is hidden from the users of the client functions. This means that the name can be changed without affecting them.
            • The protocol (messages sent to and received from the server) is also hidden. This is good programming practice and allows one to change the protocol @@ -252,16 +252,16 @@ and free/2 has been intentionally left out, as it is not relevant to the example. For completeness, one way to write these functions is given below. This is an example only, a realistic implementation must be able to handle situations -like running out of channels to allocate, and so on.

              channels() ->
              -   {_Allocated = [], _Free = lists:seq(1, 100)}.
              +like running out of channels to allocate, and so on.

              channels() ->
              +   {_Allocated = [], _Free = lists:seq(1, 100)}.
               
              -alloc({Allocated, [H|T] = _Free}) ->
              -   {H, {[H|Allocated], T}}.
              +alloc({Allocated, [H|T] = _Free}) ->
              +   {H, {[H|Allocated], T}}.
               
              -free(Ch, {Alloc, Free} = Channels) ->
              -   case lists:member(Ch, Alloc) of
              +free(Ch, {Alloc, Free} = Channels) ->
              +   case lists:member(Ch, Alloc) of
                     true ->
              -         {lists:delete(Ch, Alloc), [Ch|Free]};
              +         {lists:delete(Ch, Alloc), [Ch|Free]};
                     false ->
                        Channels
                  end.

              Code written without using behaviours can be more efficient, but the increased @@ -270,13 +270,13 @@ other programmers. Improvised programming structures, while possibly more efficient, are always more difficult to understand.

              The server module corresponds, greatly simplified, to the Erlang/OTP behaviour gen_server.

              The standard Erlang/OTP behaviours are:

              • gen_server

                For implementing the server of a client-server relation

              • gen_statem

                For implementing state machines

              • gen_event

                For implementing event handling functionality

              • supervisor

                For implementing a supervisor in a supervision tree

              The compiler understands the module attribute -behaviour(Behaviour) and issues -warnings about missing callback functions, for example:

              -module(chs3).
              --behaviour(gen_server).
              +warnings about missing callback functions, for example:

              -module(chs3).
              +-behaviour(gen_server).
               ...
               
              -3> c(chs3).
              +3> c(chs3).
               ./chs3.erl:10: Warning: undefined call-back function handle_call/3
              -{ok,chs3}

              /usr/share/doc/packages/erlang-doc/doc/system/distributed.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/distributed.html 2025-05-10 20:18:58.093090587 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/distributed.html 2025-05-10 20:18:58.097090623 +0000 @@ -146,17 +146,17 @@ the user. host is the full host name if long names are used, or the first part of the host name if short names are used. Function node() returns the name of the node.

              Example:

              % erl -name dilbert
              -(dilbert@uab.ericsson.se)1> node().
              +(dilbert@uab.ericsson.se)1> node().
               'dilbert@uab.ericsson.se'
               
               % erl -sname dilbert
              -(dilbert@uab)1> node().
              +(dilbert@uab)1> node().
               dilbert@uab

              The node name can also be given in runtime by calling net_kernel:start/1.

              Example:

              % erl
              -1> node().
              +1> node().
               nonode@nohost
              -2> net_kernel:start([dilbert,shortnames]).
              -{ok,<0.102.0>}
              -(dilbert@uab)3> node().
              +2> net_kernel:start([dilbert,shortnames]).
              +{ok,<0.102.0>}
              +(dilbert@uab)3> node().
               dilbert@uab

              Note

              A node with a long node name cannot communicate with a node with a short node name.

              @@ -360,7 +360,7 @@ Erlang programming language

              -

              Copyright © 1996-2025 Ericsson AB

              +

              Copyright © 1996-2041 Ericsson AB

              /usr/share/doc/packages/erlang-doc/doc/system/distributed_applications.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/distributed_applications.html 2025-05-10 20:18:58.117090805 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/distributed_applications.html 2025-05-10 20:18:58.121090841 +0000 @@ -154,13 +154,13 @@ elapsed, all applications start. If not all mandatory nodes are up, the node terminates.

              Example:

              An application myapp is to run at the node cp1@cave. If this node goes down, myapp is to be restarted at cp2@cave or cp3@cave. A system configuration -file cp1.config for cp1@cave can look as follows:

              [{kernel,
              -  [{distributed, [{myapp, 5000, [cp1@cave, {cp2@cave, cp3@cave}]}]},
              -   {sync_nodes_mandatory, [cp2@cave, cp3@cave]},
              -   {sync_nodes_timeout, 5000}
              -  ]
              - }
              -].

              The system configuration files for cp2@cave and cp3@cave are identical, +file cp1.config for cp1@cave can look as follows:

              [{kernel,
              +  [{distributed, [{myapp, 5000, [cp1@cave, {cp2@cave, cp3@cave}]}]},
              +   {sync_nodes_mandatory, [cp2@cave, cp3@cave]},
              +   {sync_nodes_timeout, 5000}
              +  ]
              + }
              +].

              The system configuration files for cp2@cave and cp3@cave are identical, except for the list of mandatory nodes, which is to be [cp1@cave, cp3@cave] for cp2@cave and [cp1@cave, cp2@cave] for cp3@cave.

              Note

              All involved nodes must have the same value for distributed and sync_nodes_timeout. Otherwise the system behavior is undefined.

              @@ -175,7 +175,7 @@ automatically starts the application.

              The application is started at the first operational node that is listed in the list of nodes in the distributed configuration parameter. The application is started as usual. That is, an application master is created and calls the -application callback function:

              Module:start(normal, StartArgs)

              Example:

              Continuing the example from the previous section, the three nodes are started, +application callback function:

              Module:start(normal, StartArgs)

              Example:

              Continuing the example from the previous section, the three nodes are started, specifying the system configuration file:

              > erl -sname cp1 -config cp1
               > erl -sname cp2 -config cp2
               > erl -sname cp3 -config cp3

              When all nodes are operational, myapp can be started. This is achieved by @@ -191,9 +191,9 @@ restarted (after the specified time-out) at the first operational node that is listed in the list of nodes in the distributed configuration parameter. This is called a failover.

              The application is started the normal way at the new node, that is, by the -application master calling:

              Module:start(normal, StartArgs)

              An exception is if the application has the start_phases key defined (see +application master calling:

              Module:start(normal, StartArgs)

              An exception is if the application has the start_phases key defined (see Included Applications). The application is then -instead started by calling:

              Module:start({failover, Node}, StartArgs)

              Here Node is the terminated node.

              Example:

              If cp1 goes down, the system checks which one of the other nodes, cp2 or +instead started by calling:

              Module:start({failover, Node}, StartArgs)

              Here Node is the terminated node.

              Example:

              If cp1 goes down, the system checks which one of the other nodes, cp2 or cp3, has the least number of running applications, but waits for 5 seconds for cp1 to restart. If cp1 does not restart and cp2 runs fewer applications than cp3, myapp is restarted on cp2.

              Application myapp - Situation 2

              Suppose now that cp2 goes also down and does not restart within 5 seconds. @@ -206,7 +206,7 @@

              If a node is started, which has higher priority according to distributed than the node where a distributed application is running, the application is restarted at the new node and stopped at the old node. This is called a -takeover.

              The application is started by the application master calling:

              Module:start({takeover, Node}, StartArgs)

              Here Node is the old node.

              Example:

              If myapp is running at cp3, and if cp2 now restarts, it does not restart +takeover.

              The application is started by the application master calling:

              Module:start({takeover, Node}, StartArgs)

              Here Node is the old node.

              Example:

              If myapp is running at cp3, and if cp2 now restarts, it does not restart myapp, as the order between the cp2 and cp3 nodes is undefined.

              Application myapp - Situation 4

              However, if cp1 also restarts, the function application:takeover/2 moves myapp to cp1, as cp1 has a higher priority than cp3 for this application. In this case, Module:start({takeover, cp3@cave}, StartArgs) is @@ -261,7 +261,7 @@ Erlang programming language

              -

              Copyright © 1996-2025 Ericsson AB

              +

              Copyright © 1996-2041 Ericsson AB

              /usr/share/doc/packages/erlang-doc/doc/system/documentation.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/documentation.html 2025-05-10 20:18:58.149091095 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/documentation.html 2025-05-10 20:18:58.157091167 +0000 @@ -116,15 +116,15 @@

              Documentation in Erlang is done through the -moduledoc and -doc -attributes. For example:

              -module(arith).
              +attributes. For example:

              -module(arith).
               -moduledoc """
               A module for basic arithmetic.
               """.
               
              --export([add/2]).
              +-export([add/2]).
               
               -doc "Adds two numbers.".
              -add(One, Two) -> One + Two.

              The -moduledoc attribute has to be located before the first -doc attribute +add(One, Two) -> One + Two.

              The -moduledoc attribute has to be located before the first -doc attribute or function declaration. It documents the overall purpose of the module.

              The -doc attribute always precedes the function or attribute it documents. The attributes that can be documented are @@ -144,23 +144,23 @@ Documentation metadata

            It is possible to add metadata to the documentation entry. You do this by adding -a -moduledoc or -doc attribute with a map as argument. For example:

            -module(arith).
            +a -moduledoc or -doc attribute with a map as argument. For example:

            -module(arith).
             -moduledoc """
             A module for basic arithmetic.
             """.
            --moduledoc #{since => "1.0"}.
            +-moduledoc #{since => "1.0"}.
             
            --export([add/2]).
            +-export([add/2]).
             
             -doc "Adds two numbers.".
            --doc(#{since => "1.0"}).
            -add(One, Two) -> One + Two.

            The metadata is used by documentation tools to provide extra information to the +-doc(#{since => "1.0"}). +add(One, Two) -> One + Two.

            The metadata is used by documentation tools to provide extra information to the user. There can be multiple metadata documentation entries, in which case the maps will be merged with the latest taking precedence if there are duplicate keys. Example:

            -doc "Adds two numbers.".
            --doc #{since => "1.0", author => "Joe"}.
            --doc #{since => "2.0"}.
            -add(One, Two) -> One + Two.

            This will result in a metadata entry of #{since => "2.0", author => "Joe"}.

            The keys and values in the metadata map can be any type, but it is recommended +-doc #{since => "1.0", author => "Joe"}. +-doc #{since => "2.0"}. +add(One, Two) -> One + Two.

            This will result in a metadata entry of #{since => "2.0", author => "Joe"}.

            The keys and values in the metadata map can be any type, but it is recommended that only atoms are used for keys and strings for the values.

            @@ -172,8 +172,8 @@ -doc {file, "path/to/doc.md"} to point to the documentation. The path used is relative to the file where the -doc attribute is located. For example:

            %% doc/add.md
             Adds two numbers.

            and

            %% src/arith.erl
            --doc({file, "../doc/add.md"}).
            -add(One, Two) -> One + Two.

            +-doc({file, "../doc/add.md"}). +add(One, Two) -> One + Two.

            @@ -184,7 +184,7 @@ and other diagrams to better show the usage of the module. Instead of writing a long text in the moduledoc attribute, it could be better to break it out into an external page.

            The moduledoc attribute should start with a short paragraph describing the -module and then go into greater details. For example:

            -module(arith).
            +module and then go into greater details. For example:

            -module(arith).
             -moduledoc """
                A module for basic arithmetic.
             
            @@ -207,9 +207,9 @@
             deprecated and what to use instead.

          • format - The format to use for all documentation in this module. The default is text/markdown. It should be written using the mime type -of the format.

          Example:

          -moduledoc {file, "../doc/arith.asciidoc"}.
          --moduledoc #href_anchor"ss">since => "0.1", format => "text/asciidoc"}.
          --moduledoc #{deprecated => "Use the Erlang arithmetic operators instead."}.

          +of the format.

        Example:

        -moduledoc {file, "../doc/arith.asciidoc"}.
        +-moduledoc #href_anchor"ss">since => "0.1", format => "text/asciidoc"}.
        +-moduledoc #{deprecated => "Use the Erlang arithmetic operators instead."}.

        @@ -224,7 +224,7 @@ We use a special number here so that we know that this number comes from this module. """. --opaque number() :: {arith, erlang:number()}. +-opaque number() :: {arith, erlang:number()}. -doc """ Adds two numbers. @@ -235,8 +235,8 @@ 1> arith:add(arith:number(1), arith:number(2)). {number, 3} ``` """. --spec add(number(), number()) -> number(). -add({number, One}, {number, Two}) -> {number, One + Two}.

        +-spec add(number(), number()) -> number(). +add({number, One}, {number, Two}) -> {number, One + Two}.

      @@ -248,12 +248,12 @@ automatically insert this key if there is a -deprecated attribute marking a function as deprecated.

    • equiv => unicode:chardata() | F/A | F(...) - Notes that this function is equivalent to another function in this module. The equivalence can be described using either -Func/Arity, Func(Args) or a unicode string. For example:

      -doc #{equiv => add/3}.
      -add(One, Two) -> add(One, Two, []).
      -add(One, Two, Options) -> ...

      or

      -doc #{equiv => add(One, Two, [])}.
      --spec add(One :: number(), Two :: number()) -> number().
      -add(One, Two) -> add(One, Two, []).
      -add(One, Two, Options) -> ...

      The entry into the EEP-48 doc chunk metadata is +Func/Arity, Func(Args) or a unicode string. For example:

      -doc #{equiv => add/3}.
      +add(One, Two) -> add(One, Two, []).
      +add(One, Two, Options) -> ...

      or

      -doc #{equiv => add(One, Two, [])}.
      +-spec add(One :: number(), Two :: number()) -> number().
      +add(One, Two) -> add(One, Two, []).
      +add(One, Two, Options) -> ...

      The entry into the EEP-48 doc chunk metadata is the value converted to a string.

    • exported => boolean() - A boolean/0 signifying if the entry is exported or not. This value is automatically set by the compiler and should not be set by the user.

    @@ -264,20 +264,20 @@

    The doc signature is a short text shown to describe the function and its arguments. By default it is determined by looking at the names of the arguments in the --spec or function. For example:

    add(One, Two) -> One + Two.
    +-spec or function. For example:

    add(One, Two) -> One + Two.
     
    --spec sub(One :: integer(), Two :: integer()) -> integer().
    -sub(X, Y) -> X - Y.

    will have a signature of add(One, Two) and sub(One, Two).

    For types or callbacks, the signature is derived from the type or callback -specification. For example:

    -type number(Value) :: {number, Value}.
    +-spec sub(One :: integer(), Two :: integer()) -> integer().
    +sub(X, Y) -> X - Y.

    will have a signature of add(One, Two) and sub(One, Two).

    For types or callbacks, the signature is derived from the type or callback +specification. For example:

    -type number(Value) :: {number, Value}.
     %% signature will be `number(Value)`
     
    --opaque number() :: {number, number()}.
    +-opaque number() :: {number, number()}.
     %% signature will be `number()`
     
    --callback increment(In :: number()) -> Out.
    +-callback increment(In :: number()) -> Out.
     %% signature will be `increment(In)`
     
    --callback increment(In) -> Out when In :: number().
    +-callback increment(In) -> Out when In :: number().
     %% signature will be `increment(In)`

    If it is not possible to "easily" figure out a nice signature from the code, the MFA syntax is used instead. For example: add/2, number/1, increment/1

    It is possible to supply a custom signature by placing it as the first line of the -doc attribute. The provided signature must be in the form of a function @@ -286,7 +286,7 @@ Adds two numbers. """. -add(A, B) -> A + B.

    Will create the signature add(One, Two). The signature will be removed from the +add(A, B) -> A + B.

    Will create the signature add(One, Two). The signature will be removed from the documentation string, so in the example above only the text "Adds two numbers" will be part of the documentation. This works for functions, types, and callbacks.

    A pattern has the same structure as a term but can contain unbound variables.

    Example:

    Name1
    -[H|T]
    -{error,Reason}

    Patterns are allowed in clause heads, case expressions, +[H|T] +{error,Reason}

    Patterns are allowed in clause heads, case expressions, receive expressions, and match expressions.

    @@ -182,13 +182,13 @@

    If Pattern1 and Pattern2 are valid patterns, the following is also a valid pattern:

    Pattern1 = Pattern2

    When matched against a term, both Pattern1 and Pattern2 are matched against -the term. The idea behind this feature is to avoid reconstruction of terms.

    Example:

    f({connect,From,To,Number,Options}, To) ->
    -    Signal = {connect,From,To,Number,Options},
    +the term. The idea behind this feature is to avoid reconstruction of terms.

    Example:

    f({connect,From,To,Number,Options}, To) ->
    +    Signal = {connect,From,To,Number,Options},
         ...;
    -f(Signal, To) ->
    -    ignore.

    can instead be written as

    f({connect,_,To,_,_} = Signal, To) ->
    +f(Signal, To) ->
    +    ignore.

    can instead be written as

    f({connect,_,To,_,_} = Signal, To) ->
         ...;
    -f(Signal, To) ->
    +f(Signal, To) ->
         ignore.

    The compound pattern operator does not imply that its operands are matched in any particular order. That means that it is not legal to bind a variable in Pattern1 and use it in Pattern2, or vice versa.

    @@ -197,15 +197,15 @@ String Prefix in Patterns

    -

    When matching strings, the following is a valid pattern:

    f("prefix" ++ Str) -> ...

    This is syntactic sugar for the equivalent, but harder to read:

    f([$p,$r,$e,$f,$i,$x | Str]) -> ...

    +

    When matching strings, the following is a valid pattern:

    f("prefix" ++ Str) -> ...

    This is syntactic sugar for the equivalent, but harder to read:

    f([$p,$r,$e,$f,$i,$x | Str]) -> ...

    Expressions in Patterns

    An arithmetic expression can be used within a pattern if it meets both of the -following two conditions:

    • It uses only numeric or bitwise operators.
    • Its value can be evaluated to a constant when complied.

    Example:

    case {Value, Result} of
    -    {?THRESHOLD+1, ok} -> ...

    +following two conditions:

    • It uses only numeric or bitwise operators.
    • Its value can be evaluated to a constant when complied.

    Example:

    case {Value, Result} of
    +    {?THRESHOLD+1, ok} -> ...

    @@ -213,15 +213,15 @@

    The following matches Pattern against Expr:

    Pattern = Expr

    If the matching succeeds, any unbound variable in the pattern becomes bound and the value of Expr is returned.

    If multiple match operators are applied in sequence, they will be evaluated from -right to left.

    If the matching fails, a badmatch run-time error occurs.

    Examples:

    1> {A, B} = T = {answer, 42}.
    -{answer,42}
    +right to left.

    If the matching fails, a badmatch run-time error occurs.

    Examples:

    1> {A, B} = T = {answer, 42}.
    +{answer,42}
     2> A.
     answer
     3> B.
     42
     4> T.
    -{answer,42}
    -5> {C, D} = [1, 2].
    +{answer,42}
    +5> {C, D} = [1, 2].
     ** exception error: no match of right-hand side value [1,2]

    Because multiple match operators are evaluated from right to left, it means that:

    Pattern1 = Pattern2 = . . . = PatternN = Expression

    is equivalent to:

    Temporary = Expression,
     PatternN = Temporary,
    @@ -243,20 +243,20 @@
     compound pattern matches if all of its constituent patterns match. It is not
     legal for a pattern that is part of a compound pattern to use variables (as keys
     in map patterns or sizes in binary patterns) bound in other sub patterns of the
    -same compound pattern.

    Examples:

    1> fun(#{Key := Value} = #{key := Key}) -> Value end.
    +same compound pattern.

    Examples:

    1> fun(#{Key := Value} = #{key := Key}) -> Value end.
     * 1:7: variable 'Key' is unbound
    -2> F = fun({A, B} = E) -> {E, A + B} end, F({1,2}).
    -{{1,2},3}
    -3> G = fun(<<A:8,B:8>> = <<C:16>>) -> {A, B, C} end, G(<<42,43>>).
    -{42,43,10795}

    The match operator is allowed everywhere an expression is allowed. It is used +2> F = fun({A, B} = E) -> {E, A + B} end, F({1,2}). +{{1,2},3} +3> G = fun(<<A:8,B:8>> = <<C:16>>) -> {A, B, C} end, G(<<42,43>>). +{42,43,10795}

    The match operator is allowed everywhere an expression is allowed. It is used to match the value of an expression to a pattern. If multiple match operators -are applied in sequence, they will be evaluated from right to left.

    Examples:

    1> M = #{key => key2, key2 => value}.
    -#{key => key2,key2 => value}
    -2> f(Key), #{Key := Value} = #{key := Key} = M, Value.
    +are applied in sequence, they will be evaluated from right to left.

    Examples:

    1> M = #{key => key2, key2 => value}.
    +#{key => key2,key2 => value}
    +2> f(Key), #{Key := Value} = #{key := Key} = M, Value.
     value
    -3> f(Key), #{Key := Value} = (#{key := Key} = M), Value.
    +3> f(Key), #{Key := Value} = (#{key := Key} = M), Value.
     value
    -4> f(Key), (#{Key := Value} = #{key := Key}) = M, Value.
    +4> f(Key), (#{Key := Value} = #{key := Key}) = M, Value.
     * 1:12: variable 'Key' is unbound
     5> <<X:Y>> = begin Y = 8, <<42:8>> end, X.
     42

    The expression at prompt 2> first matches the value of variable M against @@ -280,22 +280,22 @@ Function Calls -

    ExprF(Expr1,...,ExprN)
    -ExprM:ExprF(Expr1,...,ExprN)

    In the first form of function calls, ExprM:ExprF(Expr1,...,ExprN), each of +

    ExprF(Expr1,...,ExprN)
    +ExprM:ExprF(Expr1,...,ExprN)

    In the first form of function calls, ExprM:ExprF(Expr1,...,ExprN), each of ExprM and ExprF must be an atom or an expression that evaluates to an atom. The function is said to be called by using the fully qualified function name. -This is often referred to as a remote or external function call.

    Example:

    lists:keyfind(Name, 1, List)

    In the second form of function calls, ExprF(Expr1,...,ExprN), ExprF must be +This is often referred to as a remote or external function call.

    Example:

    lists:keyfind(Name, 1, List)

    In the second form of function calls, ExprF(Expr1,...,ExprN), ExprF must be an atom or evaluate to a fun.

    If ExprF is an atom, the function is said to be called by using the implicitly qualified function name. If the function ExprF is locally defined, it is called. Alternatively, if ExprF is explicitly imported from the M module, M:ExprF(Expr1,...,ExprN) is called. If ExprF is neither declared locally nor explicitly imported, ExprF must be the name of an automatically -imported BIF.

    Examples:

    handle(Msg, State)
    -spawn(m, init, [])

    Examples where ExprF is a fun:

    1> Fun1 = fun(X) -> X+1 end,
    -Fun1(3).
    +imported BIF.

    Examples:

    handle(Msg, State)
    +spawn(m, init, [])

    Examples where ExprF is a fun:

    1> Fun1 = fun(X) -> X+1 end,
    +Fun1(3).
     4
    -2> fun lists:append/2([1,2], [3,4]).
    -[1,2,3,4]
    +2> fun lists:append/2([1,2], [3,4]).
    +[1,2,3,4]
     3>

    Notice that when calling a local function, there is a difference between using the implicitly or fully qualified function name. The latter always refers to the latest version of the module. See @@ -320,32 +320,32 @@ (ERTS version 5.8) and have an implicitly qualified call to that function in your code, you either need to explicitly remove the auto-import using a compiler directive, or replace the call with a fully qualified function call. Otherwise -you get a compilation error. See the following example:

    -export([length/1,f/1]).
    +you get a compilation error. See the following example:

    -export([length/1,f/1]).
     
    --compile({no_auto_import,[length/1]}). % erlang:length/1 no longer autoimported
    +-compile({no_auto_import,[length/1]}). % erlang:length/1 no longer autoimported
     
    -length([]) ->
    +length([]) ->
         0;
    -length([H|T]) ->
    -    1 + length(T). %% Calls the local function length/1
    +length([H|T]) ->
    +    1 + length(T). %% Calls the local function length/1
     
    -f(X) when erlang:length(X) > 3 -> %% Calls erlang:length/1,
    +f(X) when erlang:length(X) > 3 -> %% Calls erlang:length/1,
                                       %% which is allowed in guards
         long.

    The same logic applies to explicitly imported functions from other modules, as to locally defined functions. It is not allowed to both import a function from -another module and have the function declared in the module at the same time:

    -export([f/1]).
    +another module and have the function declared in the module at the same time:

    -export([f/1]).
     
    --compile({no_auto_import,[length/1]}). % erlang:length/1 no longer autoimported
    +-compile({no_auto_import,[length/1]}). % erlang:length/1 no longer autoimported
     
    --import(mod,[length/1]).
    +-import(mod,[length/1]).
     
    -f(X) when erlang:length(X) > 33 -> %% Calls erlang:length/1,
    +f(X) when erlang:length(X) > 33 -> %% Calls erlang:length/1,
                                        %% which is allowed in guards
     
    -    erlang:length(X);              %% Explicit call to erlang:length in body
    +    erlang:length(X);              %% Explicit call to erlang:length in body
     
    -f(X) ->
    -    length(X).                     %% mod:length/1 is called

    For auto-imported BIFs added in Erlang/OTP R14A and thereafter, overriding the +f(X) -> + length(X). %% mod:length/1 is called

    For auto-imported BIFs added in Erlang/OTP R14A and thereafter, overriding the name with a local function or explicit import is always allowed. However, if the -compile({no_auto_import,[F/A]) directive is not used, the compiler issues a warning whenever the function is called in the module using the implicitly @@ -365,7 +365,7 @@ sequence GuardSeq that evaluates to true is found. Then the corresponding /usr/share/doc/packages/erlang-doc/doc/system/features.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/features.html 2025-05-10 20:18:58.517094431 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/features.html 2025-05-10 20:18:58.517094431 +0000 @@ -239,7 +239,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/doc/system/funs.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/funs.html 2025-05-10 20:18:58.553094757 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/funs.html 2025-05-10 20:18:58.565094866 +0000 @@ -121,14 +121,14 @@ map -

    The following function, double, doubles every element in a list:

    double([H|T]) -> [2*H|double(T)];
    -double([])    -> [].

    Hence, the argument entered as input is doubled as follows:

    > double([1,2,3,4]).
    -[2,4,6,8]

    The following function, add_one, adds one to every element in a list:

    add_one([H|T]) -> [H+1|add_one(T)];
    -add_one([])    -> [].

    The functions double and add_one have a similar structure. This can be used -by writing a function map that expresses this similarity:

    map(F, [H|T]) -> [F(H)|map(F, T)];
    -map(F, [])    -> [].

    The functions double and add_one can now be expressed in terms of map as -follows:

    double(L)  -> map(fun(X) -> 2*X end, L).
    -add_one(L) -> map(fun(X) -> 1 + X end, L).

    map(F, List) is a function that takes a function F and a list L as +

    The following function, double, doubles every element in a list:

    double([H|T]) -> [2*H|double(T)];
    +double([])    -> [].

    Hence, the argument entered as input is doubled as follows:

    > double([1,2,3,4]).
    +[2,4,6,8]

    The following function, add_one, adds one to every element in a list:

    add_one([H|T]) -> [H+1|add_one(T)];
    +add_one([])    -> [].

    The functions double and add_one have a similar structure. This can be used +by writing a function map that expresses this similarity:

    map(F, [H|T]) -> [F(H)|map(F, T)];
    +map(F, [])    -> [].

    The functions double and add_one can now be expressed in terms of map as +follows:

    double(L)  -> map(fun(X) -> 2*X end, L).
    +add_one(L) -> map(fun(X) -> 1 + X end, L).

    map(F, List) is a function that takes a function F and a list L as arguments and returns a new list, obtained by applying F to each of the elements in L.

    The process of abstracting out the common features of a number of different programs is called procedural abstraction. Procedural abstraction can be used @@ -142,21 +142,21 @@ foreach

    This section illustrates procedural abstraction. Initially, the following two -examples are written as conventional functions.

    This function prints all elements of a list onto a stream:

    print_list(Stream, [H|T]) ->
    -    io:format(Stream, "~p~n", [H]),
    -    print_list(Stream, T);
    -print_list(Stream, []) ->
    -    true.

    This function broadcasts a message to a list of processes:

    broadcast(Msg, [Pid|Pids]) ->
    +examples are written as conventional functions.

    This function prints all elements of a list onto a stream:

    print_list(Stream, [H|T]) ->
    +    io:format(Stream, "~p~n", [H]),
    +    print_list(Stream, T);
    +print_list(Stream, []) ->
    +    true.

    This function broadcasts a message to a list of processes:

    broadcast(Msg, [Pid|Pids]) ->
         Pid ! Msg,
    -    broadcast(Msg, Pids);
    -broadcast(_, []) ->
    +    broadcast(Msg, Pids);
    +broadcast(_, []) ->
         true.

    These two functions have a similar structure. They both iterate over a list and do something to each element in the list. The "something" is passed on as an -extra argument to the function that does this.

    The function foreach expresses this similarity:

    foreach(F, [H|T]) ->
    -    F(H),
    -    foreach(F, T);
    -foreach(F, []) ->
    -    ok.

    Using the function foreach, the function print_list becomes:

    foreach(fun(H) -> io:format(S, "~p~n",[H]) end, L)

    Using the function foreach, the function broadcast becomes:

    foreach(fun(Pid) -> Pid ! M end, L)

    foreach is evaluated for its side-effect and not its value. foreach(Fun ,L) +extra argument to the function that does this.

    The function foreach expresses this similarity:

    foreach(F, [H|T]) ->
    +    F(H),
    +    foreach(F, T);
    +foreach(F, []) ->
    +    ok.

    Using the function foreach, the function print_list becomes:

    foreach(fun(H) -> io:format(S, "~p~n",[H]) end, L)

    Using the function foreach, the function broadcast becomes:

    foreach(fun(Pid) -> Pid ! M end, L)

    foreach is evaluated for its side-effect and not its value. foreach(Fun ,L) calls Fun(X) for each element X in L and the processing occurs in the order that the elements were defined in L. map does not define the order in which its elements are processed.

    @@ -166,24 +166,24 @@ Syntax of Funs

    Funs are written with the following syntax (see -Fun Expressions for full description):

    F = fun (Arg1, Arg2, ... ArgN) ->
    +Fun Expressions for full description):

    F = fun (Arg1, Arg2, ... ArgN) ->
             ...
         end

    This creates an anonymous function of N arguments and binds it to the variable F.

    Another function, FunctionName, written in the same module, can be passed as an argument, using the following syntax:

    F = fun FunctionName/Arity

    With this form of function reference, the function that is referred to does not need to be exported from the module.

    It is also possible to refer to a function defined in a different module, with -the following syntax:

    F = fun Module:FunctionName/Arity

    In this case, the function must be exported from the module in question.

    The following program illustrates the different ways of creating funs:

    -module(fun_test).
    --export([t1/0, t2/0]).
    --import(lists, [map/2]).
    -
    -t1() -> map(fun(X) -> 2 * X end, [1,2,3,4,5]).
    -
    -t2() -> map(fun double/1, [1,2,3,4,5]).
    -
    -double(X) -> X * 2.

    The fun F can be evaluated with the following syntax:

    F(Arg1, Arg2, ..., Argn)

    To check whether a term is a fun, use the test -is_function/1 in a guard.

    Example:

    f(F, Args) when is_function(F) ->
    -   apply(F, Args);
    -f(N, _) when is_integer(N) ->
    +the following syntax:

    F = fun Module:FunctionName/Arity

    In this case, the function must be exported from the module in question.

    The following program illustrates the different ways of creating funs:

    -module(fun_test).
    +-export([t1/0, t2/0]).
    +-import(lists, [map/2]).
    +
    +t1() -> map(fun(X) -> 2 * X end, [1,2,3,4,5]).
    +
    +t2() -> map(fun double/1, [1,2,3,4,5]).
    +
    +double(X) -> X * 2.

    The fun F can be evaluated with the following syntax:

    F(Arg1, Arg2, ..., Argn)

    To check whether a term is a fun, use the test +is_function/1 in a guard.

    Example:

    f(F, Args) when is_function(F) ->
    +   apply(F, Args);
    +f(N, _) when is_integer(N) ->
        N.

    Funs are a distinct type. The BIFs erlang:fun_info/1,2 can be used to retrieve information about a fun, and the BIF erlang:fun_to_list/1 returns a textual representation of a fun. The check_process_code/2 @@ -196,18 +196,18 @@

    The scope rules for variables that occur in funs are as follows:

    • All variables that occur in the head of a fun are assumed to be "fresh" variables.
    • Variables that are defined before the fun, and that occur in function calls or -guard tests within the fun, have the values they had outside the fun.
    • Variables cannot be exported from a fun.

    The following examples illustrate these rules:

    print_list(File, List) ->
    -    {ok, Stream} = file:open(File, write),
    -    foreach(fun(X) -> io:format(Stream,"~p~n",[X]) end, List),
    -    file:close(Stream).

    Here, the variable X, defined in the head of the fun, is a new variable. The +guard tests within the fun, have the values they had outside the fun.

  • Variables cannot be exported from a fun.
  • The following examples illustrate these rules:

    print_list(File, List) ->
    +    {ok, Stream} = file:open(File, write),
    +    foreach(fun(X) -> io:format(Stream,"~p~n",[X]) end, List),
    +    file:close(Stream).

    Here, the variable X, defined in the head of the fun, is a new variable. The variable Stream, which is used within the fun, gets its value from the file:open line.

    As any variable that occurs in the head of a fun is considered a new variable, -it is equally valid to write as follows:

    print_list(File, List) ->
    -    {ok, Stream} = file:open(File, write),
    -    foreach(fun(File) ->
    -                io:format(Stream,"~p~n",[File])
    -            end, List),
    -    file:close(Stream).

    Here, File is used as the new variable instead of X. This is not so wise +it is equally valid to write as follows:

    print_list(File, List) ->
    +    {ok, Stream} = file:open(File, write),
    +    foreach(fun(File) ->
    +                io:format(Stream,"~p~n",[File])
    +            end, List),
    +    file:close(Stream).

    Here, File is used as the new variable instead of X. This is not so wise because code in the fun body cannot refer to the variable File, which is defined outside of the fun. Compiling this example gives the following diagnostic:

    ./FileName.erl:Line: Warning: variable 'File'
    @@ -216,20 +216,20 @@
     pattern matching operations must be moved into guard expressions and cannot be
     written in the head of the fun. For example, you might write the following code
     if you intend the first clause of F to be evaluated when the value of its
    -argument is Y:

    f(...) ->
    +argument is Y:

    f(...) ->
         Y = ...
    -    map(fun(X) when X == Y ->
    +    map(fun(X) when X == Y ->
                  ;
    -           (_) ->
    +           (_) ->
                  ...
    -        end, ...)
    -    ...

    instead of writing the following code:

    f(...) ->
    +        end, ...)
    +    ...

    instead of writing the following code:

    f(...) ->
         Y = ...
    -    map(fun(Y) ->
    +    map(fun(Y) ->
                  ;
    -           (_) ->
    +           (_) ->
                  ...
    -        end, ...)
    +        end, ...)
         ...

    @@ -243,58 +243,58 @@ map

    -

    lists:map/2 takes a function of one argument and a list of terms:

    map(F, [H|T]) -> [F(H)|map(F, T)];
    -map(F, [])    -> [].

    It returns the list obtained by applying the function to every argument in the +

    lists:map/2 takes a function of one argument and a list of terms:

    map(F, [H|T]) -> [F(H)|map(F, T)];
    +map(F, [])    -> [].

    It returns the list obtained by applying the function to every argument in the list.

    When a new fun is defined in the shell, the value of the fun is printed as -Fun#<erl_eval>:

    > Double = fun(X) -> 2 * X end.
    +Fun#<erl_eval>:

    > Double = fun(X) -> 2 * X end.
     #Fun<erl_eval.6.72228031>
    -> lists:map(Double, [1,2,3,4,5]).
    -[2,4,6,8,10]

    +> lists:map(Double, [1,2,3,4,5]). +[2,4,6,8,10]

    any

    -

    lists:any/2 takes a predicate P of one argument and a list of terms:

    any(Pred, [H|T]) ->
    -    case Pred(H) of
    +

    lists:any/2 takes a predicate P of one argument and a list of terms:

    any(Pred, [H|T]) ->
    +    case Pred(H) of
             true  ->  true;
    -        false ->  any(Pred, T)
    +        false ->  any(Pred, T)
         end;
    -any(Pred, []) ->
    +any(Pred, []) ->
         false.

    A predicate is a function that returns true or false. any is true if there is a term X in the list such that P(X) is true.

    A predicate Big(X) is defined, which is true if its argument is greater that -10:

    > Big =  fun(X) -> if X > 10 -> true; true -> false end end.
    +10:

    > Big =  fun(X) -> if X > 10 -> true; true -> false end end.
     #Fun<erl_eval.6.72228031>
    -> lists:any(Big, [1,2,3,4]).
    +> lists:any(Big, [1,2,3,4]).
     false
    -> lists:any(Big, [1,2,3,12,5]).
    +> lists:any(Big, [1,2,3,12,5]).
     true

    /usr/share/doc/packages/erlang-doc/doc/system/gen_server_concepts.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/gen_server_concepts.html 2025-05-10 20:18:58.589095083 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/gen_server_concepts.html 2025-05-10 20:18:58.597095156 +0000 @@ -161,40 +161,40 @@

    An example of a simple server written in plain Erlang is provided in Overview. The server can be reimplemented using -gen_server, resulting in this callback module:

    -module(ch3).
    --behaviour(gen_server).
    +gen_server, resulting in this callback module:

    -module(ch3).
    +-behaviour(gen_server).
     
    --export([start_link/0]).
    --export([alloc/0, free/1]).
    --export([init/1, handle_call/3, handle_cast/2]).
    +-export([start_link/0]).
    +-export([alloc/0, free/1]).
    +-export([init/1, handle_call/3, handle_cast/2]).
     
    -start_link() ->
    -    gen_server:start_link({local, ch3}, ch3, [], []).
    +start_link() ->
    +    gen_server:start_link({local, ch3}, ch3, [], []).
     
    -alloc() ->
    -    gen_server:call(ch3, alloc).
    +alloc() ->
    +    gen_server:call(ch3, alloc).
     
    -free(Ch) ->
    -    gen_server:cast(ch3, {free, Ch}).
    +free(Ch) ->
    +    gen_server:cast(ch3, {free, Ch}).
     
    -init(_Args) ->
    -    {ok, channels()}.
    +init(_Args) ->
    +    {ok, channels()}.
     
    -handle_call(alloc, _From, Chs) ->
    -    {Ch, Chs2} = alloc(Chs),
    -    {reply, Ch, Chs2}.
    +handle_call(alloc, _From, Chs) ->
    +    {Ch, Chs2} = alloc(Chs),
    +    {reply, Ch, Chs2}.
     
    -handle_cast({free, Ch}, Chs) ->
    -    Chs2 = free(Ch, Chs),
    -    {noreply, Chs2}.

    The code is explained in the next sections.

    +handle_cast({free, Ch}, Chs) -> + Chs2 = free(Ch, Chs), + {noreply, Chs2}.

    The code is explained in the next sections.

    Starting a Gen_Server

    In the example in the previous section, gen_server is started by calling -ch3:start_link():

    start_link() ->
    -    gen_server:start_link({local, ch3}, ch3, [], []) => {ok, Pid}

    start_link/0 calls function gen_server:start_link/4. This function +ch3:start_link():

    start_link() ->
    +    gen_server:start_link({local, ch3}, ch3, [], []) => {ok, Pid}

    start_link/0 calls function gen_server:start_link/4. This function spawns and links to a new process, a gen_server.

    • The first argument, {local, ch3}, specifies the name. The gen_server is then locally registered as ch3.

      If the name is omitted, the gen_server is not registered. Instead its pid must be used. The name can also be given as {global, Name}, in which case @@ -208,8 +208,8 @@ for the available options.

    If name registration succeeds, the new gen_server process calls the callback function ch3:init([]). init is expected to return {ok, State}, where State is the internal state of the gen_server. In this case, the state is -the available channels.

    init(_Args) ->
    -    {ok, channels()}.

    gen_server:start_link/4 is synchronous. It does not return until the +the available channels.

    init(_Args) ->
    +    {ok, channels()}.

    gen_server:start_link/4 is synchronous. It does not return until the gen_server has been initialized and is ready to receive requests.

    gen_server:start_link/4 must be used if the gen_server is part of a supervision tree, meaning that it was started by a supervisor. There is another function, gen_server:start/4, to start a standalone @@ -225,9 +225,9 @@ When the request is received, the gen_server calls handle_call(Request, From, State), which is expected to return a tuple {reply,Reply,State1}. Reply is the reply that is to be sent back -to the client, and State1 is a new value for the state of the gen_server.

    handle_call(alloc, _From, Chs) ->
    -    {Ch, Chs2} = alloc(Chs),
    -    {reply, Ch, Chs2}.

    In this case, the reply is the allocated channel Ch and the new state is the +to the client, and State1 is a new value for the state of the gen_server.

    handle_call(alloc, _From, Chs) ->
    +    {Ch, Chs2} = alloc(Chs),
    +    {reply, Ch, Chs2}.

    In this case, the reply is the allocated channel Ch and the new state is the set of remaining available channels Chs2.

    Thus, the call ch3:alloc() returns the allocated channel Ch and the gen_server then waits for new requests, now with an updated list of available channels.

    @@ -236,13 +236,13 @@ Asynchronous Requests - Cast

    -

    The asynchronous request free(Ch) is implemented using gen_server:cast/2:

    free(Ch) ->
    -    gen_server:cast(ch3, {free, Ch}).

    ch3 is the name of the gen_server. {free, Ch} is the actual request.

    The request is made into a message and sent to the gen_server. +

    The asynchronous request free(Ch) is implemented using gen_server:cast/2:

    free(Ch) ->
    +    gen_server:cast(ch3, {free, Ch}).

    ch3 is the name of the gen_server. {free, Ch} is the actual request.

    The request is made into a message and sent to the gen_server. cast, and thus free, then returns ok.

    When the request is received, the gen_server calls handle_cast(Request, State), which is expected to return a tuple -{noreply,State1}. State1 is a new value for the state of the gen_server.

    handle_cast({free, Ch}, Chs) ->
    -    Chs2 = free(Ch, Chs),
    -    {noreply, Chs2}.

    In this case, the new state is the updated list of available channels Chs2. +{noreply,State1}. State1 is a new value for the state of the gen_server.

    handle_cast({free, Ch}, Chs) ->
    +    Chs2 = free(Ch, Chs),
    +    {noreply, Chs2}.

    In this case, the new state is the updated list of available channels Chs2. The gen_server is now ready for new requests.

    @@ -261,15 +261,15 @@ set in the supervisor.

    If it is necessary to clean up before termination, the shutdown strategy must be a time-out value and the gen_server must be set to trap exit signals in function init. When ordered to shutdown, the gen_server then calls -the callback function terminate(shutdown, State):

    init(Args) ->
    +the callback function terminate(shutdown, State):

    init(Args) ->
         ...,
    -    process_flag(trap_exit, true),
    +    process_flag(trap_exit, true),
         ...,
    -    {ok, State}.
    +    {ok, State}.
     
     ...
     
    -terminate(shutdown, State) ->
    +terminate(shutdown, State) ->
         %% Code for cleaning up here
         ...
         ok.

    @@ -280,21 +280,21 @@

    If the gen_server is not part of a supervision tree, a stop function can be useful, for example:

    ...
    -export([stop/0]).
    +export([stop/0]).
     ...
     
    -stop() ->
    -    gen_server:cast(ch3, stop).
    +stop() ->
    +    gen_server:cast(ch3, stop).
     ...
     
    -handle_cast(stop, State) ->
    -    {stop, normal, State};
    -handle_cast({free, Ch}, State) ->
    +handle_cast(stop, State) ->
    +    {stop, normal, State};
    +handle_cast({free, Ch}, State) ->
         ...
     
     ...
     
    -terminate(normal, State) ->
    +terminate(normal, State) ->
         ok.

    The callback function handling the stop request returns a tuple {stop,normal,State1}, where normal specifies that it is a normal termination and State1 is a new value for the state @@ -309,13 +309,13 @@ the callback function handle_info(Info, State) must be implemented to handle them. Examples of other messages are exit messages, if the gen_server is linked to other processes than the supervisor -and it is trapping exit signals.

    handle_info({'EXIT', Pid, Reason}, State) ->
    +and it is trapping exit signals.

    handle_info({'EXIT', Pid, Reason}, State) ->
         %% Code to handle exits here.
         ...
    -    {noreply, State1}.

    The final function to implement is code_change/3:

    code_change(OldVsn, State, Extra) ->
    +    {noreply, State1}.

    The final function to implement is code_change/3:

    code_change(OldVsn, State, Extra) ->
         %% Code to convert state (and more) during code change.
         ...
    -    {ok, NewState}.
    +
    {ok, NewState}.
    @@ -366,7 +366,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/doc/system/getting_started.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/getting_started.html 2025-05-10 20:18:58.617095337 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/getting_started.html 2025-05-10 20:18:58.617095337 +0000 @@ -185,7 +185,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/doc/system/included_applications.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/included_applications.html 2025-05-10 20:18:58.637095519 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/included_applications.html 2025-05-10 20:18:58.641095555 +0000 @@ -165,16 +165,16 @@ Specifying Included Applications

    Which applications to include is defined by the included_applications key in -the .app file:

    {application, prim_app,
    - [{description, "Tree application"},
    -  {vsn, "1"},
    -  {modules, [prim_app_cb, prim_app_sup, prim_app_server]},
    -  {registered, [prim_app_server]},
    -  {included_applications, [incl_app]},
    -  {applications, [kernel, stdlib, sasl]},
    -  {mod, {prim_app_cb,[]}},
    -  {env, [{file, "/usr/local/log"}]}
    - ]}.

    +the .app file:

    {application, prim_app,
    + [{description, "Tree application"},
    +  {vsn, "1"},
    +  {modules, [prim_app_cb, prim_app_sup, prim_app_server]},
    +  {registered, [prim_app_server]},
    +  {included_applications, [incl_app]},
    +  {applications, [kernel, stdlib, sasl]},
    +  {mod, {prim_app_cb,[]}},
    +  {env, [{file, "/usr/local/log"}]}
    + ]}.

    @@ -188,27 +188,27 @@ term.

    The value of the mod key of the including application must be set to {application_starter,[Module,StartArgs]}, where Module as usual is the application callback module. StartArgs is a term provided as argument to the -callback function Module:start/2:

    {application, prim_app,
    - [{description, "Tree application"},
    -  {vsn, "1"},
    -  {modules, [prim_app_cb, prim_app_sup, prim_app_server]},
    -  {registered, [prim_app_server]},
    -  {included_applications, [incl_app]},
    -  {start_phases, [{init,[]}, {go,[]}]},
    -  {applications, [kernel, stdlib, sasl]},
    -  {mod, {application_starter,[prim_app_cb,[]]}},
    -  {env, [{file, "/usr/local/log"}]}
    - ]}.
    -
    -{application, incl_app,
    - [{description, "Included application"},
    -  {vsn, "1"},
    -  {modules, [incl_app_cb, incl_app_sup, incl_app_server]},
    -  {registered, []},
    -  {start_phases, [{go,[]}]},
    -  {applications, [kernel, stdlib, sasl]},
    -  {mod, {incl_app_cb,[]}}
    - ]}.

    When starting a primary application with included applications, the primary +callback function Module:start/2:

    {application, prim_app,
    + [{description, "Tree application"},
    +  {vsn, "1"},
    +  {modules, [prim_app_cb, prim_app_sup, prim_app_server]},
    +  {registered, [prim_app_server]},
    +  {included_applications, [incl_app]},
    +  {start_phases, [{init,[]}, {go,[]}]},
    +  {applications, [kernel, stdlib, sasl]},
    +  {mod, {application_starter,[prim_app_cb,[]]}},
    +  {env, [{file, "/usr/local/log"}]}
    + ]}.
    +
    +{application, incl_app,
    + [{description, "Included application"},
    +  {vsn, "1"},
    +  {modules, [incl_app_cb, incl_app_sup, incl_app_server]},
    +  {registered, []},
    +  {start_phases, [{go,[]}]},
    +  {applications, [kernel, stdlib, sasl]},
    +  {mod, {incl_app_cb,[]}}
    + ]}.

    When starting a primary application with included applications, the primary application is started the normal way, that is:

    • The application controller creates an application master for the application
    • The application master calls Module:start(normal, StartArgs) to start the top supervisor.

    Then, for the primary application and each included application in top-down, left-to-right order, the application master calls @@ -221,11 +221,11 @@ of specified phases must be a subset of the set of phases specified for the primary application.

    When starting prim_app as defined above, the application controller calls the following callback functions before application:start(prim_app) returns a -value:

    application:start(prim_app)
    - => prim_app_cb:start(normal, [])
    - => prim_app_cb:start_phase(init, normal, [])
    - => prim_app_cb:start_phase(go, normal, [])
    - => incl_app_cb:start_phase(go, normal, [])
    +value:

    application:start(prim_app)
    + => prim_app_cb:start(normal, [])
    + => prim_app_cb:start_phase(init, normal, [])
    + => prim_app_cb:start_phase(go, normal, [])
    + => incl_app_cb:start_phase(go, normal, [])
     ok
    @@ -277,7 +277,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/doc/system/install-cross.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/install-cross.html 2025-05-10 20:18:58.665095773 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/install-cross.html 2025-05-10 20:18:58.673095845 +0000 @@ -488,7 +488,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/doc/system/install-win32.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/install-win32.html 2025-05-10 20:18:58.697096063 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/install-win32.html 2025-05-10 20:18:58.701096099 +0000 @@ -299,7 +299,7 @@

    and sometimes

    $ cd $ERL_TOP
     $ make local_setup
     

    So now when you run $ERL_TOP/erl.exe, you should have a debug compiled -emulator, which you will see if you do a:

    1> erlang:system_info(system_version).

    in the erlang shell. If the returned string contains [debug], you +emulator, which you will see if you do a:

    1> erlang:system_info(system_version).

    in the erlang shell. If the returned string contains [debug], you got a debug compiled emulator.

    To hack the erlang libraries, you simply do a make opt in the specific "applications" directory, like:

    $ cd $ERL_TOP/lib/stdlib
     $ make opt
    @@ -322,11 +322,11 @@
     

    Remember that:

    • Windows specific C-code goes in the $ERL_TOP/erts/emulator/sys/win32, $ERL_TOP/erts/emulator/drivers/win32 or $ERL_TOP/erts/etc/win32.

    • Windows specific erlang code should be used conditionally and the host OS tested in runtime, the exactly same beam files should be -distributed for every platform! So write code like:

      case os:type() of
      -    {win32,_} ->
      -        do_windows_specific();
      +distributed for every platform! So write code like:

      case os:type() of
      +    {win32,_} ->
      +        do_windows_specific();
           Other ->
      -        do_fallback_or_exit()
      +        do_fallback_or_exit()
       end,

    That's basically all you need to get going.

    @@ -435,7 +435,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/doc/system/install.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/install.html 2025-05-10 20:18:58.729096353 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/install.html 2025-05-10 20:18:58.741096461 +0000 @@ -661,7 +661,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/doc/system/installation_guide.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/system/installation_guide.html 2025-05-10 20:18:58.761096643 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/installation_guide.html 2025-05-10 20:18:58.761096643 +0000 @@ -175,7 +175,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/doc/system/list_comprehensions.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/list_comprehensions.html 2025-05-10 20:18:58.785096860 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/list_comprehensions.html 2025-05-10 20:18:58.793096933 +0000 @@ -121,25 +121,25 @@ Simple Examples

    -

    This section starts with a simple example, showing a generator and a filter:

    > [X || X <- [1,2,a,3,4,b,5,6], X > 3].
    -[a,4,b,5,6]

    This is read as follows: The list of X such that X is taken from the list +

    This section starts with a simple example, showing a generator and a filter:

    > [X || X <- [1,2,a,3,4,b,5,6], X > 3].
    +[a,4,b,5,6]

    This is read as follows: The list of X such that X is taken from the list [1,2,a,...] and X is greater than 3.

    The notation X <- [1,2,a,...] is a generator and the expression X > 3 is a filter.

    An additional filter, is_integer(X), can be added to -restrict the result to integers:

    > [X || X <- [1,2,a,3,4,b,5,6], is_integer(X), X > 3].
    -[4,5,6]

    Generators can be combined. For example, the Cartesian product of two lists can -be written as follows:

    > [{X, Y} || X <- [1,2,3], Y <- [a,b]].
    -[{1,a},{1,b},{2,a},{2,b},{3,a},{3,b}]

    +restrict the result to integers:

    > [X || X <- [1,2,a,3,4,b,5,6], is_integer(X), X > 3].
    +[4,5,6]

    Generators can be combined. For example, the Cartesian product of two lists can +be written as follows:

    > [{X, Y} || X <- [1,2,3], Y <- [a,b]].
    +[{1,a},{1,b},{2,a},{2,b},{3,a},{3,b}]

    Quick Sort

    -

    The well-known quick sort routine can be written as follows:

    sort([]) -> [];
    -sort([_] = L) -> L;
    -sort([Pivot|T]) ->
    -    sort([ X || X <- T, X < Pivot]) ++
    -    [Pivot] ++
    -    sort([ X || X <- T, X >= Pivot]).

    The expression [X || X <- T, X < Pivot] is the list of all elements in T +

    The well-known quick sort routine can be written as follows:

    sort([]) -> [];
    +sort([_] = L) -> L;
    +sort([Pivot|T]) ->
    +    sort([ X || X <- T, X < Pivot]) ++
    +    [Pivot] ++
    +    sort([ X || X <- T, X >= Pivot]).

    The expression [X || X <- T, X < Pivot] is the list of all elements in T that are less than Pivot.

    [X || X <- T, X >= Pivot] is the list of all elements in T that are greater than or equal to Pivot.

    With the algorithm above, a list is sorted as follows:

    • A list with zero or one element is trivially sorted.
    • For lists with more than one element:
      1. The first element in the list is isolated as the pivot element.
      2. The remaining list is partitioned into two sublists, such that:
      • The first sublist contains all elements that are smaller than the pivot element.
      • The second sublist contains all elements that are greater than or equal to @@ -155,11 +155,11 @@ Permutations -

        The following example generates all permutations of the elements in a list:

        perms([]) -> [[]];
        -perms(L)  -> [[H|T] || H <- L, T <- perms(L--[H])].

        This takes H from L in all possible ways. The result is the set of all lists +

        The following example generates all permutations of the elements in a list:

        perms([]) -> [[]];
        +perms(L)  -> [[H|T] || H <- L, T <- perms(L--[H])].

        This takes H from L in all possible ways. The result is the set of all lists [H|T], where T is the set of all possible permutations of L, with H -removed:

        > perms([b,u,g]).
        -[[b,u,g],[b,g,u],[u,b,g],[u,g,b],[g,b,u],[g,u,b]]

        +removed:

        > perms([b,u,g]).
        +[[b,u,g],[b,g,u],[u,b,g],[u,g,b],[g,b,u],[g,u,b]]

        @@ -168,47 +168,47 @@

        Pythagorean triplets are sets of integers {A,B,C} such that A**2 + B**2 = C**2.

        The function pyth(N) generates a list of all integers {A,B,C} such that A**2 + B**2 = C**2 and where the sum of the sides is equal to, or less than, -N:

        pyth(N) ->
        -    [ {A,B,C} ||
        -        A <- lists:seq(1,N),
        -        B <- lists:seq(1,N),
        -        C <- lists:seq(1,N),
        +N:

        pyth(N) ->
        +    [ {A,B,C} ||
        +        A <- lists:seq(1,N),
        +        B <- lists:seq(1,N),
        +        C <- lists:seq(1,N),
                 A+B+C =< N,
                 A*A+B*B == C*C
        -    ].
        > pyth(3).
        -[].
        -> pyth(11).
        -[].
        -> pyth(12).
        -[{3,4,5},{4,3,5}]
        -> pyth(50).
        -[{3,4,5},
        - {4,3,5},
        - {5,12,13},
        - {6,8,10},
        - {8,6,10},
        - {8,15,17},
        - {9,12,15},
        - {12,5,13},
        - {12,9,15},
        - {12,16,20},
        - {15,8,17},
        - {16,12,20}]

        The following code reduces the search space and is more efficient:

        pyth1(N) ->
        -   [{A,B,C} ||
        -       A <- lists:seq(1,N-2),
        -       B <- lists:seq(A+1,N-1),
        -       C <- lists:seq(B+1,N),
        +    ].
        > pyth(3).
        +[].
        +> pyth(11).
        +[].
        +> pyth(12).
        +[{3,4,5},{4,3,5}]
        +> pyth(50).
        +[{3,4,5},
        + {4,3,5},
        + {5,12,13},
        + {6,8,10},
        + {8,6,10},
        + {8,15,17},
        + {9,12,15},
        + {12,5,13},
        + {12,9,15},
        + {12,16,20},
        + {15,8,17},
        + {16,12,20}]

        The following code reduces the search space and is more efficient:

        pyth1(N) ->
        +   [{A,B,C} ||
        +       A <- lists:seq(1,N-2),
        +       B <- lists:seq(A+1,N-1),
        +       C <- lists:seq(B+1,N),
                A+B+C =< N,
        -       A*A+B*B == C*C ].

        + A*A+B*B == C*C ].

        Simplifications With List Comprehensions

        As an example, list comprehensions can be used to simplify some of the functions -in lists.erl:

        append(L)   ->  [X || L1 <- L, X <- L1].
        -map(Fun, L) -> [Fun(X) || X <- L].
        -filter(Pred, L) -> [X || X <- L, Pred(X)].

        +in lists.erl:

        append(L)   ->  [X || L1 <- L, X <- L1].
        +map(Fun, L) -> [Fun(X) || X <- L].
        +filter(Pred, L) -> [X || X <- L, Pred(X)].

        @@ -220,20 +220,20 @@ which selects certain elements from a list of tuples. Suppose you write select(X, L) -> [Y || {X, Y} <- L]. with the intention of extracting all tuples from L, where the first item is X.

        Compiling this gives the following diagnostic:

        ./FileName.erl:Line: Warning: variable 'X' shadowed in generate

        This diagnostic warns that the variable X in the pattern is not the same as -the variable X that occurs in the function head.

        Evaluating select gives the following result:

        > select(b,[{a,1},{b,2},{c,3},{b,7}]).
        -[1,2,3,7]

        This is not the wanted result. To achieve the desired effect, select must be -written as follows:

        select(X, L) ->  [Y || {X1, Y} <- L, X == X1].

        The generator now contains unbound variables and the test has been moved into -the filter.

        This now works as expected:

        > select(b,[{a,1},{b,2},{c,3},{b,7}]).
        -[2,7]

        Also note that a variable in a generator pattern will shadow a variable with the -same name bound in a previous generator pattern. For example:

        > [{X,Y} || X <- [1,2,3], X=Y <- [a,b,c]].
        -[{a,a},{b,b},{c,c},{a,a},{b,b},{c,c},{a,a},{b,b},{c,c}]

        A consequence of the rules for importing variables into a list comprehensions is +the variable X that occurs in the function head.

        Evaluating select gives the following result:

        > select(b,[{a,1},{b,2},{c,3},{b,7}]).
        +[1,2,3,7]

        This is not the wanted result. To achieve the desired effect, select must be +written as follows:

        select(X, L) ->  [Y || {X1, Y} <- L, X == X1].

        The generator now contains unbound variables and the test has been moved into +the filter.

        This now works as expected:

        > select(b,[{a,1},{b,2},{c,3},{b,7}]).
        +[2,7]

        Also note that a variable in a generator pattern will shadow a variable with the +same name bound in a previous generator pattern. For example:

        > [{X,Y} || X <- [1,2,3], X=Y <- [a,b,c]].
        +[{a,a},{b,b},{c,c},{a,a},{b,b},{c,c},{a,a},{b,b},{c,c}]

        A consequence of the rules for importing variables into a list comprehensions is that certain pattern matching operations must be moved into the filters and -cannot be written directly in the generators.

        To illustrate this, do not write as follows:

        f(...) ->
        +cannot be written directly in the generators.

        To illustrate this, do not write as follows:

        f(...) ->
             Y = ...
        -    [ Expression || PatternInvolving Y  <- Expr, ...]
        -    ...

        Instead, write as follows:

        f(...) ->
        +    [ Expression || PatternInvolving Y  <- Expr, ...]
        +    ...

        Instead, write as follows:

        f(...) ->
             Y = ...
        -    [ Expression || PatternInvolving Y1  <- Expr, Y == Y1, ...]
        +    [ Expression || PatternInvolving Y1  <- Expr, Y == Y1, ...]
             ...
        @@ -285,7 +285,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/doc/system/listhandling.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/listhandling.html 2025-05-10 20:18:58.813097114 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/listhandling.html 2025-05-10 20:18:58.821097187 +0000 @@ -124,47 +124,47 @@

        Lists can only be built starting from the end and attaching list elements at the beginning. If you use the ++ operator as follows, a new list is created that is a copy of the elements in List1, followed by List2:

        List1 ++ List2

        Looking at how lists:append/2 or ++ would be implemented in plain Erlang, -clearly the first list is copied:

        append([H|T], Tail) ->
        -    [H|append(T, Tail)];
        -append([], Tail) ->
        +clearly the first list is copied:

        append([H|T], Tail) ->
        +    [H|append(T, Tail)];
        +append([], Tail) ->
             Tail.

        When recursing and building a list, it is important to ensure that you attach the new elements to the beginning of the list. In this way, you will build one -list, not hundreds or thousands of copies of the growing result list.

        Let us first see how it is not to be done:

        DO NOT

        bad_fib(N) ->
        -    bad_fib(N, 0, 1, []).
        +list, not hundreds or thousands of copies of the growing result list.

        Let us first see how it is not to be done:

        DO NOT

        bad_fib(N) ->
        +    bad_fib(N, 0, 1, []).
         
        -bad_fib(0, _Current, _Next, Fibs) ->
        +bad_fib(0, _Current, _Next, Fibs) ->
             Fibs;
        -bad_fib(N, Current, Next, Fibs) ->
        -    bad_fib(N - 1, Next, Current + Next, Fibs ++ [Current]).

        Here more than one list is built. In each iteration step a new list is created +bad_fib(N, Current, Next, Fibs) -> + bad_fib(N - 1, Next, Current + Next, Fibs ++ [Current]).

        Here more than one list is built. In each iteration step a new list is created that is one element longer than the new previous list.

        To avoid copying the result in each iteration, build the list in reverse order -and reverse the list when you are done:

        DO

        tail_recursive_fib(N) ->
        -    tail_recursive_fib(N, 0, 1, []).
        +and reverse the list when you are done:

        DO

        tail_recursive_fib(N) ->
        +    tail_recursive_fib(N, 0, 1, []).
         
        -tail_recursive_fib(0, _Current, _Next, Fibs) ->
        -    lists:reverse(Fibs);
        -tail_recursive_fib(N, Current, Next, Fibs) ->
        -    tail_recursive_fib(N - 1, Next, Current + Next, [Current|Fibs]).

        +tail_recursive_fib(0, _Current, _Next, Fibs) -> + lists:reverse(Fibs); +tail_recursive_fib(N, Current, Next, Fibs) -> + tail_recursive_fib(N - 1, Next, Current + Next, [Current|Fibs]).

        List Comprehensions

        -

        A list comprehension:

        [Expr(E) || E <- List]

        is basically translated to a local function:

        'lc^0'([E|Tail], Expr) ->
        -    [Expr(E)|'lc^0'(Tail, Expr)];
        -'lc^0'([], _Expr) -> [].

        If the result of the list comprehension will obviously not be used, a list -will not be constructed. For example, in this code:

        [io:put_chars(E) || E <- List],
        +

        A list comprehension:

        [Expr(E) || E <- List]

        is basically translated to a local function:

        'lc^0'([E|Tail], Expr) ->
        +    [Expr(E)|'lc^0'(Tail, Expr)];
        +'lc^0'([], _Expr) -> [].

        If the result of the list comprehension will obviously not be used, a list +will not be constructed. For example, in this code:

        [io:put_chars(E) || E <- List],
         ok.

        or in this code:

        case Var of
             ... ->
        -        [io:put_chars(E) || E <- List];
        +        [io:put_chars(E) || E <- List];
             ... ->
         end,
        -some_function(...),

        the value is not assigned to a variable, not passed to another function, and not +some_function(...),

        the value is not assigned to a variable, not passed to another function, and not returned. This means that there is no need to construct a list and the compiler -will simplify the code for the list comprehension to:

        'lc^0'([E|Tail], Expr) ->
        -    Expr(E),
        -    'lc^0'(Tail, Expr);
        -'lc^0'([], _Expr) -> [].

        The compiler also understands that assigning to _ means that the value will -not be used. Therefore, the code in the following example will also be optimized:

        _ = [io:put_chars(E) || E <- List],
        +will simplify the code for the list comprehension to:

        'lc^0'([E|Tail], Expr) ->
        +    Expr(E),
        +    'lc^0'(Tail, Expr);
        +'lc^0'([], _Expr) -> [].

        The compiler also understands that assigning to _ means that the value will +not be used. Therefore, the code in the following example will also be optimized:

        _ = [io:put_chars(E) || E <- List],
         ok.

        @@ -177,11 +177,11 @@ to flatten the list before sending it to the port.

      • When calling BIFs that accept deep lists, such as list_to_binary/1 or iolist_to_binary/1.
      • When you know that your list is only one level deep. Use lists:append/1 -instead.

      Examples:

      DO

      port_command(Port, DeepList)

      DO NOT

      port_command(Port, lists:flatten(DeepList))

      A common way to send a zero-terminated string to a port is the following:

      DO NOT

      TerminatedStr = String ++ [0],
      -port_command(Port, TerminatedStr)

      Instead:

      DO

      TerminatedStr = [String, 0],
      -port_command(Port, TerminatedStr)

      DO

      1> lists:append([[1], [2], [3]]).
      -[1,2,3]

      DO NOT

      1> lists:flatten([[1], [2], [3]]).
      -[1,2,3]

      +instead.

    Examples:

    DO

    port_command(Port, DeepList)

    DO NOT

    port_command(Port, lists:flatten(DeepList))

    A common way to send a zero-terminated string to a port is the following:

    DO NOT

    TerminatedStr = String ++ [0],
    +port_command(Port, TerminatedStr)

    Instead:

    DO

    TerminatedStr = [String, 0],
    +port_command(Port, TerminatedStr)

    DO

    1> lists:append([[1], [2], [3]]).
    +[1,2,3]

    DO NOT

    1> lists:flatten([[1], [2], [3]]).
    +[1,2,3]

    @@ -189,17 +189,17 @@

    There are two basic ways to write a function that traverses a list and produces a new list.

    The first way is writing a body-recursive function:

    %% Add 42 to each integer in the list.
    -add_42_body([H|T]) ->
    -    [H + 42 | add_42_body(T)];
    -add_42_body([]) ->
    -    [].

    The second way is writing a tail-recursive function:

    %% Add 42 to each integer in the list.
    -add_42_tail(List) ->
    -    add_42_tail(List, []).
    -
    -add_42_tail([H|T], Acc) ->
    -    add_42_tail(T, [H + 42 | Acc]);
    -add_42_tail([], Acc) ->
    -    lists:reverse(Acc).

    In early version of Erlang the tail-recursive function would typically +add_42_body([H|T]) -> + [H + 42 | add_42_body(T)]; +add_42_body([]) -> + [].

    The second way is writing a tail-recursive function:

    %% Add 42 to each integer in the list.
    +add_42_tail(List) ->
    +    add_42_tail(List, []).
    +
    +add_42_tail([H|T], Acc) ->
    +    add_42_tail(T, [H + 42 | Acc]);
    +add_42_tail([], Acc) ->
    +    lists:reverse(Acc).

    In early version of Erlang the tail-recursive function would typically be more efficient. In modern versions of Erlang, there is usually not much difference in performance between a body-recursive list function and tail-recursive function that reverses the list at the end. Therefore, @@ -210,11 +210,11 @@ function that does not construct a list runs in constant space, while the corresponding body-recursive function uses stack space proportional to the length of the list.

    For example, a function that sums a list of integers, is not to be written as -follows:

    DO NOT

    recursive_sum([H|T]) -> H+recursive_sum(T);
    -recursive_sum([])    -> 0.

    Instead:

    DO

    sum(L) -> sum(L, 0).
    +follows:

    DO NOT

    recursive_sum([H|T]) -> H+recursive_sum(T);
    +recursive_sum([])    -> 0.

    Instead:

    DO

    sum(L) -> sum(L, 0).
     
    -sum([H|T], Sum) -> sum(T, Sum + H);
    -sum([], Sum)    -> Sum.
    +
    sum([H|T], Sum) -> sum(T, Sum + H); +sum([], Sum) -> Sum.
    @@ -265,7 +265,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/doc/system/macros.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/macros.html 2025-05-10 20:18:58.845097404 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/macros.html 2025-05-10 20:18:58.849097440 +0000 @@ -121,8 +121,8 @@ File Inclusion -

    A file can be included as follows:

    -include(File).
    --include_lib(File).

    File, a string, is to point out a file. The contents of this file are included +

    A file can be included as follows:

    -include(File).
    +-include_lib(File).

    File, a string, is to point out a file. The contents of this file are included as is, at the position of the directive.

    Include files are typically used for record and macro definitions that are shared by several modules. It is recommended to use the file name extension .hrl for include files.

    File can start with a path component $VAR, for some string VAR. If that is @@ -131,12 +131,12 @@ $VAR is left as is.

    If the filename File is absolute (possibly after variable substitution), the include file with that name is included. Otherwise, the specified file is searched for in the following directories, and in this order:

    1. The current working directory
    2. The directory where the module is being compiled
    3. The directories given by the include option

    For details, see erlc in ERTS and -compile in Compiler.

    Examples:

    -include("my_records.hrl").
    --include("incdir/my_records.hrl").
    --include("/home/user/proj/my_records.hrl").
    --include("$PROJ_ROOT/my_records.hrl").

    include_lib is similar to include, but is not to point out an absolute file. +compile in Compiler.

    Examples:

    -include("my_records.hrl").
    +-include("incdir/my_records.hrl").
    +-include("/home/user/proj/my_records.hrl").
    +-include("$PROJ_ROOT/my_records.hrl").

    include_lib is similar to include, but is not to point out an absolute file. Instead, the first path component (possibly after variable substitution) is -assumed to be the name of an application.

    Example:

    -include_lib("kernel/include/file.hrl").

    The code server uses code:lib_dir(kernel) to find the directory of the current +assumed to be the name of an application.

    Example:

    -include_lib("kernel/include/file.hrl").

    The code server uses code:lib_dir(kernel) to find the directory of the current (latest) version of Kernel, and then the subdirectory include is searched for the file file.hrl.

    @@ -144,25 +144,25 @@ Defining and Using Macros

    -

    A macro is defined as follows:

    -define(Const, Replacement).
    --define(Func(Var1,...,VarN), Replacement).

    A macro definition can be placed anywhere among the attributes and function +

    A macro is defined as follows:

    -define(Const, Replacement).
    +-define(Func(Var1,...,VarN), Replacement).

    A macro definition can be placed anywhere among the attributes and function declarations of a module, but the definition must come before any usage of the macro.

    If a macro is used in several modules, it is recommended that the macro definition is placed in an include file.

    A macro is used as follows:

    ?Const
     ?Func(Arg1,...,ArgN)

    Macros are expanded during compilation. A simple macro ?Const is replaced with -Replacement.

    Example:

    -define(TIMEOUT, 200).
    +Replacement.

    Example:

    -define(TIMEOUT, 200).
     ...
    -call(Request) ->
    -    server:call(refserver, Request, ?TIMEOUT).

    This is expanded to:

    call(Request) ->
    -    server:call(refserver, Request, 200).

    A macro ?Func(Arg1,...,ArgN) is replaced with Replacement, where all +call(Request) -> + server:call(refserver, Request, ?TIMEOUT).

    This is expanded to:

    call(Request) ->
    +    server:call(refserver, Request, 200).

    A macro ?Func(Arg1,...,ArgN) is replaced with Replacement, where all occurrences of a variable Var from the macro definition are replaced with the -corresponding argument Arg.

    Example:

    -define(MACRO1(X, Y), {a, X, b, Y}).
    +corresponding argument Arg.

    Example:

    -define(MACRO1(X, Y), {a, X, b, Y}).
     ...
    -bar(X) ->
    -    ?MACRO1(a, b),
    -    ?MACRO1(X, 123)

    This is expanded to:

    bar(X) ->
    -    {a,a,b,b},
    -    {a,X,b,123}.

    It is good programming practice, but not mandatory, to ensure that a macro +bar(X) -> + ?MACRO1(a, b), + ?MACRO1(X, 123)

    This is expanded to:

    bar(X) ->
    +    {a,a,b,b},
    +    {a,X,b,123}.

    It is good programming practice, but not mandatory, to ensure that a macro definition is a valid Erlang syntactic form.

    To view the result of macro expansion, a module can be compiled with the 'P' option. compile:file(File, ['P']). This produces a listing of the parsed code after preprocessing and parse transforms, in the file File.P.

    @@ -189,21 +189,21 @@

    It is possible to overload macros, except for predefined macros. An overloaded macro has more than one definition, each with a different number of arguments.

    Change

    Support for overloading of macros was added in Erlang 5.7.5/OTP R13B04.

    A macro ?Func(Arg1,...,ArgN) with a (possibly empty) list of arguments results in an error message if there is at least one definition of Func with -arguments, but none with N arguments.

    Assuming these definitions:

    -define(F0(), c).
    --define(F1(A), A).
    --define(C, m:f).

    the following does not work:

    f0() ->
    +arguments, but none with N arguments.

    Assuming these definitions:

    -define(F0(), c).
    +-define(F1(A), A).
    +-define(C, m:f).

    the following does not work:

    f0() ->
         ?F0. % No, an empty list of arguments expected.
     
    -f1(A) ->
    -    ?F1(A, A). % No, exactly one argument expected.

    On the other hand,

    f() ->
    -    ?C().

    is expanded to

    f() ->
    -    m:f().

    +f1(A) -> + ?F1(A, A). % No, exactly one argument expected.

    On the other hand,

    f() ->
    +    ?C().

    is expanded to

    f() ->
    +    m:f().

    Removing a macro definition

    -

    A definition of macro can be removed as follows:

    -undef(Macro).

    +

    A definition of macro can be removed as follows:

    -undef(Macro).

    @@ -223,13 +223,13 @@ elif also supports calling the psuedo-function defined(Name), which tests whether the Name argument is the name of a previously defined macro. defined(Name) evaluates to true if the macro is defined and false -otherwise. An attempt to call other functions results in a compilation error.

    Example:

    -module(m).
    +otherwise. An attempt to call other functions results in a compilation error.

    Example:

    -module(m).
     ...
     
    --ifdef(debug).
    --define(LOG(X), io:format("{~p,~p}: ~p~n", [?MODULE,?LINE,X])).
    +-ifdef(debug).
    +-define(LOG(X), io:format("{~p,~p}: ~p~n", [?MODULE,?LINE,X])).
     -else.
    --define(LOG(X), true).
    +-define(LOG(X), true).
     -endif.
     
     ...

    When trace output is desired, debug is to be defined when the module m is @@ -237,21 +237,21 @@ or -1> c(m, {d, debug}). -{ok,m}

    ?LOG(Arg) is then expanded to a call to io:format/2 and provide the user -with some simple trace output.

    Example:

    -module(m)
    +1> c(m, {d, debug}).
    +{ok,m}

    ?LOG(Arg) is then expanded to a call to io:format/2 and provide the user +with some simple trace output.

    Example:

    -module(m)
     ...
    --if(?OTP_RELEASE >= 25).
    +-if(?OTP_RELEASE >= 25).
     %% Code that will work in OTP 25 or higher
    --elif(?OTP_RELEASE >= 26).
    +-elif(?OTP_RELEASE >= 26).
     %% Code that will work in OTP 26 or higher
     -else.
     %% Code that will work in OTP 24 or lower.
     -endif.
     ...

    This code uses the OTP_RELEASE macro to conditionally select code depending on -release.

    Example:

    -module(m)
    +release.

    Example:

    -module(m)
     ...
    --if(?OTP_RELEASE >= 26 andalso defined(debug)).
    +-if(?OTP_RELEASE >= 26 andalso defined(debug)).
     %% Debugging code that requires OTP 26 or later.
     -else.
     %% Non-debug code that works in any release.
    @@ -274,23 +274,23 @@
       
       -error() and -warning() directives
     

    -

    The directive -error(Term) causes a compilation error.

    Example:

    -module(t).
    --export([version/0]).
    +

    The directive -error(Term) causes a compilation error.

    Example:

    -module(t).
    +-export([version/0]).
     
    --ifdef(VERSION).
    -version() -> ?VERSION.
    +-ifdef(VERSION).
    +version() -> ?VERSION.
     -else.
    --error("Macro VERSION must be defined.").
    -version() -> "".
    +-error("Macro VERSION must be defined.").
    +version() -> "".
     -endif.

    The error message will look like this:

    % erlc t.erl
    -t.erl:7: -error("Macro VERSION must be defined.").

    The directive -warning(Term) causes a compilation warning.

    Example:

    -module(t).
    --export([version/0]).
    +t.erl:7: -error("Macro VERSION must be defined.").

    The directive -warning(Term) causes a compilation warning.

    Example:

    -module(t).
    +-export([version/0]).
     
    --ifndef(VERSION).
    --warning("Macro VERSION not defined -- using default version.").
    --define(VERSION, "0").
    +-ifndef(VERSION).
    +-warning("Macro VERSION not defined -- using default version.").
    +-define(VERSION, "0").
     -endif.
    -version() -> ?VERSION.

    The warning message will look like this:

    % erlc t.erl
    +version() -> ?VERSION.

    The warning message will look like this:

    % erlc t.erl
     t.erl:5: Warning: -warning("Macro VERSION not defined -- using default version.").

    Change

    The -error() and -warning() directives were added in Erlang/OTP 19.

    @@ -299,11 +299,11 @@

    The construction ??Arg, where Arg is a macro argument, is expanded to a string containing the tokens of the argument. This is similar to the #arg -stringifying construction in C.

    Example:

    -define(TESTCALL(Call), io:format("Call ~s: ~w~n", [??Call, Call])).
    +stringifying construction in C.

    Example:

    -define(TESTCALL(Call), io:format("Call ~s: ~w~n", [??Call, Call])).
     
    -?TESTCALL(myfunction(1,2)),
    -?TESTCALL(you:function(2,1)).

    results in

    io:format("Call ~s: ~w~n",["myfunction ( 1 , 2 )",myfunction(1,2)]),
    -io:format("Call ~s: ~w~n",["you : function ( 2 , 1 )",you:function(2,1)]).

    That is, a trace output, with both the function called and the resulting value.

    +
    ?TESTCALL(myfunction(1,2)), +?TESTCALL(you:function(2,1)).

    results in

    io:format("Call ~s: ~w~n",["myfunction ( 1 , 2 )",myfunction(1,2)]),
    +io:format("Call ~s: ~w~n",["you : function ( 2 , 1 )",you:function(2,1)]).

    That is, a trace output, with both the function called and the resulting value.

    @@ -354,7 +354,7 @@ Erlang programming language /usr/share/doc/packages/erlang-doc/doc/system/maps.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/maps.html 2025-05-10 20:18:58.877097694 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/maps.html 2025-05-10 20:18:58.885097766 +0000 @@ -152,8 +152,8 @@ values, sharing of keys between different instances of the map will be less effective, and it is not possible to match multiple elements having default values in one go.

  • To avoid having to deal with a map that may lack some keys, maps:merge/2 can -efficiently add multiple default values. For example:

    DefaultMap = #{shoe_size => 42, editor => emacs},
    -MapWithDefaultsApplied = maps:merge(DefaultMap, OtherMap)
  • +efficiently add multiple default values. For example:

    DefaultMap = #{shoe_size => 42, editor => emacs},
    +MapWithDefaultsApplied = maps:merge(DefaultMap, OtherMap)

    @@ -171,10 +171,10 @@ Using Maps as Sets

    Starting in OTP 24, the sets module has an option to represent sets as maps. -Examples:

    1> sets:new([{version,2}]).
    -#href_anchor"p" data-group-id="8490689915-4">}
    -2> sets:from_list([x,y,z], [{version,2}]).
    -#{x => [],y => [],z => []}

    sets backed by maps is generally the most efficient set representation, with a +Examples:

    1> sets:new([{version,2}]).
    +#href_anchor"p" data-group-id="3577656583-4">}
    +2> sets:from_list([x,y,z], [{version,2}]).
    +#{x => [],y => [],z => []}

    sets backed by maps is generally the most efficient set representation, with a few possible exceptions:

    • ordsets:intersection/2 can be more efficient than sets:intersection/2. If the intersection operation is frequently used and operations that operate on a single element in a set (such as is_element/2) are avoided, ordsets can @@ -207,10 +207,10 @@ allowing the key tuple to be shared with other instances of the map that have the same keys. In fact, the key tuple can be shared between all maps with the same keys with some care. To arrange that, define a function that returns a map. -For example:

      new() ->
      -    #{a => default, b => default, c => default}.

      Defined like this, the key tuple {a,b,c} will be a global literal. To ensure +For example:

      new() ->
      +    #{a => default, b => default, c => default}.

      Defined like this, the key tuple {a,b,c} will be a global literal. To ensure that the key tuple is shared when creating an instance of the map, always call -new() and modify the returned map:

          (SOME_MODULE:new())#{a := 42}.

      Using the map syntax with small maps is particularly efficient. As long as the +new() and modify the returned map:

          (SOME_MODULE:new())#{a := 42}.

      Using the map syntax with small maps is particularly efficient. As long as the keys are known at compile-time, the map is updated in one go, making the time to update a map essentially constant regardless of the number of keys updated. The same goes for matching. (When the keys are variables, one or more of the keys @@ -245,13 +245,13 @@

      Using the map syntax is usually slightly more efficient than using the corresponding function in the maps module.

      The gain in efficiency for the map syntax is more noticeable for the following -operations that can only be achieved using the map syntax:

      • Matching multiple literal keys
      • Updating multiple literal keys
      • Adding multiple literal keys to a map

      For example:

      DO

      Map = Map1#href_anchor"ss">x := X, y := Y, z := Z}

      DO NOT

      Map2 = maps:update(x, X, Map1),
      -Map3 = maps:update(y, Y, Map2),
      -Map = maps:update(z, Z, Map3)

      If the map is a small map, the first example runs roughly three times as fast.

      Note that for variable keys, the elements are updated sequentially from left to -right. For example, given the following update with variable keys:

      Map = Map1#{Key1 := X, Key2 := Y, Key3 := Z}

      the compiler rewrites it like this to ensure that the updates are applied from -left to right:

      Map2 = Map1#{Key1 := X},
      -Map3 = Map2#{Key2 := Y},
      -Map = Map3#{Key3 := Z}

      If a key is known to exist in a map, using the := operator is slightly more +operations that can only be achieved using the map syntax:

      • Matching multiple literal keys
      • Updating multiple literal keys
      • Adding multiple literal keys to a map

      For example:

      DO

      Map = Map1#href_anchor"ss">x := X, y := Y, z := Z}

      DO NOT

      Map2 = maps:update(x, X, Map1),
      +Map3 = maps:update(y, Y, Map2),
      +Map = maps:update(z, Z, Map3)

      If the map is a small map, the first example runs roughly three times as fast.

      Note that for variable keys, the elements are updated sequentially from left to +right. For example, given the following update with variable keys:

      Map = Map1#{Key1 := X, Key2 := Y, Key3 := Z}

      the compiler rewrites it like this to ensure that the updates are applied from +left to right:

      Map2 = Map1#{Key1 := X},
      +Map3 = Map2#{Key2 := Y},
      +Map = Map3#{Key3 := Z}

      If a key is known to exist in a map, using the := operator is slightly more efficient than using the => operator for a small map.

      @@ -310,15 +310,15 @@

      As an optimization, the compiler will rewrite a call to maps:get/3 to Erlang code similar to the following:

      Result = case Map of
      -             #{Key := Value} -> Value;
      -             #{} -> Default
      +             #{Key := Value} -> Value;
      +             #{} -> Default
                end

      This is reasonably efficient, but if a small map is used as an alternative to using a record it is often better not to rely on default values as it prevents sharing of keys, which may in the end use more memory than what you save from not storing default values in the map.

      If default values are nevertheless required, instead of calling maps:get/3 multiple times, consider putting the default values in a map and merging that -map with the other map:

      DefaultMap = #{Key1 => Value2, Key2 => Value2, ..., KeyN => ValueN},
      -MapWithDefaultsApplied = maps:merge(DefaultMap, OtherMap)

      This helps share keys between the default map and the one you applied defaults +map with the other map:

      DefaultMap = #{Key1 => Value2, Key2 => Value2, ..., KeyN => ValueN},
      +MapWithDefaultsApplied = maps:merge(DefaultMap, OtherMap)

      This helps share keys between the default map and the one you applied defaults to, as long as the default map contains all the keys that will ever be used and not just the ones with default values. Whether this is faster than calling maps:get/3 multiple times depends on the size of the map and the number of @@ -523,7 +523,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/doc/system/memory.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/system/memory.html 2025-05-10 20:18:58.901097912 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/memory.html 2025-05-10 20:18:58.905097948 +0000 @@ -222,7 +222,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/doc/system/misc.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/misc.html 2025-05-10 20:18:58.925098130 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/misc.html 2025-05-10 20:18:58.925098130 +0000 @@ -241,7 +241,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/doc/system/modules.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/modules.html 2025-05-10 20:18:58.949098347 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/modules.html 2025-05-10 20:18:58.953098384 +0000 @@ -122,12 +122,12 @@ Module Syntax

    Erlang code is divided into modules. A module consists of a sequence of -attributes and function declarations, each terminated by a period (.).

    Example:

    -module(m).          % module attribute
    --export([fact/1]).   % module attribute
    +attributes and function declarations, each terminated by a period (.).

    Example:

    -module(m).          % module attribute
    +-export([fact/1]).   % module attribute
     
    -fact(N) when N>0 ->  % beginning of function declaration
    -    N * fact(N-1);   %  |
    -fact(0) ->           %  |
    +fact(N) when N>0 ->  % beginning of function declaration
    +    N * fact(N-1);   %  |
    +fact(0) ->           %  |
         1.               % end of function declaration

    For a description of function declarations, see Function Declaration Syntax.

    @@ -180,9 +180,9 @@ Behaviour Module Attribute

    It is possible to specify that the module is the callback module for a -behaviour:

    -behaviour(Behaviour).

    The atom Behaviour gives the name of the behaviour, which can be a +behaviour:

    -behaviour(Behaviour).

    The atom Behaviour gives the name of the behaviour, which can be a user-defined behaviour or one of the following OTP standard behaviours:

    • gen_server
    • gen_statem
    • gen_event
    • supervisor

    The spelling behavior is also accepted.

    The callback functions of the module can be specified either directly by the -exported function behaviour_info/1:

    behaviour_info(callbacks) -> Callbacks.

    or by a -callback attribute for each callback function:

    -callback Name(Arguments) -> Result.

    Here, Arguments is a list of zero or more arguments. The -callback attribute +exported function behaviour_info/1:

    behaviour_info(callbacks) -> Callbacks.

    or by a -callback attribute for each callback function:

    -callback Name(Arguments) -> Result.

    Here, Arguments is a list of zero or more arguments. The -callback attribute is to be preferred since the extra type information can be used by tools to produce documentation or find discrepancies.

    Read more about behaviours and callback modules in OTP Design Principles.

    @@ -191,7 +191,7 @@ Record Definitions

    -

    The same syntax as for module attributes is used for record definitions:

    -record(Record, Fields).

    Record definitions are allowed anywhere in a module, also among the function +

    The same syntax as for module attributes is used for record definitions:

    -record(Record, Fields).

    Record definitions are allowed anywhere in a module, also among the function declarations. Read more in Records.

    @@ -199,15 +199,15 @@ Preprocessor

    The same syntax as for module attributes is used by the preprocessor, which -supports file inclusion, macros, and conditional compilation:

    -include("SomeFile.hrl").
    --define(Macro, Replacement).

    Read more in Preprocessor.

    +supports file inclusion, macros, and conditional compilation:

    -include("SomeFile.hrl").
    +-define(Macro, Replacement).

    Read more in Preprocessor.

    Setting File and Line

    The same syntax as for module attributes is used for changing the pre-defined -macros ?FILE and ?LINE:

    -file(File, Line).

    This attribute is used by tools, such as Yecc, to inform the compiler that the +macros ?FILE and ?LINE:

    -file(File, Line).

    This attribute is used by tools, such as Yecc, to inform the compiler that the source program is generated by another tool. It also indicates the correspondence of source files to lines of the original user-written file, from which the source program is produced.

    @@ -217,8 +217,8 @@ Types and function specifications

    A similar syntax as for module attributes is used for specifying types and -function specifications:

    -type my_type() :: atom() | integer().
    --spec my_function(integer()) -> integer().

    Read more in Types and Function specifications.

    The description is based on +function specifications:

    -type my_type() :: atom() | integer().
    +-spec my_function(integer()) -> integer().

    Read more in Types and Function specifications.

    The description is based on EEP8 - Types and function specifications, which is not to be further updated.

    @@ -227,16 +227,16 @@ Documentation attributes

    The module attribute -doc(Documentation) is used to provide user documentation -for a function/type/callback:

    -doc("Example documentation").
    -example() -> ok.

    The attribute should be placed just before the entity it documents.The +for a function/type/callback:

    -doc("Example documentation").
    +example() -> ok.

    The attribute should be placed just before the entity it documents.The parenthesis are optional around Documentation. The allowed values for Documentation are:

    • literal string or utf-8 encoded binary string - The string documenting the entity. Any literal string is allowed, so both triple quoted strings and sigils that translate to literal strings can be used. -The following examples are equivalent:

      -doc("Example \"docs\"").
      --doc(<<"Example \"docs\""/utf8>>).
      +The following examples are equivalent:

      -doc("Example \"docs\"").
      +-doc(<<"Example \"docs\""/utf8>>).
       -doc ~S/Example "docs"/.
       -doc """
          Example "docs"
      @@ -257,7 +257,7 @@
       
       

      While not a module attribute, but rather a directive (since it might affect syntax), there is the -feature(..) directive used for enabling and disabling -features.

      The syntax is similar to that of an attribute, but has two arguments:

      -feature(FeatureName, enable | disable).

      Note that the feature directive can only appear +features.

      The syntax is similar to that of an attribute, but has two arguments:

      -feature(FeatureName, enable | disable).

      Note that the feature directive can only appear in a prefix of the module.

      @@ -351,7 +351,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/doc/system/nif.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/nif.html 2025-05-10 20:18:58.973098564 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/nif.html 2025-05-10 20:18:58.977098601 +0000 @@ -137,18 +137,18 @@ they can also be used as fallback implementations for functions that do not have native implementations on some architectures.

      NIF libraries are loaded by calling erlang:load_nif/2, with the name of the shared library as argument. The second argument can be any term that will be -passed on to the library and used for initialization:

      -module(complex6).
      --export([foo/1, bar/1]).
      --nifs([foo/1, bar/1]).
      --on_load(init/0).
      -
      -init() ->
      -    ok = erlang:load_nif("./complex6_nif", 0).
      -
      -foo(_X) ->
      -    erlang:nif_error(nif_library_not_loaded).
      -bar(_Y) ->
      -    erlang:nif_error(nif_library_not_loaded).

      Here, the directive on_load is used to get function init to be automatically +passed on to the library and used for initialization:

      -module(complex6).
      +-export([foo/1, bar/1]).
      +-nifs([foo/1, bar/1]).
      +-on_load(init/0).
      +
      +init() ->
      +    ok = erlang:load_nif("./complex6_nif", 0).
      +
      +foo(_X) ->
      +    erlang:nif_error(nif_library_not_loaded).
      +bar(_Y) ->
      +    erlang:nif_error(nif_library_not_loaded).

      Here, the directive on_load is used to get function init to be automatically called when the module is loaded. If init returns anything other than ok, such when the loading of the NIF library fails in this example, the module is unloaded and calls to functions within it, fail.

      Loading the NIF library overrides the stub implementations and cause calls to @@ -169,35 +169,35 @@ API functions. The environment contains information about the calling Erlang process:

      #include <erl_nif.h>
       
      -extern int foo(int x);
      -extern int bar(int y);
      +extern int foo(int x);
      +extern int bar(int y);
       
      -static ERL_NIF_TERM foo_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
      -{
      +static ERL_NIF_TERM foo_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
      +{
           int x, ret;
      -    if (!enif_get_int(env, argv[0], &x)) {
      -	return enif_make_badarg(env);
      -    }
      -    ret = foo(x);
      -    return enif_make_int(env, ret);
      -}
      +    if (!enif_get_int(env, argv[0], &x)) {
      +	return enif_make_badarg(env);
      +    }
      +    ret = foo(x);
      +    return enif_make_int(env, ret);
      +}
       
      -static ERL_NIF_TERM bar_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
      -{
      +static ERL_NIF_TERM bar_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
      +{
           int y, ret;
      -    if (!enif_get_int(env, argv[0], &y)) {
      -	return enif_make_badarg(env);
      -    }
      -    ret = bar(y);
      -    return enif_make_int(env, ret);
      -}
      -
      -static ErlNifFunc nif_funcs[] = {
      -    {"foo", 1, foo_nif},
      -    {"bar", 1, bar_nif}
      -};
      +    if (!enif_get_int(env, argv[0], &y)) {
      +	return enif_make_badarg(env);
      +    }
      +    ret = bar(y);
      +    return enif_make_int(env, ret);
      +}
      +
      +static ErlNifFunc nif_funcs[] = {
      +    {"foo", 1, foo_nif},
      +    {"bar", 1, bar_nif}
      +};
       
      -ERL_NIF_INIT(complex6, nif_funcs, NULL, NULL, NULL, NULL)

      Here, ERL_NIF_INIT has the following arguments:

      • The first argument must be the name of the Erlang module as a C-identifier. It +ERL_NIF_INIT(complex6, nif_funcs, NULL, NULL, NULL, NULL)

      Here, ERL_NIF_INIT has the following arguments:

      • The first argument must be the name of the Erlang module as a C-identifier. It will be stringified by the macro.
      • The second argument is the array of ErlNifFunc structures containing name, arity, and function pointer of each NIF.
      • The remaining arguments are pointers to callback functions that can be used to initialize the library. They are not used in this simple example, hence they @@ -213,15 +213,15 @@

        Step 1. Compile the C code:

        unix> gcc -o complex6_nif.so -fpic -shared complex.c complex6_nif.c
         windows> cl -LD -MD -Fe complex6_nif.dll complex.c complex6_nif.c

        Step 2: Start Erlang and compile the Erlang code:

        > erl
        -Erlang R13B04 (erts-5.7.5) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
        +Erlang R13B04 (erts-5.7.5) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
         
        -Eshell V5.7.5  (abort with ^G)
        -1> c(complex6).
        -{ok,complex6}

        Step 3: Run the example:

        3> complex6:foo(3).
        +Eshell V5.7.5  (abort with ^G)
        +1> c(complex6).
        +{ok,complex6}

        Step 3: Run the example:

        3> complex6:foo(3).
         4
        -4> complex6:bar(5).
        +4> complex6:bar(5).
         10
        -5> complex6:foo("not an integer").
        +5> complex6:foo("not an integer").
         ** exception error: bad argument
              in function  complex6:foo/1
                 called as comlpex6:foo("not an integer")
        @@ -275,7 +275,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/doc/system/opaques.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/opaques.html 2025-05-10 20:18:58.997098782 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/opaques.html 2025-05-10 20:18:59.001098818 +0000 @@ -126,16 +126,16 @@ The runtime does not check opacity. Dialyzer provides some opacity-checking, but the rest is up to convention.

        This document explains what Erlang opacity is (and the trade-offs involved) via the example of the sets:set() data type. This type was -defined in the sets module like this:

        -opaque set(Element) :: #set{segs :: segs(Element)}.

        OTP 24 changed the definition to the following in -this commit.

        -opaque set(Element) :: #href_anchor"ss">set{segs :: segs(Element)} | #{Element => ?VALUE}.

        And this change was safer and more backwards-compatible than if the type had +defined in the sets module like this:

        -opaque set(Element) :: #set{segs :: segs(Element)}.

        OTP 24 changed the definition to the following in +this commit.

        -opaque set(Element) :: #href_anchor"ss">set{segs :: segs(Element)} | #{Element => ?VALUE}.

        And this change was safer and more backwards-compatible than if the type had been defined with -type instead of -opaque. Here is why: when a module defines an -opaque, the contract is that only the defining module should rely on the definition of the type: no other modules should rely on the definition.

        This means that code that pattern-matched on set as a record/tuple technically broke the contract, and opted in to being potentially broken when the definition of set() changed. Before OTP 24, this code printed ok. In OTP 24 it may -error:

        case sets:new() of
        -    Set when is_tuple(Set) ->
        -        io:format("ok")
        +error:

        case sets:new() of
        +    Set when is_tuple(Set) ->
        +        io:format("ok")
         end.

        When working with an opaque defined in another module, here are some recommendations:

        • Don't examine the underlying type using pattern-matching, guards, or functions that reveal the type, such as tuple_size/1 .
        • Instead, use functions provided by the module for working with the type. For @@ -209,7 +209,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/doc/system/otp-patch-apply.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/otp-patch-apply.html 2025-05-10 20:18:59.021099000 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/otp-patch-apply.html 2025-05-10 20:18:59.025099036 +0000 @@ -205,7 +205,7 @@ Application dependencies are verified among installed applications by otp_patch_apply, but these are not necessarily those actually loaded. By calling system_information:sanity_check() one can validate -dependencies among applications actually loaded.

          1> system_information:sanity_check().
          +dependencies among applications actually loaded.

          1> system_information:sanity_check().
           ok

          Please take a look at the reference of sanity_check() for more information.

          @@ -258,7 +258,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/doc/system/overview.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/overview.html 2025-05-10 20:18:59.045099217 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/overview.html 2025-05-10 20:18:59.049099254 +0000 @@ -311,7 +311,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/doc/system/patterns.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/patterns.html 2025-05-10 20:18:59.065099399 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/patterns.html 2025-05-10 20:18:59.069099435 +0000 @@ -132,10 +132,10 @@
          2 3> X + 1. 3 -4> {X, Y} = {1, 2}. +4> {X, Y} = {1, 2}. ** exception error: no match of right hand side value {1,2} -5> {X, Y} = {2, 3}. -{2,3} +5> {X, Y} = {2, 3}. +{2,3} 6> Y. 3
          @@ -188,7 +188,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/doc/system/ports.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/ports.html 2025-05-10 20:18:59.089099616 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/ports.html 2025-05-10 20:18:59.089099616 +0000 @@ -229,7 +229,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/doc/system/profiling.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/profiling.html 2025-05-10 20:18:59.113099834 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/profiling.html 2025-05-10 20:18:59.117099870 +0000 @@ -315,7 +315,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/doc/system/prog_ex_records.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/prog_ex_records.html 2025-05-10 20:18:59.137100051 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/prog_ex_records.html 2025-05-10 20:18:59.145100123 +0000 @@ -126,17 +126,17 @@ To illustrate these differences, suppose that you want to represent a person with the tuple {Name, Address, Phone}.

          To write functions that manipulate this data, remember the following:

          • The Name field is the first element of the tuple.
          • The Address field is the second element.
          • The Phone field is the third element.

          For example, to extract data from a variable P that contains such a tuple, you can write the following code and then use pattern matching to extract the -relevant fields:

          Name = element(1, P),
          -Address = element(2, P),
          +relevant fields:

          Name = element(1, P),
          +Address = element(2, P),
           ...

          Such code is difficult to read and understand, and errors occur if the numbering of the elements in the tuple is wrong. If the data representation of the fields is changed, by re-ordering, adding, or removing fields, all references to the person tuple must be checked and possibly modified.

          Records allow references to the fields by name, instead of by position. In the -following example, a record instead of a tuple is used to store the data:

          -record(person, {name, phone, address}).

          This enables references to the fields of the record by name. For example, if P +following example, a record instead of a tuple is used to store the data:

          -record(person, {name, phone, address}).

          This enables references to the fields of the record by name. For example, if P is a variable whose value is a person record, the following code access the name and address fields of the records:

          Name = P#person.name,
           Address = P#person.address,
          -...

          Internally, records are represented using tagged tuples:

          {person, Name, Phone, Address}

          +...

          Internally, records are represented using tagged tuples:

          {person, Name, Phone, Address}

          @@ -146,8 +146,8 @@ section. Three fields are included, name, phone, and address. The default values for name and phone is "" and [], respectively. The default value for address is the atom undefined, since no default value is supplied for this -field:

          -record(person, {name = "", phone = [], address}).

          The record must be defined in the shell to enable use of the record syntax in -the examples:

          > rd(person, {name = "", phone = [], address}).
          +field:

          -record(person, {name = "", phone = [], address}).

          The record must be defined in the shell to enable use of the record syntax in +the examples:

          > rd(person, {name = "", phone = [], address}).
           person

          This is because record definitions are only available at compile time, not at runtime. For details on records in the shell, see the shell manual page in STDLIB.

          @@ -156,10 +156,10 @@ Creating a Record

          -

          A new person record is created as follows:

          > #person{phone=[0,8,2,3,4,3,1,2], name="Robert"}.
          -#person{name = "Robert",phone = [0,8,2,3,4,3,1,2],address = undefined}

          As the address field was omitted, its default value is used.

          From Erlang 5.1/OTP R8B, a value to all fields in a record can be set with the -special field _. _ means "all fields not explicitly specified".

          Example:

          > #person{name = "Jakob", _ = '_'}.
          -#person{name = "Jakob",phone = '_',address = '_'}

          It is primarily intended to be used in ets:match/2 and +

          A new person record is created as follows:

          > #person{phone=[0,8,2,3,4,3,1,2], name="Robert"}.
          +#person{name = "Robert",phone = [0,8,2,3,4,3,1,2],address = undefined}

          As the address field was omitted, its default value is used.

          From Erlang 5.1/OTP R8B, a value to all fields in a record can be set with the +special field _. _ means "all fields not explicitly specified".

          Example:

          > #person{name = "Jakob", _ = '_'}.
          +#person{name = "Jakob",phone = '_',address = '_'}

          It is primarily intended to be used in ets:match/2 and mnesia:match_object/3, to set record fields to the atom '_'. (This is a wildcard in ets:match/2.)

          @@ -167,8 +167,8 @@ Accessing a Record Field

          -

          The following example shows how to access a record field:

          > P = #person{name = "Joe", phone = [0,8,2,3,4,3,1,2]}.
          -#person{name = "Joe",phone = [0,8,2,3,4,3,1,2],address = undefined}
          +

          The following example shows how to access a record field:

          > P = #person{name = "Joe", phone = [0,8,2,3,4,3,1,2]}.
          +#person{name = "Joe",phone = [0,8,2,3,4,3,1,2],address = undefined}
           > P#person.name.
           "Joe"

          @@ -176,33 +176,33 @@ Updating a Record

          -

          The following example shows how to update a record:

          > P1 = #person{name="Joe", phone=[1,2,3], address="A street"}.
          -#person{name = "Joe",phone = [1,2,3],address = "A street"}
          -> P2 = P1#person{name="Robert"}.
          -#person{name = "Robert",phone = [1,2,3],address = "A street"}

          +

          The following example shows how to update a record:

          > P1 = #person{name="Joe", phone=[1,2,3], address="A street"}.
          +#person{name = "Joe",phone = [1,2,3],address = "A street"}
          +> P2 = P1#person{name="Robert"}.
          +#person{name = "Robert",phone = [1,2,3],address = "A street"}

          Type Testing

          The following example shows that the guard succeeds if P is record of type -person:

          foo(P) when is_record(P, person) -> a_person;
          -foo(_) -> not_a_person.

          +person:

          foo(P) when is_record(P, person) -> a_person;
          +foo(_) -> not_a_person.

          Pattern Matching

          Matching can be used in combination with records, as shown in the following -example:

          > P3 = #person{name="Joe", phone=[0,0,7], address="A street"}.
          -#person{name = "Joe",phone = [0,0,7],address = "A street"}
          -> #person{name = Name} = P3, Name.
          +example:

          > P3 = #person{name="Joe", phone=[0,0,7], address="A street"}.
          +#person{name = "Joe",phone = [0,0,7],address = "A street"}
          +> #person{name = Name} = P3, Name.
           "Joe"

          The following function takes a list of person records and searches for the -phone number of a person with a particular name:

          find_phone([#person{name=Name, phone=Phone} | _], Name) ->
          -    {found,  Phone};
          -find_phone([_| T], Name) ->
          -    find_phone(T, Name);
          -find_phone([], Name) ->
          +phone number of a person with a particular name:

          find_phone([#person{name=Name, phone=Phone} | _], Name) ->
          +    {found,  Phone};
          +find_phone([_| T], Name) ->
          +    find_phone(T, Name);
          +find_phone([], Name) ->
               not_found.

          The fields referred to in the pattern can be given in any order.

          @@ -211,12 +211,12 @@

          The value of a field in a record can be an instance of a record. Retrieval of nested data can be done stepwise, or in a single step, as shown in the following -example:

          -record(name, {first = "Robert", last = "Ericsson"}).
          --record(person, {name = #name{}, phone}).
          +example:

          -record(name, {first = "Robert", last = "Ericsson"}).
          +-record(person, {name = #name{}, phone}).
           
          -demo() ->
          -  P = #person{name= #name{first="Robert",last="Virding"}, phone=123},
          -  First = (P#person.name)#name.first.

          Here, demo() evaluates to "Robert".

          +demo() -> + P = #person{name= #name{first="Robert",last="Virding"}, phone=123}, + First = (P#person.name)#name.first.

          Here, demo() evaluates to "Robert".

          @@ -234,40 +234,40 @@ %% about the person. %% A {Key, Value} list (default is the empty list). %%------------------------------------------------------------ --record(person, {name, age, phone = [], dict = []}).

          -module(person).
          --include("person.hrl").
          --compile(export_all). % For test purposes only.
          +-record(person, {name, age, phone = [], dict = []}).
          -module(person).
          +-include("person.hrl").
          +-compile(export_all). % For test purposes only.
           
           %% This creates an instance of a person.
           %%   Note: The phone number is not supplied so the
           %%         default value [] will be used.
           
          -make_hacker_without_phone(Name, Age) ->
          -   #person{name = Name, age = Age,
          -           dict = [{computer_knowledge, excellent},
          -                   {drinks, coke}]}.
          +make_hacker_without_phone(Name, Age) ->
          +   #person{name = Name, age = Age,
          +           dict = [{computer_knowledge, excellent},
          +                   {drinks, coke}]}.
           
           %% This demonstrates matching in arguments
           
          -print(#person{name = Name, age = Age,
          -              phone = Phone, dict = Dict}) ->
          -  io:format("Name: ~s, Age: ~w, Phone: ~w ~n"
          -            "Dictionary: ~w.~n", [Name, Age, Phone, Dict]).
          +print(#person{name = Name, age = Age,
          +              phone = Phone, dict = Dict}) ->
          +  io:format("Name: ~s, Age: ~w, Phone: ~w ~n"
          +            "Dictionary: ~w.~n", [Name, Age, Phone, Dict]).
           
           %% Demonstrates type testing, selector, updating.
           
          -birthday(P) when is_record(P, person) ->
          -   P#person{age = P#person.age + 1}.
          +birthday(P) when is_record(P, person) ->
          +   P#person{age = P#person.age + 1}.
           
          -register_two_hackers() ->
          -   Hacker1 = make_hacker_without_phone("Joe", 29),
          -   OldHacker = birthday(Hacker1),
          +register_two_hackers() ->
          +   Hacker1 = make_hacker_without_phone("Joe", 29),
          +   OldHacker = birthday(Hacker1),
              % The central_register_server should have
              % an interface function for this.
          -   central_register_server ! {register_person, Hacker1},
          -   central_register_server ! {register_person,
          -             OldHacker#person{name = "Robert",
          -                              phone = [0,8,3,2,4,5,3,1]}}.
          +
          central_register_server ! {register_person, Hacker1}, + central_register_server ! {register_person, + OldHacker#person{name = "Robert", + phone = [0,8,3,2,4,5,3,1]}}.
          @@ -318,7 +318,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/doc/system/programming_examples.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/system/programming_examples.html 2025-05-10 20:18:59.161100269 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/programming_examples.html 2025-05-10 20:18:59.165100305 +0000 @@ -167,7 +167,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/doc/system/readme.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/system/readme.html 2025-05-10 20:18:59.181100451 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/readme.html 2025-05-10 20:18:59.185100487 +0000 @@ -169,7 +169,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/doc/system/records_macros.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/records_macros.html 2025-05-10 20:18:59.209100704 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/records_macros.html 2025-05-10 20:18:59.213100741 +0000 @@ -128,7 +128,7 @@ introduced:

          %%%----FILE mess_config.hrl----
           
           %%% Configure the location of the server node,
          --define(server_node, messenger@super).
          +-define(server_node, messenger@super).
           
           %%%----END FILE----
          %%%----FILE mess_interface.hrl----
           
          @@ -136,24 +136,24 @@
           %%% messenger program
           
           %%%Messages from Client to server received in server/1 function.
          --record(logon,{client_pid, username}).
          --record(message,{client_pid, to_name, message}).
          +-record(logon,{client_pid, username}).
          +-record(message,{client_pid, to_name, message}).
           %%% {'EXIT', ClientPid, Reason}  (client terminated or unreachable.
           
           %%% Messages from Server to Client, received in await_result/0 function
          --record(abort_client,{message}).
          +-record(abort_client,{message}).
           %%% Messages are: user_exists_at_other_node,
           %%%               you_are_not_logged_on
          --record(server_reply,{message}).
          +-record(server_reply,{message}).
           %%% Messages are: logged_on
           %%%               receiver_not_found
           %%%               sent  (Message has been sent (no guarantee)
           %%% Messages from Server to Client received in client/1 function
          --record(message_from,{from_name, message}).
          +-record(message_from,{from_name, message}).
           
           %%% Messages from shell to Client received in client/1 function
           %%% spawn(mess_client, client, [server_node(), Name])
          --record(message_to,{to_name, message}).
          +-record(message_to,{to_name, message}).
           %%% logoff
           
           %%%----END FILE----
          %%%----FILE user_interface.erl----
          @@ -174,27 +174,27 @@
           %%%     function is not logged on or if ToName is not logged on at
           %%%     any node.
           
          --module(user_interface).
          --export([logon/1, logoff/0, message/2]).
          --include("mess_interface.hrl").
          --include("mess_config.hrl").
          +-module(user_interface).
          +-export([logon/1, logoff/0, message/2]).
          +-include("mess_interface.hrl").
          +-include("mess_config.hrl").
           
          -logon(Name) ->
          -    case whereis(mess_client) of
          +logon(Name) ->
          +    case whereis(mess_client) of
                   undefined ->
          -            register(mess_client,
          -                     spawn(mess_client, client, [?server_node, Name]));
          +            register(mess_client,
          +                     spawn(mess_client, client, [?server_node, Name]));
                   _ -> already_logged_on
               end.
           
          -logoff() ->
          +logoff() ->
               mess_client ! logoff.
           
          -message(ToName, Message) ->
          -    case whereis(mess_client) of % Test if the client is running
          +message(ToName, Message) ->
          +    case whereis(mess_client) of % Test if the client is running
                   undefined ->
                       not_logged_on;
          -        _ -> mess_client ! #message_to{to_name=ToName, message=Message},
          +        _ -> mess_client ! #message_to{to_name=ToName, message=Message},
                        ok
           end.
           
          @@ -202,107 +202,107 @@
           
           %%% The client process which runs on each user node
           
          --module(mess_client).
          --export([client/2]).
          --include("mess_interface.hrl").
          -
          -client(Server_Node, Name) ->
          -    {messenger, Server_Node} ! #logon{client_pid=self(), username=Name},
          -    await_result(),
          -    client(Server_Node).
          +-module(mess_client).
          +-export([client/2]).
          +-include("mess_interface.hrl").
          +
          +client(Server_Node, Name) ->
          +    {messenger, Server_Node} ! #logon{client_pid=self(), username=Name},
          +    await_result(),
          +    client(Server_Node).
           
          -client(Server_Node) ->
          +client(Server_Node) ->
               receive
                   logoff ->
          -            exit(normal);
          -        #message_to{to_name=ToName, message=Message} ->
          -            {messenger, Server_Node} !
          -                #message{client_pid=self(), to_name=ToName, message=Message},
          -            await_result();
          -        {message_from, FromName, Message} ->
          -            io:format("Message from ~p: ~p~n", [FromName, Message])
          +            exit(normal);
          +        #message_to{to_name=ToName, message=Message} ->
          +            {messenger, Server_Node} !
          +                #message{client_pid=self(), to_name=ToName, message=Message},
          +            await_result();
          +        {message_from, FromName, Message} ->
          +            io:format("Message from ~p: ~p~n", [FromName, Message])
               end,
          -    client(Server_Node).
          +    client(Server_Node).
           
           %%% wait for a response from the server
          -await_result() ->
          +await_result() ->
               receive
          -        #abort_client{message=Why} ->
          -            io:format("~p~n", [Why]),
          -            exit(normal);
          -        #server_reply{message=What} ->
          -            io:format("~p~n", [What])
          +        #abort_client{message=Why} ->
          +            io:format("~p~n", [Why]),
          +            exit(normal);
          +        #server_reply{message=What} ->
          +            io:format("~p~n", [What])
               after 5000 ->
          -            io:format("No response from server~n", []),
          -            exit(timeout)
          +            io:format("No response from server~n", []),
          +            exit(timeout)
               end.
           
           %%%----END FILE---
          %%%----FILE mess_server.erl----
           
           %%% This is the server process of the messenger service
           
          --module(mess_server).
          --export([start_server/0, server/0]).
          --include("mess_interface.hrl").
          -
          -server() ->
          -    process_flag(trap_exit, true),
          -    server([]).
          +-module(mess_server).
          +-export([start_server/0, server/0]).
          +-include("mess_interface.hrl").
          +
          +server() ->
          +    process_flag(trap_exit, true),
          +    server([]).
           
           %%% the user list has the format [{ClientPid1, Name1},{ClientPid22, Name2},...]
          -server(User_List) ->
          -    io:format("User list = ~p~n", [User_List]),
          +server(User_List) ->
          +    io:format("User list = ~p~n", [User_List]),
               receive
          -        #logon{client_pid=From, username=Name} ->
          -            New_User_List = server_logon(From, Name, User_List),
          -            server(New_User_List);
          -        {'EXIT', From, _} ->
          -            New_User_List = server_logoff(From, User_List),
          -            server(New_User_List);
          -        #message{client_pid=From, to_name=To, message=Message} ->
          -            server_transfer(From, To, Message, User_List),
          -            server(User_List)
          +        #logon{client_pid=From, username=Name} ->
          +            New_User_List = server_logon(From, Name, User_List),
          +            server(New_User_List);
          +        {'EXIT', From, _} ->
          +            New_User_List = server_logoff(From, User_List),
          +            server(New_User_List);
          +        #message{client_pid=From, to_name=To, message=Message} ->
          +            server_transfer(From, To, Message, User_List),
          +            server(User_List)
               end.
           
           %%% Start the server
          -start_server() ->
          -    register(messenger, spawn(?MODULE, server, [])).
          +start_server() ->
          +    register(messenger, spawn(?MODULE, server, [])).
           
           %%% Server adds a new user to the user list
          -server_logon(From, Name, User_List) ->
          +server_logon(From, Name, User_List) ->
          /usr/share/doc/packages/erlang-doc/doc/system/ref_man_functions.html differs (HTML document, UTF-8 Unicode text, with very long lines)
          --- old//usr/share/doc/packages/erlang-doc/doc/system/ref_man_functions.html	2025-05-10 20:18:59.237100958 +0000
          +++ new//usr/share/doc/packages/erlang-doc/doc/system/ref_man_functions.html	2025-05-10 20:18:59.241100995 +0000
          @@ -124,10 +124,10 @@
           

          A function declaration is a sequence of function clauses separated by semicolons, and terminated by a period (.).

          A function clause consists of a clause head and a clause body, separated by ->.

          A clause head consists of the function name, an argument list, and an optional -guard sequence beginning with the keyword when:

          Name(Pattern11,...,Pattern1N) [when GuardSeq1] ->
          +guard sequence beginning with the keyword when:

          Name(Pattern11,...,Pattern1N) [when GuardSeq1] ->
               Body1;
           ...;
          -Name(PatternK1,...,PatternKN) [when GuardSeqK] ->
          +Name(PatternK1,...,PatternKN) [when GuardSeqK] ->
               BodyK.

          The function name is an atom. Each argument is a pattern.

          The number of arguments N is the arity of the function. A function is uniquely defined by the module name, function name, and arity. That is, two functions with the same name and in the same module, but with different arities @@ -135,10 +135,10 @@ mod:f/N.

          A clause body consists of a sequence of expressions separated by comma (,):

          Expr1,
           ...,
           ExprN

          Valid Erlang expressions and guard sequences are described in -Expressions.

          Example:

          fact(N) when N > 0 ->  % first clause head
          -    N * fact(N-1);     % first clause body
          +Expressions.

          Example:

          fact(N) when N > 0 ->  % first clause head
          +    N * fact(N-1);     % first clause body
           
          -fact(0) ->             % second clause head
          +fact(0) ->             % second clause head
               1.                 % second clause body

          @@ -151,16 +151,16 @@ clause is found that fulfills both of the following two conditions:

          1. The patterns in the clause head can be successfully matched against the given arguments.
          2. The guard sequence, if any, is true.

          If such a clause cannot be found, a function_clause runtime error occurs.

          If such a clause is found, the corresponding clause body is evaluated. That is, the expressions in the body are evaluated sequentially and the value of the last -expression is returned.

          Consider the function fact:

          -module(mod).
          --export([fact/1]).
          +expression is returned.

          Consider the function fact:

          -module(mod).
          +-export([fact/1]).
           
          -fact(N) when N > 0 ->
          -    N * fact(N - 1);
          -fact(0) ->
          +fact(N) when N > 0 ->
          +    N * fact(N - 1);
          +fact(0) ->
               1.

          Assume that you want to calculate the factorial for 1:

          1> mod:fact(1).

          Evaluation starts at the first clause. The pattern N is matched against argument 1. The matching succeeds and the guard (N > 0) is true, thus N is -bound to 1, and the corresponding body is evaluated:

          N * fact(N-1) => (N is bound to 1)
          -1 * fact(0)

          Now, fact(0) is called, and the function clauses are scanned +bound to 1, and the corresponding body is evaluated:

          N * fact(N-1) => (N is bound to 1)
          +1 * fact(0)

          Now, fact(0) is called, and the function clauses are scanned sequentially again. First, the pattern N is matched against 0. The matching succeeds, but the guard (N > 0) is false. Second, the pattern 0 is matched against the argument 0. The matching succeeds @@ -177,9 +177,9 @@ tail-recursive call is done. This is to ensure that no system resources, for example, call stack, are consumed. This means that an infinite loop using tail-recursive calls will not exhaust the call -stack and can (in principle) run forever.

          Example:

          loop(N) ->
          -    io:format("~w~n", [N]),
          -    loop(N+1).

          The earlier factorial example is a counter-example. It is not +stack and can (in principle) run forever.

          Example:

          loop(N) ->
          +    io:format("~w~n", [N]),
          +    loop(N+1).

          The earlier factorial example is a counter-example. It is not tail-recursive, since a multiplication is done on the result of the recursive call to fact(N-1).

          @@ -195,9 +195,9 @@ not need to be prefixed with the module name. Which BIFs that are auto-imported is specified in the erlang module in ERTS. For example, standard-type conversion BIFs like atom_to_list and BIFs allowed in guards can be called -without specifying the module name.

          Examples:

          1> tuple_size({a,b,c}).
          +without specifying the module name.

          Examples:

          1> tuple_size({a,b,c}).
           3
          -2> atom_to_list(&#href_anchor"p" data-group-id="9211380464-3">).
          +2> atom_to_list(&#href_anchor"p" data-group-id="9563228800-3">).
           "Erlang"
          @@ -249,7 +249,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/doc/system/ref_man_processes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/ref_man_processes.html 2025-05-10 20:18:59.265101212 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/ref_man_processes.html 2025-05-10 20:18:59.273101285 +0000 @@ -129,10 +129,10 @@ Process Creation

          -

          A process is created by calling spawn():

          spawn(Module, Name, Args) -> pid()
          -  Module = Name = atom()
          -  Args = [Arg1,...,ArgN]
          -    ArgI = term()

          spawn() creates a new process and returns the pid.

          The new process starts executing in Module:Name(Arg1,...,ArgN) where the +

          A process is created by calling spawn():

          spawn(Module, Name, Args) -> pid()
          +  Module = Name = atom()
          +  Args = [Arg1,...,ArgN]
          +    ArgI = term()

          spawn() creates a new process and returns the pid.

          The new process starts executing in Module:Name(Arg1,...,ArgN) where the arguments are the elements of the (possible empty) Args argument list.

          There exist a number of different spawn BIFs:

          @@ -587,7 +587,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/doc/system/ref_man_records.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/ref_man_records.html 2025-05-10 20:18:59.293101466 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/ref_man_records.html 2025-05-10 20:18:59.297101502 +0000 @@ -127,9 +127,9 @@

          A record definition consists of the name of the record, followed by the field names of the record. Record and field names must be atoms. Each field can be given an optional default value. If no default value is supplied, undefined is -used.

          -record(Name, {Field1 [= Expr1],
          +used.

          -record(Name, {Field1 [= Expr1],
                          ...
          -               FieldN [= ExprN]}).

          The default value for a field is an arbitrary expression, except that it must + FieldN [= ExprN]}).

          The default value for a field is an arbitrary expression, except that it must not use any variables.

          A record definition can be placed anywhere among the attributes and function declarations of a module, but the definition must come before any usage of the record.

          If a record is used in several modules, it is recommended that the record @@ -147,24 +147,24 @@ default value instead.

          If several fields are to be assigned the same value, the following construction can be used:

          #Name{Field1=Expr1, ..., FieldK=ExprK, _=ExprL}

          Omitted fields then get the value of evaluating ExprL instead of their default values. This feature is primarily intended to be used to create patterns for ETS -and Mnesia match functions.

          Example:

          -record(person, {name, phone, address}).
          +and Mnesia match functions.

          Example:

          -record(person, {name, phone, address}).
           
          -lookup(Name, Tab) ->
          -    ets:match_object(Tab, #person{name=Name, _='_'}).

          +lookup(Name, Tab) -> + ets:match_object(Tab, #person{name=Name, _='_'}).

          Accessing Record Fields

          Expr#Name.Field

          Returns the value of the specified field. Expr is to evaluate to a Name -record.

          Example:

          -record(person, {name, phone, address}).
          +record.

          Example:

          -record(person, {name, phone, address}).
           
          -get_person_name(Person) ->
          +get_person_name(Person) ->
               Person#person.name.

          The following expression returns the position of the specified field in the -tuple representation of the record:

          #Name.Field

          Example:

          -record(person, {name, phone, address}).
          +tuple representation of the record:

          #Name.Field

          Example:

          -record(person, {name, phone, address}).
           
          -lookup(Name, List) ->
          -    lists:keyfind(Name, #person.name, List).

          +lookup(Name, List) -> + lists:keyfind(Name, #person.name, List).

          @@ -182,13 +182,13 @@

          Since record expressions are expanded to tuple expressions, creating records and accessing record fields are allowed in guards. However, all subexpressions (for initializing fields), must be valid guard -expressions as well.

          Examples:

          handle(Msg, State) when Msg =:= #msg{to=void, no=3} ->
          +expressions as well.

          Examples:

          handle(Msg, State) when Msg =:= #msg{to=void, no=3} ->
               ...
           
          -handle(Msg, State) when State#state.running =:= true ->
          -    ...

          There is also a type test BIF is_record(Term, RecordTag).

          Example:

          is_person(P) when is_record(P, person) ->
          +handle(Msg, State) when State#state.running =:= true ->
          +    ...

          There is also a type test BIF is_record(Term, RecordTag).

          Example:

          is_person(P) when is_record(P, person) ->
               true;
          -is_person(_P) ->
          +is_person(_P) ->
               false.

          @@ -202,11 +202,11 @@ Nested Records

          -

          Assume the following record definitions:

          -record(nrec0, {name = "nested0"}).
          --record(nrec1, {name = "nested1", nrec0=#nrec0{}}).
          --record(nrec2, {name = "nested2", nrec1=#nrec1{}}).
          +

          Assume the following record definitions:

          -record(nrec0, {name = "nested0"}).
          +-record(nrec1, {name = "nested1", nrec0=#nrec0{}}).
          +-record(nrec2, {name = "nested2", nrec1=#nrec1{}}).
           
          -N2 = #nrec2{},

          Accessing or updating nested records can be written without parentheses:

          "nested0" = N2#nrec2.nrec1#nrec1.nrec0#nrec0.name,
          +N2 = #nrec2{},

          Accessing or updating nested records can be written without parentheses:

          "nested0" = N2#nrec2.nrec1#nrec1.nrec0#nrec0.name,
               N0n = N2#nrec2.nrec1#nrec1.nrec0#nrec0{name = "nested0a"},

          which is equivalent to:

          "nested0" = ((N2#nrec2.nrec1)#nrec1.nrec0)#nrec0.name,
           N0n = ((N2#nrec2.nrec1)#nrec1.nrec0)#nrec0{name = "nested0a"},

          Change

          Before Erlang/OTP R14, parentheses were necessary when accessing or updating nested records.

          @@ -216,9 +216,9 @@ Internal Representation of Records

          Record expressions are translated to tuple expressions during compilation. A -record defined as:

          -record(Name, {Field1, ..., FieldN}).

          is internally represented by the tuple:

          {Name, Value1, ..., ValueN}

          Here each ValueI is the default value for FieldI.

          To each module using records, a pseudo function is added during compilation to -obtain information about records:

          record_info(fields, Record) -> [Field]
          -record_info(size, Record) -> Size

          Size is the size of the tuple representation, that is, one more than the +record defined as:

          -record(Name, {Field1, ..., FieldN}).

          is internally represented by the tuple:

          {Name, Value1, ..., ValueN}

          Here each ValueI is the default value for FieldI.

          To each module using records, a pseudo function is added during compilation to +obtain information about records:

          record_info(fields, Record) -> [Field]
          +record_info(size, Record) -> Size

          Size is the size of the tuple representation, that is, one more than the number of fields.

          @@ -270,7 +270,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/doc/system/reference_manual.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/reference_manual.html 2025-05-10 20:18:59.317101683 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/reference_manual.html 2025-05-10 20:18:59.321101720 +0000 @@ -213,7 +213,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/doc/system/release_handling.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/release_handling.html 2025-05-10 20:18:59.349101974 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/release_handling.html 2025-05-10 20:18:59.357102046 +0000 @@ -227,15 +227,15 @@ Instead, it is necessary to:

          • Suspend the processes using the module (to avoid that they try to handle any requests before the code replacement is completed).
          • Ask them to transform the internal state format and switch to the new version of the module.
          • Remove the old version.
          • Resume the processes.

          This is called synchronized code replacement and for this the following -instructions are used:

          {update, Module, {advanced, Extra}}
          -{update, Module, supervisor}

          update with argument {advanced,Extra} is used when changing the internal +instructions are used:

          {update, Module, {advanced, Extra}}
          +{update, Module, supervisor}

          update with argument {advanced,Extra} is used when changing the internal state of a behaviour as described above. It causes behaviour processes to call the callback function code_change/3, passing the term Extra and some other information as arguments. See the manual pages for the respective behaviours and Appup Cookbook.

          update with argument supervisor is used when changing the start specification of a supervisor. See Appup Cookbook.

          When a module is to be updated, the release handler finds which processes that are using the module by traversing the supervision tree of each running -application and checking all the child specifications:

          {Id, StartFunc, Restart, Shutdown, Type, Modules}

          A process uses a module if the name is listed in Modules in the child +application and checking all the child specifications:

          {Id, StartFunc, Restart, Shutdown, Type, Modules}

          A process uses a module if the name is listed in Modules in the child specification for the process.

          If Modules=dynamic, which is the case for event managers, the event manager process informs the release handler about the list of currently installed event handlers (gen_event), and it is checked if the module name is in this list @@ -247,10 +247,10 @@ add_module and delete_module

          -

          If a new module is introduced, the following instruction is used:

          {add_module, Module}

          This instruction loads module Module. When running Erlang in +

          If a new module is introduced, the following instruction is used:

          {add_module, Module}

          This instruction loads module Module. When running Erlang in embedded mode it is necessary to use this this instruction. It is not strictly required when running Erlang in interactive mode, since the -code server automatically searches for and loads unloaded modules.

          The opposite of add_module is delete_module, which unloads a module:

          {delete_module, Module}

          Any process, in any application, with Module as residence module, is +code server automatically searches for and loads unloaded modules.

          The opposite of add_module is delete_module, which unloads a module:

          {delete_module, Module}

          Any process, in any application, with Module as residence module, is killed when the instruction is evaluated. Therefore, the user must ensure that all such processes are terminated before deleting module Module to avoid a situation with failing supervisor restarts.

          @@ -331,13 +331,13 @@

          To define how to upgrade/downgrade between the current version and previous versions of an application, an application upgrade file, or in short .appup file is created. The file is to be called Application.appup, where -Application is the application name:

          {Vsn,
          - [{UpFromVsn1, InstructionsU1},
          +Application is the application name:

          {Vsn,
          + [{UpFromVsn1, InstructionsU1},
             ...,
          -  {UpFromVsnK, InstructionsUK}],
          - [{DownToVsn1, InstructionsD1},
          +  {UpFromVsnK, InstructionsUK}],
          + [{DownToVsn1, InstructionsD1},
             ...,
          -  {DownToVsnK, InstructionsDK}]}.
          • Vsn, a string, is the current version of the application, as defined in the + {DownToVsnK, InstructionsDK}]}.
          • Vsn, a string, is the current version of the application, as defined in the .app file.
          • Each UpFromVsn is a previous version of the application to upgrade from.
          • Each DownToVsn is a previous version of the application to downgrade to.
          • Each Instructions is a list of release handling instructions.

          UpFromVsn and DownToVsn can also be specified as regular expressions. For more information about the syntax and contents of the .appup file, see appup in SASL.

          Appup Cookbook includes examples of .appup files for @@ -345,52 +345,52 @@ Releases. Assume you want to add a function available/0 to server ch3, which returns the number of available channels (when trying out the example, make the change in a copy of the original -directory, to ensure that the first version is still available):

          -module(ch3).
          --behaviour(gen_server).
          +directory, to ensure that the first version is still available):

          -module(ch3).
          +-behaviour(gen_server).
           
          --export([start_link/0]).
          --export([alloc/0, free/1]).
          --export([available/0]).
          --export([init/1, handle_call/3, handle_cast/2]).
          -
          -start_link() ->
          -    gen_server:start_link({local, ch3}, ch3, [], []).
          -
          -alloc() ->
          -    gen_server:call(ch3, alloc).
          -
          -free(Ch) ->
          -    gen_server:cast(ch3, {free, Ch}).
          -
          -available() ->
          -    gen_server:call(ch3, available).
          -
          -init(_Args) ->
          -    {ok, channels()}.
          -
          -handle_call(alloc, _From, Chs) ->
          -    {Ch, Chs2} = alloc(Chs),
          -    {reply, Ch, Chs2};
          -handle_call(available, _From, Chs) ->
          -    N = available(Chs),
          -    {reply, N, Chs}.
          -
          -handle_cast({free, Ch}, Chs) ->
          -    Chs2 = free(Ch, Chs),
          -    {noreply, Chs2}.

          A new version of the ch_app.app file must now be created, where the version is -updated:

          {application, ch_app,
          - [{description, "Channel allocator"},
          -  {vsn, "2"},
          -  {modules, [ch_app, ch_sup, ch3]},
          -  {registered, [ch3]},
          -  {applications, [kernel, stdlib, sasl]},
          -  {mod, {ch_app,[]}}
          - ]}.

          To upgrade ch_app from "1" to "2" (and to downgrade from "2" to "1"), +-export([start_link/0]). +-export([alloc/0, free/1]). +-export([available/0]). +-export([init/1, handle_call/3, handle_cast/2]). + +start_link() -> + gen_server:start_link({local, ch3}, ch3, [], []). + +alloc() -> + gen_server:call(ch3, alloc). + +free(Ch) -> + gen_server:cast(ch3, {free, Ch}). + +available() -> + gen_server:call(ch3, available). + +init(_Args) -> + {ok, channels()}. + +handle_call(alloc, _From, Chs) -> + {Ch, Chs2} = alloc(Chs), + {reply, Ch, Chs2}; +handle_call(available, _From, Chs) -> + N = available(Chs), + {reply, N, Chs}. + +handle_cast({free, Ch}, Chs) -> + Chs2 = free(Ch, Chs), + {noreply, Chs2}.

          A new version of the ch_app.app file must now be created, where the version is +updated:

          {application, ch_app,
          + [{description, "Channel allocator"},
          +  {vsn, "2"},
          +  {modules, [ch_app, ch_sup, ch3]},
          +  {registered, [ch3]},
          +  {applications, [kernel, stdlib, sasl]},
          +  {mod, {ch_app,[]}}
          + ]}.

          To upgrade ch_app from "1" to "2" (and to downgrade from "2" to "1"), you only need to load the new (old) version of the ch3 callback module. Create -the application upgrade file ch_app.appup in the ebin directory:

          {"2",
          - [{"1", [{load_module, ch3}]}],
          - [{"1", [{load_module, ch3}]}]
          -}.

          +the application upgrade file ch_app.appup in the ebin directory:

          {"2",
          + [{"1", [{load_module, ch3}]}],
          + [{"1", [{load_module, ch3}]}]
          +}.

          @@ -409,14 +409,14 @@ relup in SASL.

          Example, continued from the previous section: You have a new version "2" of ch_app and an .appup file. A new version of the .rel file is also needed. This time the file is called ch_rel-2.rel and the release version string is -changed from "A" to "B":

          {release,
          - {"ch_rel", "B"},
          - {erts, "14.2.5"},
          - [{kernel, "9.2.4"},
          -  {stdlib, "5.2.3"},
          -  {sasl, "4.2.1"},
          -  {ch_app, "2"}]
          -}.

          Now the relup file can be generated:

          1> systools:make_relup("ch_rel-2", ["ch_rel-1"], ["ch_rel-1"]).
          +changed from "A" to "B":

          {release,
          + {"ch_rel", "B"},
          + {erts, "14.2.5"},
          + [{kernel, "9.2.4"},
          +  {stdlib, "5.2.3"},
          +  {sasl, "4.2.1"},
          +  {ch_app, "2"}]
          +}.

          Now the relup file can be generated:

          1> systools:make_relup("ch_rel-2", ["ch_rel-1"], ["ch_rel-1"]).
           ok

          This generates a relup file with instructions for how to upgrade from version "A" ("ch_rel-1") to version "B" ("ch_rel-2") and how to downgrade from version "B" to version "A".

          Both the old and new versions of the .app and .rel files must be in the code @@ -437,17 +437,17 @@ packages. The release_handler module communicates with this process.

          Assuming there is an operational target system with installation root directory $ROOT, the release package with the new version of the release is to be copied to $ROOT/releases.

          First, unpack the release package. The files are then extracted from the -package:

          release_handler:unpack_release(ReleaseName) => {ok, Vsn}
          • ReleaseName is the name of the release package except the .tar.gz +package:

            release_handler:unpack_release(ReleaseName) => {ok, Vsn}
            • ReleaseName is the name of the release package except the .tar.gz extension.
            • Vsn is the version of the unpacked release, as defined in its .rel file.

            A directory $ROOT/lib/releases/Vsn is created, where the .rel file, the boot script start.boot, the system configuration file sys.config, and relup are placed. For applications with new version numbers, the application directories are placed under $ROOT/lib. Unchanged applications are not affected.

            An unpacked release can be installed. The release handler then evaluates the -instructions in relup, step by step:

            release_handler:install_release(Vsn) => {ok, FromVsn, []}

            If an error occurs during the installation, the system is rebooted using the old +instructions in relup, step by step:

            release_handler:install_release(Vsn) => {ok, FromVsn, []}

            If an error occurs during the installation, the system is rebooted using the old version of the release. If installation succeeds, the system is afterwards using the new version of the release, but if anything happens and the system is rebooted, it starts using the previous version again.

            To be made the default version, the newly installed release must be made permanent, which means the previous version becomes old:

            release_handler:make_permanent(Vsn) => ok

            The system keeps information about which versions are old and permanent in the -files $ROOT/releases/RELEASES and $ROOT/releases/start_erl.data.

            To downgrade from Vsn to FromVsn, install_release must be called again:

            release_handler:install_release(FromVsn) => {ok, Vsn, []}

            An installed, but not permanent, release can be removed. Information about the +files $ROOT/releases/RELEASES and $ROOT/releases/start_erl.data.

            To downgrade from Vsn to FromVsn, install_release must be called again:

            release_handler:install_release(FromVsn) => {ok, Vsn, []}

            An installed, but not permanent, release can be removed. Information about the release is then deleted from $ROOT/releases/RELEASES and the release-specific code, that is, the new application directories and the $ROOT/releases/Vsn directory, are removed.

            release_handler:remove_release(Vsn) => ok

            @@ -466,9 +466,9 @@ ...

          $ROOT is the installation directory of the target system.

          Step 3) In another Erlang shell, generate start scripts and create a release package for the new version "B". Remember to include (a possible updated) sys.config and the relup file. For more information, see -Release Upgrade File.

          1> systools:make_script("ch_rel-2").
          +Release Upgrade File.

          1> systools:make_script("ch_rel-2").
          /usr/share/doc/packages/erlang-doc/doc/system/release_structure.html differs (HTML document, UTF-8 Unicode text, with very long lines)
          --- old//usr/share/doc/packages/erlang-doc/doc/system/release_structure.html	2025-05-10 20:18:59.381102264 +0000
          +++ new//usr/share/doc/packages/erlang-doc/doc/system/release_structure.html	2025-05-10 20:18:59.385102300 +0000
          @@ -140,29 +140,29 @@
           

          To define a release, create a release resource file, or in short a .rel file. In the file, specify the name and version of the release, which ERTS -version it is based on, and which applications it consists of:

          {release, {Name,Vsn}, {erts, EVsn},
          - [{Application1, AppVsn1},
          +version it is based on, and which applications it consists of:

          {release, {Name,Vsn}, {erts, EVsn},
          + [{Application1, AppVsn1},
              ...
          -  {ApplicationN, AppVsnN}]}.

          Name, Vsn, EVsn, and AppVsn are strings.

          The file must be named Rel.rel, where Rel is a unique name.

          Each Application (atom) and AppVsn is the name and version of an application + {ApplicationN, AppVsnN}]}.

          Name, Vsn, EVsn, and AppVsn are strings.

          The file must be named Rel.rel, where Rel is a unique name.

          Each Application (atom) and AppVsn is the name and version of an application included in the release. The minimal release based on Erlang/OTP consists of the Kernel and STDLIB applications, so these applications must be included in the list.

          If the release is to be upgraded, it must also include the SASL application.

          Here is an example showing the .app file for a release of ch_app from -the Applications section:

          {application, ch_app,
          - [{description, "Channel allocator"},
          -  {vsn, "1"},
          -  {modules, [ch_app, ch_sup, ch3]},
          -  {registered, [ch3]},
          -  {applications, [kernel, stdlib, sasl]},
          -  {mod, {ch_app,[]}}
          - ]}.

          The .rel file must also contain kernel, stdlib, and sasl, as these -applications are required by ch_app. The file is called ch_rel-1.rel:

          {release,
          - {"ch_rel", "A"},
          - {erts, "14.2.5"},
          - [{kernel, "9.2.4"},
          -  {stdlib, "5.2.3"},
          -  {sasl, "4.2.1"},
          -  {ch_app, "1"}]
          -}.

          +the Applications section:

          {application, ch_app,
          + [{description, "Channel allocator"},
          +  {vsn, "1"},
          +  {modules, [ch_app, ch_sup, ch3]},
          +  {registered, [ch3]},
          +  {applications, [kernel, stdlib, sasl]},
          +  {mod, {ch_app,[]}}
          + ]}.

          The .rel file must also contain kernel, stdlib, and sasl, as these +applications are required by ch_app. The file is called ch_rel-1.rel:

          {release,
          + {"ch_rel", "A"},
          + {erts, "14.2.5"},
          + [{kernel, "9.2.4"},
          +  {stdlib, "5.2.3"},
          +  {sasl, "4.2.1"},
          +  {ch_app, "1"}]
          +}.

          @@ -194,9 +194,9 @@

          The systools:make_tar/1,2 function takes a .rel file as input and creates a zipped tar file with the code for -the specified applications, a release package:

          1> systools:make_script("ch_rel-1").
          +the specified applications, a release package:

          1> systools:make_script("ch_rel-1").
           ok
          -2> systools:make_tar("ch_rel-1").
          +2> systools:make_tar("ch_rel-1").
           ok

          The release package by default contains:

          • The .app files
          • The .rel file
          • The object code for all applications, structured according to the application directory structure
          • The binary boot script renamed to start.boot
          % tar tf ch_rel-1.tar
           lib/kernel-9.2.4/ebin/kernel.app
          @@ -355,7 +355,7 @@
                     Erlang programming language
           
                 

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/doc/system/robustness.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/robustness.html 2025-05-10 20:18:59.413102554 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/robustness.html 2025-05-10 20:18:59.421102626 +0000 @@ -132,36 +132,36 @@ "pong" so that "pong" can also finish. Another way to let "pong" finish is to make "pong" exit if it does not receive a message from ping within a certain time. This can be done by adding a time-out to pong as shown in the -following example:

          -module(tut19).
          +following example:

          -module(tut19).
           
          --export([start_ping/1, start_pong/0,  ping/2, pong/0]).
          +-export([start_ping/1, start_pong/0,  ping/2, pong/0]).
           
          -ping(0, Pong_Node) ->
          -    io:format("ping finished~n", []);
          +ping(0, Pong_Node) ->
          +    io:format("ping finished~n", []);
           
          -ping(N, Pong_Node) ->
          -    {pong, Pong_Node} ! {ping, self()},
          +ping(N, Pong_Node) ->
          +    {pong, Pong_Node} ! {ping, self()},
               receive
                   pong ->
          -            io:format("Ping received pong~n", [])
          +            io:format("Ping received pong~n", [])
               end,
          -    ping(N - 1, Pong_Node).
          +    ping(N - 1, Pong_Node).
           
          -pong() ->
          +pong() ->
               receive
          -        {ping, Ping_PID} ->
          -            io:format("Pong received ping~n", []),
          +        {ping, Ping_PID} ->
          +            io:format("Pong received ping~n", []),
                       Ping_PID ! pong,
          -            pong()
          +            pong()
               after 5000 ->
          -            io:format("Pong timed out~n", [])
          +            io:format("Pong timed out~n", [])
               end.
           
          -start_pong() ->
          -    register(pong, spawn(tut19, pong, [])).
          +start_pong() ->
          +    register(pong, spawn(tut19, pong, [])).
           
          -start_ping(Pong_Node) ->
          -    spawn(tut19, ping, [3, Pong_Node]).

          After this is compiled and the file tut19.beam is copied to the necessary +start_ping(Pong_Node) -> + spawn(tut19, ping, [3, Pong_Node]).

          After this is compiled and the file tut19.beam is copied to the necessary directories, the following is seen on (pong@kosken):

          (pong@kosken)1> tut19:start_pong().
           true
           Pong received ping
          @@ -172,20 +172,20 @@
           Ping received pong
           Ping received pong
           Ping received pong
          -ping finished

          The time-out is set in:

          pong() ->
          +ping finished

          The time-out is set in:

          pong() ->
               receive
          -        {ping, Ping_PID} ->
          -            io:format("Pong received ping~n", []),
          +        {ping, Ping_PID} ->
          +            io:format("Pong received ping~n", []),
                       Ping_PID ! pong,
          -            pong()
          +            pong()
               after 5000 ->
          -            io:format("Pong timed out~n", [])
          +            io:format("Pong timed out~n", [])
               end.

          The time-out (after 5000) is started when receive is entered. The time-out is canceled if {ping,Ping_PID} is received. If {ping,Ping_PID} is not received, the actions following the time-out are done after 5000 milliseconds. after must be last in the receive, that is, preceded by all other message reception specifications in the receive. It is also possible to call a -function that returned an integer for the time-out:

          after pong_timeout() ->

          In general, there are better ways than using time-outs to supervise parts of a +function that returned an integer for the time-out:

          after pong_timeout() ->

          In general, there are better ways than using time-outs to supervise parts of a distributed Erlang system. Time-outs are usually appropriate to supervise external events, for example, if you have expected a message from some external system within a specified time. For example, a time-out can be used to log a @@ -213,36 +213,36 @@ If one of the processes exits abnormally, all the processes in the transaction are killed. As it is often wanted to create a process and link to it at the same time, there is a special BIF, spawn_link that does the -same as spawn, but also creates a link to the spawned process.

          Now an example of the ping pong example using links to terminate "pong":

          -module(tut20).
          +same as spawn, but also creates a link to the spawned process.

          Now an example of the ping pong example using links to terminate "pong":

          -module(tut20).
           
          --export([start/1,  ping/2, pong/0]).
          +-export([start/1,  ping/2, pong/0]).
           
          -ping(N, Pong_Pid) ->
          -    link(Pong_Pid),
          -    ping1(N, Pong_Pid).
          +ping(N, Pong_Pid) ->
          +    link(Pong_Pid),
          +    ping1(N, Pong_Pid).
           
          -ping1(0, _) ->
          -    exit(ping);
          +ping1(0, _) ->
          +    exit(ping);
           
          -ping1(N, Pong_Pid) ->
          -    Pong_Pid ! {ping, self()},
          +ping1(N, Pong_Pid) ->
          +    Pong_Pid ! {ping, self()},
               receive
                   pong ->
          -            io:format("Ping received pong~n", [])
          +            io:format("Ping received pong~n", [])
               end,
          -    ping1(N - 1, Pong_Pid).
          +    ping1(N - 1, Pong_Pid).
           
          -pong() ->
          +pong() ->
               receive
          -        {ping, Ping_PID} ->
          -            io:format("Pong received ping~n", []),
          +        {ping, Ping_PID} ->
          +            io:format("Pong received ping~n", []),
                       Ping_PID ! pong,
          -            pong()
          +            pong()
               end.
           
          -start(Ping_Node) ->
          -    PongPID = spawn(tut20, pong, []),
          -    spawn(Ping_Node, tut20, ping, [3, PongPID]).
          (s1@bill)3> tut20:start(s2@kosken).
          +start(Ping_Node) ->
          +    PongPID = spawn(tut20, pong, []),
          +    spawn(Ping_Node, tut20, ping, [3, PongPID]).
          (s1@bill)3> tut20:start(s2@kosken).
           Pong received ping
           <3820.41.0>
           Ping received pong
          @@ -256,45 +256,45 @@
           sent to "pong", which also terminates.

          It is possible to modify the default behaviour of a process so that it does not get killed when it receives abnormal exit signals. Instead, all signals are turned into normal messages on the format {'EXIT',FromPID,Reason} and added to -the end of the receiving process' message queue. This behaviour is set by:

          process_flag(trap_exit, true)

          There are several other process flags, see erlang(3). +the end of the receiving process' message queue. This behaviour is set by:

          process_flag(trap_exit, true)

          There are several other process flags, see erlang(3). Changing the default behaviour of a process in this way is usually not done in standard user programs, but is left to the supervisory programs in OTP. However, -the ping pong program is modified to illustrate exit trapping.

          -module(tut21).
          +the ping pong program is modified to illustrate exit trapping.

          -module(tut21).
           
          --export([start/1,  ping/2, pong/0]).
          +-export([start/1,  ping/2, pong/0]).
           
          -ping(N, Pong_Pid) ->
          -    link(Pong_Pid),
          -    ping1(N, Pong_Pid).
          +ping(N, Pong_Pid) ->
          +    link(Pong_Pid),
          +    ping1(N, Pong_Pid).
           
          -ping1(0, _) ->
          -    exit(ping);
          +ping1(0, _) ->
          +    exit(ping);
           
          -ping1(N, Pong_Pid) ->
          -    Pong_Pid ! {ping, self()},
          +ping1(N, Pong_Pid) ->
          +    Pong_Pid ! {ping, self()},
               receive
                   pong ->
          -            io:format("Ping received pong~n", [])
          +            io:format("Ping received pong~n", [])
               end,
          -    ping1(N - 1, Pong_Pid).
          +    ping1(N - 1, Pong_Pid).
           
          -pong() ->
          -    process_flag(trap_exit, true),
          -    pong1().
          +pong() ->
          +    process_flag(trap_exit, true),
          +    pong1().
           
          -pong1() ->
          +pong1() ->
               receive
          -        {ping, Ping_PID} ->
          -            io:format("Pong received ping~n", []),
          +        {ping, Ping_PID} ->
          +            io:format("Pong received ping~n", []),
                       Ping_PID ! pong,
          -            pong1();
          -        {'EXIT', From, Reason} ->
          -            io:format("pong exiting, got ~p~n", [{'EXIT', From, Reason}])
          +            pong1();
          +        {'EXIT', From, Reason} ->
          +            io:format("pong exiting, got ~p~n", [{'EXIT', From, Reason}])
               end.
           
          -start(Ping_Node) ->
          /usr/share/doc/packages/erlang-doc/doc/system/search.html differs (HTML document, UTF-8 Unicode text)
          --- old//usr/share/doc/packages/erlang-doc/doc/system/search.html	2025-05-10 20:18:59.441102808 +0000
          +++ new//usr/share/doc/packages/erlang-doc/doc/system/search.html	2025-05-10 20:18:59.441102808 +0000
          @@ -135,7 +135,7 @@
                     Erlang programming language
           
                 

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/doc/system/seq_prog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/seq_prog.html 2025-05-10 20:18:59.549103787 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/seq_prog.html 2025-05-10 20:18:59.549103787 +0000 @@ -140,13 +140,13 @@ more editing commands in the shell (see tty - A command line interface in ERTS User's Guide).

          (Notice that many line numbers given by the shell in the following examples are out of sequence. This is because this tutorial was written and code-tested in -separate sessions).

          Here is a bit more complex calculation:

          2> (42 + 77) * 66 / 3.
          +separate sessions).

          Here is a bit more complex calculation:

          2> (42 + 77) * 66 / 3.
           2618.0

          Notice the use of brackets, the multiplication operator *, and the division operator /, as in normal arithmetic (see Expressions).

          Press Control-C to shut down the Erlang system and the Erlang shell.

          The following output is shown:

          BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
                  (v)ersion (k)ill (D)b-tables (d)istribution
           a
          -$

          Type a to leave the Erlang system.

          Another way to shut down the Erlang system is by entering halt/0:

          3> halt().
          +$

          Type a to leave the Erlang system.

          Another way to shut down the Erlang system is by entering halt/0:

          3> halt().
           $

          @@ -160,55 +160,55 @@ editor has an Erlang mode that makes it easier for you to enter and format your code nicely (see The Erlang mode for Emacs in Tools User's Guide), but you can manage perfectly well without. Here is the -code to enter:

          -module(tut).
          --export([double/1]).
          +code to enter:

          -module(tut).
          +-export([double/1]).
           
          -double(X) ->
          +double(X) ->
               2 * X.

          It is not hard to guess that this program doubles the value of numbers. The first two lines of the code are described later. Let us compile the program. -This can be done in an Erlang shell as follows, where c means compile:

          3> c(tut).
          -{ok,tut}

          The {ok,tut} means that the compilation is OK. If it says error it means +This can be done in an Erlang shell as follows, where c means compile:

          3> c(tut).
          +{ok,tut}

          The {ok,tut} means that the compilation is OK. If it says error it means that there is some mistake in the text that you entered. Additional error messages gives an idea to what is wrong so you can modify the text and then try -to compile the program again.

          Now run the program:

          4> tut:double(10).
          +to compile the program again.

          Now run the program:

          4> tut:double(10).
           20

          As expected, double of 10 is 20.

          Now let us get back to the first two lines of the code. Erlang programs are written in files. Each file contains an Erlang module. The first line of code -in the module is the module name (see Modules):

          -module(tut).

          Thus, the module is called tut. Notice the full stop . at the end of the +in the module is the module name (see Modules):

          -module(tut).

          Thus, the module is called tut. Notice the full stop . at the end of the line. The files which are used to store the module must have the same name as the module but with the extension .erl. In this case the file name is tut.erl. When using a function in another module, the syntax module_name:function_name(arguments) is used. So the following means call -function double in module tut with argument 10.

          4> tut:double(10).

          The second line says that the module tut contains a function called double, -which takes one argument (X in our example):

          -export([double/1]).

          The second line also says that this function can be called from outside the +function double in module tut with argument 10.

          4> tut:double(10).

          The second line says that the module tut contains a function called double, +which takes one argument (X in our example):

          -export([double/1]).

          The second line also says that this function can be called from outside the module tut. More about this later. Again, notice the . at the end of the line.

          Now for a more complicated example, the factorial of a number. For example, the -factorial of 4 is 4 3 2 * 1, which equals 24.

          Enter the following code in a file named tut1.erl:

          -module(tut1).
          --export([fac/1]).
          +factorial of 4 is 4  3  2 * 1, which equals 24.

          Enter the following code in a file named tut1.erl:

          -module(tut1).
          +-export([fac/1]).
           
          -fac(1) ->
          +fac(1) ->
               1;
          -fac(N) ->
          -    N * fac(N - 1).

          So this is a module, called tut1 that contains a function called fac>, which -takes one argument, N.

          The first part says that the factorial of 1 is 1.:

          fac(1) ->
          +fac(N) ->
          +    N * fac(N - 1).

          So this is a module, called tut1 that contains a function called fac>, which +takes one argument, N.

          The first part says that the factorial of 1 is 1.:

          fac(1) ->
               1;

          Notice that this part ends with a semicolon ; that indicates that there is more of the function fac> to come.

          The second part says that the factorial of N is N multiplied by the factorial of -N - 1:

          fac(N) ->
          -    N * fac(N - 1).

          Notice that this part ends with a . saying that there are no more parts of -this function.

          Compile the file:

          5> c(tut1).
          -{ok,tut1}

          And now calculate the factorial of 4.

          6> tut1:fac(4).
          +N - 1:

          fac(N) ->
          +    N * fac(N - 1).

          Notice that this part ends with a . saying that there are no more parts of +this function.

          Compile the file:

          5> c(tut1).
          +{ok,tut1}

          And now calculate the factorial of 4.

          6> tut1:fac(4).
           24

          Here the function fac> in module tut1 is called with argument 4.

          A function can have many arguments. Let us expand the module tut1 with the -function to multiply two numbers:

          -module(tut1).
          --export([fac/1, mult/2]).
          +function to multiply two numbers:

          -module(tut1).
          +-export([fac/1, mult/2]).
           
          -fac(1) ->
          +fac(1) ->
               1;
          -fac(N) ->
          -    N * fac(N - 1).
          +fac(N) ->
          +    N * fac(N - 1).
           
          -mult(X, Y) ->
          +mult(X, Y) ->
               X * Y.

          Notice that it is also required to expand the -export line with the -information that there is another function mult with two arguments.

          Compile:

          7> c(tut1).
          -{ok,tut1}

          Try out the new function mult:

          8> tut1:mult(3,4).
          +information that there is another function mult with two arguments.

          Compile:

          7> c(tut1).
          +{ok,tut1}

          Try out the new function mult:

          8> tut1:mult(3,4).
           12

          In this example the numbers are integers and the arguments in the functions in the code N, X, and Y are called variables. Variables must start with a capital letter (see Variables). Examples of @@ -222,56 +222,56 @@ Atom), for example, charles, centimeter, and inch. Atoms are simply names, nothing else. They are not like variables, which can have a value.

          Enter the next program in a file named tut2.erl). It can be useful for -converting from inches to centimeters and conversely:

          -module(tut2).
          --export([convert/2]).
          +converting from inches to centimeters and conversely:

          -module(tut2).
          +-export([convert/2]).
           
          -convert(M, inch) ->
          +convert(M, inch) ->
               M / 2.54;
           
          -convert(N, centimeter) ->
          -    N * 2.54.

          Compile:

          9> c(tut2).
          -{ok,tut2}

          Test:

          10> tut2:convert(3, inch).
          +convert(N, centimeter) ->
          +    N * 2.54.

          Compile:

          9> c(tut2).
          +{ok,tut2}

          Test:

          10> tut2:convert(3, inch).
           1.1811023622047243
          -11> tut2:convert(7, centimeter).
          +11> tut2:convert(7, centimeter).
           17.78

          Notice the introduction of decimals (floating point numbers) without any explanation. Hopefully you can cope with that.

          Let us see what happens if something other than centimeter or inch is -entered in the convert function:

          12> tut2:convert(3, miles).
          +entered in the convert function:

          12> tut2:convert(3, miles).
           ** exception error: no function clause matching tut2:convert(3,miles) (tut2.erl, line 4)

          The two parts of the convert function are called its clauses. As shown, miles is not part of either of the clauses. The Erlang system cannot match either of the clauses so an error message function_clause is returned. The shell formats the error message nicely, but the error tuple is saved in the -shell's history list and can be output by the shell command v/1:

          13> v(12).
          -{&#href_anchor"p">,{function_clause,[{tut2,convert,
          -                                [3,miles],
          -                                [{file,"tut2.erl"},{line,4}]},
          -                          {erl_eval,do_apply,6,
          -                                    [{file,"erl_eval.erl"},{line,677}]},
          -                          {shell,exprs,7,[{file,"shell.erl"},{line,687}]},
          -                          {shell,eval_exprs,7,[{file,"shell.erl"},{line,642}]},
          -                          {shell,eval_loop,3,
          -                                 [{file,"shell.erl"},{line,627}]}]}}

          +shell's history list and can be output by the shell command v/1:

          13> v(12).
          +{&#href_anchor"p">,{function_clause,[{tut2,convert,
          +                                [3,miles],
          +                                [{file,"tut2.erl"},{line,4}]},
          +                          {erl_eval,do_apply,6,
          +                                    [{file,"erl_eval.erl"},{line,677}]},
          +                          {shell,exprs,7,[{file,"shell.erl"},{line,687}]},
          +                          {shell,eval_exprs,7,[{file,"shell.erl"},{line,642}]},
          +                          {shell,eval_loop,3,
          +                                 [{file,"shell.erl"},{line,627}]}]}}

          Tuples

          -

          Now the tut2 program is hardly good programming style. Consider:

          tut2:convert(3, inch).

          Does this mean that 3 is in inches? Or does it mean that 3 is in centimeters and +

          Now the tut2 program is hardly good programming style. Consider:

          tut2:convert(3, inch).

          Does this mean that 3 is in inches? Or does it mean that 3 is in centimeters and is to be converted to inches? Erlang has a way to group things together to make things more understandable. These are called tuples and are surrounded by curly brackets, { and }.

          So, {inch,3} denotes 3 inches and {centimeter,5} denotes 5 centimeters. Now let us write a new program that converts centimeters to inches and conversely. -Enter the following code in a file called tut3.erl):

          -module(tut3).
          --export([convert_length/1]).
          +Enter the following code in a file called tut3.erl):

          -module(tut3).
          +-export([convert_length/1]).
           
          -convert_length({centimeter, X}) ->
          -    {inch, X / 2.54};
          -convert_length({inch, Y}) ->
          -    {centimeter, Y * 2.54}.

          Compile and test:

          14> c(tut3).
          -{ok,tut3}
          -15> tut3:convert_length({inch, 5}).
          -{centimeter,12.7}
          -16> tut3:convert_length(tut3:convert_length({inch, 5})).
          -{inch,5.0}

          Notice on line 16 that 5 inches is converted to centimeters and back again and +convert_length({centimeter, X}) -> + {inch, X / 2.54}; +convert_length({inch, Y}) -> + {centimeter, Y * 2.54}.

          Compile and test:

          14> c(tut3).
          +{ok,tut3}
          +15> tut3:convert_length({inch, 5}).
          +{centimeter,12.7}
          +16> tut3:convert_length(tut3:convert_length({inch, 5})).
          +{inch,5.0}

          Notice on line 16 that 5 inches is converted to centimeters and back again and reassuringly get back to the original value. That is, the argument to a function can be the result of another function. Consider how line 16 (above) works. The argument given to the function {inch,5} is first matched against the first @@ -280,9 +280,9 @@ before the ->). This having failed, let us try the head of the next clause that is, convert_length({inch,Y}). This matches, and Y gets the value 5.

          Tuples can have more than two parts, in fact as many parts as you want, and contain any valid Erlang term. For example, to represent the temperature of -various cities of the world:

          {moscow, {c, -10}}
          -{cape_town, {f, 70}}
          -{paris, {f, 28}}

          Tuples have a fixed number of items in them. Each item in a tuple is called an +various cities of the world:

          {moscow, {c, -10}}
          +{cape_town, {f, 70}}
          +{paris, {f, 28}}

          Tuples have a fixed number of items in them. Each item in a tuple is called an element. In the tuple {moscow,{c,-10}}, element 1 is moscow and element 2 is {c,-10}. Here c represents Celsius and f Fahrenheit.

          /usr/share/doc/packages/erlang-doc/doc/system/spec_proc.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/spec_proc.html 2025-05-10 20:18:59.589104149 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/spec_proc.html 2025-05-10 20:18:59.601104258 +0000 @@ -127,64 +127,64 @@

          The sys module has functions for simple debugging of processes implemented using behaviours. The code_lock example from -gen_statem Behaviour is used to illustrate this:

          Erlang/OTP 27 [erts-15.0] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit]
          +gen_statem Behaviour is used to illustrate this:

          Erlang/OTP 27 [erts-15.0] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit]
           
          -Eshell V15.0 (press Ctrl+G to abort, type help(). for help)
          -1> code_lock:start_link([1,2,3,4]).
          +Eshell V15.0 (press Ctrl+G to abort, type help(). for help)
          +1> code_lock:start_link([1,2,3,4]).
           Lock
          -{ok,<0.90.0>}
          -2> sys:statistics(code_lock, true).
          +{ok,<0.90.0>}
          +2> sys:statistics(code_lock, true).
           ok
          -3> sys:trace(code_lock, true).
          +3> sys:trace(code_lock, true).
           ok
          -4> code_lock:button(1).
          -*DBG* code_lock receive cast {button,1} in state locked
          +4> code_lock:button(1).
          +*DBG* code_lock receive cast {button,1} in state locked
           ok
          -*DBG* code_lock consume cast {button,1} in state locked
          -5> code_lock:button(2).
          -*DBG* code_lock receive cast {button,2} in state locked
          +*DBG* code_lock consume cast {button,1} in state locked
          +5> code_lock:button(2).
          +*DBG* code_lock receive cast {button,2} in state locked
           ok
          -*DBG* code_lock consume cast {button,2} in state locked
          -6> code_lock:button(3).
          -*DBG* code_lock receive cast {button,3} in state locked
          +*DBG* code_lock consume cast {button,2} in state locked
          +6> code_lock:button(3).
          +*DBG* code_lock receive cast {button,3} in state locked
           ok
          -*DBG* code_lock consume cast {button,3} in state locked
          -7> code_lock:button(4).
          -*DBG* code_lock receive cast {button,4} in state locked
          +*DBG* code_lock consume cast {button,3} in state locked
          +7> code_lock:button(4).
          +*DBG* code_lock receive cast {button,4} in state locked
           ok
           Unlock
          -*DBG* code_lock consume cast {button,4} in state locked => open
          -*DBG* code_lock start_timer {state_timeout,10000,lock,[]} in state open
          +*DBG* code_lock consume cast {button,4} in state locked => open
          +*DBG* code_lock start_timer {state_timeout,10000,lock,[]} in state open
           *DBG* code_lock receive state_timeout lock in state open
           Lock
           *DBG* code_lock consume state_timeout lock in state open => locked
          -8> sys:statistics(code_lock, get).
          -{ok,[{start_time,{{2024,5,3},{8,11,1}}},
          -     {current_time,{{2024,5,3},{8,11,48}}},
          -     {reductions,4098},
          -     {messages_in,5},
          -     {messages_out,0}]}
          -9> sys:statistics(code_lock, false).
          +8> sys:statistics(code_lock, get).
          +{ok,[{start_time,{{2024,5,3},{8,11,1}}},
          +     {current_time,{{2024,5,3},{8,11,48}}},
          +     {reductions,4098},
          +     {messages_in,5},
          +     {messages_out,0}]}
          +9> sys:statistics(code_lock, false).
           ok
          -10> sys:trace(code_lock, false).
          +10> sys:trace(code_lock, false).
           ok
          -11> sys:get_status(code_lock).
          -{status,<0.90.0>,
          -        {module,gen_statem},
          -        [[{'$initial_call',{code_lock,init,1}},
          -          {'$ancestors',[<0.88.0>,<0.87.0>,<0.70.0>,<0.65.0>,<0.69.0>,
          -                         <0.64.0>,kernel_sup,<0.47.0>]}],
          -         running,<0.88.0>,[],
          -         [{header,"Status for state machine code_lock"},
          -          {data,[{"Status",running},
          -                 {"Parent",<0.88.0>},
          -                 {"Modules",[code_lock]},
          -                 {"Time-outs",{0,[]}},
          -                 {"Logged Events",[]},
          -                 {"Postponed",[]}]},
          -          {data,[{"State",
          -                  {locked,#{code => [1,2,3,4],
          -                            length => 4,buttons => []}}}]}]]}

          +11> sys:get_status(code_lock). +{status,<0.90.0>, + {module,gen_statem}, + [[{'$initial_call',{code_lock,init,1}}, + {'$ancestors',[<0.88.0>,<0.87.0>,<0.70.0>,<0.65.0>,<0.69.0>, + <0.64.0>,kernel_sup,<0.47.0>]}], + running,<0.88.0>,[], + [{header,"Status for state machine code_lock"}, + {data,[{"Status",running}, + {"Parent",<0.88.0>}, + {"Modules",[code_lock]}, + {"Time-outs",{0,[]}}, + {"Logged Events",[]}, + {"Postponed",[]}]}, + {data,[{"State", + {locked,#{code => [1,2,3,4], + length => 4,buttons => []}}}]}]]}

          @@ -202,109 +202,109 @@

          Here follows the simple server from Overview, -implemented using sys and proc_lib to fit into a supervision tree:

          -module(ch4).
          --export([start_link/0]).
          --export([alloc/0, free/1]).
          --export([init/1]).
          --export([system_continue/3, system_terminate/4,
          +implemented using sys and proc_lib to fit into a supervision tree:

          -module(ch4).
          +-export([start_link/0]).
          +-export([alloc/0, free/1]).
          +-export([init/1]).
          +-export([system_continue/3, system_terminate/4,
                    write_debug/3,
          -         system_get_state/1, system_replace_state/2]).
          +         system_get_state/1, system_replace_state/2]).
           
          -start_link() ->
          -    proc_lib:start_link(ch4, init, [self()]).
          +start_link() ->
          +    proc_lib:start_link(ch4, init, [self()]).
           
          -alloc() ->
          -    ch4 ! {self(), alloc},
          +alloc() ->
          +    ch4 ! {self(), alloc},
               receive
          -        {ch4, Res} ->
          +        {ch4, Res} ->
                       Res
               end.
           
          -free(Ch) ->
          -    ch4 ! {free, Ch},
          +free(Ch) ->
          +    ch4 ! {free, Ch},
               ok.
           
          -init(Parent) ->
          -    register(ch4, self()),
          -    Chs = channels(),
          -    Deb = sys:debug_options([]),
          -    proc_lib:init_ack(Parent, {ok, self()}),
          -    loop(Chs, Parent, Deb).
          +init(Parent) ->
          +    register(ch4, self()),
          +    Chs = channels(),
          +    Deb = sys:debug_options([]),
          +    proc_lib:init_ack(Parent, {ok, self()}),
          +    loop(Chs, Parent, Deb).
           
          -loop(Chs, Parent, Deb) ->
          +loop(Chs, Parent, Deb) ->
               receive
          -        {From, alloc} ->
          -            Deb2 = sys:handle_debug(Deb, fun ch4:write_debug/3,
          -                                    ch4, {in, alloc, From}),
          -            {Ch, Chs2} = alloc(Chs),
          -            From ! {ch4, Ch},
          -            Deb3 = sys:handle_debug(Deb2, fun ch4:write_debug/3,
          -                                    ch4, {out, {ch4, Ch}, From}),
          -            loop(Chs2, Parent, Deb3);
          -        {free, Ch} ->
          -            Deb2 = sys:handle_debug(Deb, fun ch4:write_debug/3,
          -                                    ch4, {in, {free, Ch}}),
          -            Chs2 = free(Ch, Chs),
          -            loop(Chs2, Parent, Deb2);
          -
          -        {system, From, Request} ->
          -            sys:handle_system_msg(Request, From, Parent,
          -                                  ch4, Deb, Chs)
          +        {From, alloc} ->
          +            Deb2 = sys:handle_debug(Deb, fun ch4:write_debug/3,
          +                                    ch4, {in, alloc, From}),
          +            {Ch, Chs2} = alloc(Chs),
          +            From ! {ch4, Ch},
          +            Deb3 = sys:handle_debug(Deb2, fun ch4:write_debug/3,
          +                                    ch4, {out, {ch4, Ch}, From}),
          +            loop(Chs2, Parent, Deb3);
          +        {free, Ch} ->
          +            Deb2 = sys:handle_debug(Deb, fun ch4:write_debug/3,
          +                                    ch4, {in, {free, Ch}}),
          +            Chs2 = free(Ch, Chs),
          +            loop(Chs2, Parent, Deb2);
          +
          +        {system, From, Request} ->
          +            sys:handle_system_msg(Request, From, Parent,
          +                                  ch4, Deb, Chs)
          /usr/share/doc/packages/erlang-doc/doc/system/statem.html differs (HTML document, UTF-8 Unicode text, with very long lines)
          --- old//usr/share/doc/packages/erlang-doc/doc/system/statem.html	2025-05-10 20:18:59.657104766 +0000
          +++ new//usr/share/doc/packages/erlang-doc/doc/system/statem.html	2025-05-10 20:18:59.685105020 +0000
          @@ -128,7 +128,7 @@
           a state transition and the output is actions executed during
           the state transition.  Analogously to the mathematical model
           of a Finite State Machine, it can be described as a set of relations
          -of the following form:

          State(S) x Event(E) -> Actions(A), State(S')

          These relations are interpreted as follows: if we are in state S, +of the following form:

          State(S) x Event(E) -> Actions(A), State(S')

          These relations are interpreted as follows: if we are in state S, and event E occurs, we are to perform actions A, and make a transition to state S'. Notice that S' can be equal to S, and that A can be empty.

          In gen_statem we define a state change as a state transition in which the @@ -409,12 +409,12 @@ mode, automatically call the state callback with special arguments whenever the state changes, so you can write state enter actions near the rest of the state transition rules. -It typically looks like this:

          StateName(enter, OldState, Data) ->
          +It typically looks like this:

          StateName(enter, OldState, Data) ->
               ... code for state enter actions here ...
          -    {keep_state, NewData};
          -StateName(EventType, EventContent, Data) ->
          +    {keep_state, NewData};
          +StateName(EventType, EventContent, Data) ->
               ... code for actions here ...
          -    {next_state, NewStateName, NewData}.

          Since the state enter call is not an event there are restrictions on the + {next_state, NewStateName, NewData}.

          Since the state enter call is not an event there are restrictions on the allowed return value and state transition actions. You must not change the state, postpone this non-event, insert any events, or change the @@ -503,55 +503,55 @@ open --> open : {button, Digit} open --> locked : state_timeout\n* do_lock()

          This code lock state machine can be implemented using gen_statem with -the following callback module:

          -module(code_lock).
          --behaviour(gen_statem).
          --define(NAME, code_lock).
          +the following callback module:

          -module(code_lock).
          +-behaviour(gen_statem).
          +-define(NAME, code_lock).
           
          --export([start_link/1]).
          --export([button/1]).
          --export([init/1,callback_mode/0,terminate/3]).
          --export([locked/3,open/3]).
          -
          -start_link(Code) ->
          -    gen_statem:start_link({local,?NAME}, ?MODULE, Code, []).
          -
          -button(Button) ->
          -    gen_statem:cast(?NAME, {button,Button}).
          -
          -init(Code) ->
          -    do_lock(),
          -    Data = #href_anchor"ss">code => Code, length => length(Code), buttons => []},
          -    {ok, locked, Data}.
          -
          -callback_mode() ->
          -    state_functions.
          locked(
          -  cast, {button,Button},
          -  #{code := Code, length := Length, buttons := Buttons} = Data) ->
          +-export([start_link/1]).
          +-export([button/1]).
          +-export([init/1,callback_mode/0,terminate/3]).
          +-export([locked/3,open/3]).
          +
          +start_link(Code) ->
          +    gen_statem:start_link({local,?NAME}, ?MODULE, Code, []).
          +
          +button(Button) ->
          +    gen_statem:cast(?NAME, {button,Button}).
          +
          +init(Code) ->
          +    do_lock(),
          +    Data = #href_anchor"ss">code => Code, length => length(Code), buttons => []},
          +    {ok, locked, Data}.
          +
          +callback_mode() ->
          +    state_functions.
          locked(
          +  cast, {button,Button},
          +  #{code := Code, length := Length, buttons := Buttons} = Data) ->
               NewButtons =
                   if
          -            length(Buttons) < Length ->
          +            length(Buttons) < Length ->
                           Buttons;
                       true ->
          -                tl(Buttons)
          -        end ++ [Button],
          +                tl(Buttons)
          +        end ++ [Button],
               if
                   NewButtons =:= Code -> % Correct
          -	    do_unlock(),
          -            {next_state, open, Data#{buttons := []},
          -             [{state_timeout,10_000,lock}]}; % Time in milliseconds
          +	    do_unlock(),
          +            {next_state, open, Data#{buttons := []},
          +             [{state_timeout,10_000,lock}]}; % Time in milliseconds
           	true -> % Incomplete | Incorrect
          -            {next_state, locked, Data#{buttons := NewButtons}}
          -    end.
          open(state_timeout, lock,  Data) ->
          -    do_lock(),
          -    {next_state, locked, Data};
          -open(cast, {button,_}, Data) ->
          -    {next_state, open, Data}.
          do_lock() ->
          -    io:format("Lock~n", []).
          -do_unlock() ->
          -    io:format("Unlock~n", []).
          +            {next_state, locked, Data#{buttons := NewButtons}}
          +    end.
          open(state_timeout, lock,  Data) ->
          +    do_lock(),
          +    {next_state, locked, Data};
          +open(cast, {button,_}, Data) ->
          +    {next_state, open, Data}.
          do_lock() ->
          +    io:format("Lock~n", []).
          +do_unlock() ->
          +    io:format("Unlock~n", []).
           
          -terminate(_Reason, State, _Data) ->
          -    State =/= locked andalso do_lock(),
          +terminate(_Reason, State, _Data) ->
          +    State =/= locked andalso do_lock(),
               ok.

          The code is explained in the next sections.

          @@ -559,8 +559,8 @@ Starting gen_statem

          In the example in the previous section, gen_statem is started by calling -code_lock:start_link(Code):

          start_link(Code) ->
          -    gen_statem:start_link({local,?NAME}, ?MODULE, Code, []).

          start_link/1 calls function gen_statem:start_link/4, +code_lock:start_link(Code):

          start_link(Code) ->
          +    gen_statem:start_link({local,?NAME}, ?MODULE, Code, []).

          start_link/1 calls function gen_statem:start_link/4, which spawns and links to a new process, a gen_statem.

          • The first argument, {local,?NAME}, specifies the name. In this case, the gen_statem is locally registered as code_lock through the macro ?NAME.

            If the name is omitted, the gen_statem is not registered. Instead its pid must be used. The name can also be specified as {global, Name}, then the @@ -578,10 +578,10 @@ Data is the internal server data of the gen_statem. Here the server data is a map() with key code that stores the correct button sequence, key length store its length, and key buttons -that stores the collected buttons up to the same length.

            init(Code) ->
            -    do_lock(),
            -    Data = #href_anchor"ss">code => Code, length => length(Code), buttons => []},
            -    {ok, locked, Data}.

            Function gen_statem:start_link/3,4 +that stores the collected buttons up to the same length.

            init(Code) ->
            +    do_lock(),
            +    Data = #href_anchor"ss">code => Code, length => length(Code), buttons => []},
            +    {ok, locked, Data}.

            Function gen_statem:start_link/3,4 is synchronous. It does not return until the gen_statem is initialized and is ready to receive events.

            Function gen_statem:start_link/3,4 must be used if the gen_statem is part of a supervision tree, that is, @@ -590,7 +590,7 @@ a standalone gen_statem, meaning it is not part of a supervision tree.

            Function Module:callback_mode/0 selects the CallbackMode for the callback module, in this case state_functions. -That is, each state has its own handler function:

            callback_mode() ->
            +That is, each state has its own handler function:

            callback_mode() ->
                 state_functions.

            @@ -598,8 +598,8 @@ Handling Events

            The function notifying the code lock about a button event is implemented using -gen_statem:cast/2:

            button(Button) ->
            -    gen_statem:cast(?NAME, {button,Button}).

            The first argument is the name of the gen_statem and must agree with +gen_statem:cast/2:

            button(Button) ->
            +    gen_statem:cast(?NAME, {button,Button}).

            The first argument is the name of the gen_statem and must agree with the name used to start it. So, we use the same macro ?NAME as when starting. {button, Button} is the event content.

            The event is sent to the gen_statem. When the event is received, the gen_statem calls StateName(cast, Event, Data), which is expected @@ -607,30 +607,30 @@ {next_state, NewStateName, NewData, Actions}. StateName is the name of the current state and NewStateName is the name of the next state. NewData is a new value for the server data of the gen_statem, -and Actions is a list of actions to be performed by the gen_statem engine.

            locked(
            -  cast, {button,Button},
            -  #{code := Code, length := Length, buttons := Buttons} = Data) ->
            +and Actions is a list of actions to be performed by the gen_statem engine.

            locked(
            +  cast, {button,Button},
            +  #{code := Code, length := Length, buttons := Buttons} = Data) ->
                 NewButtons =
                     if
            -            length(Buttons) < Length ->
            +            length(Buttons) < Length ->
                             Buttons;
                         true ->
            -                tl(Buttons)
            -        end ++ [Button],
            +                tl(Buttons)
            +        end ++ [Button],
                 if
                     NewButtons =:= Code -> % Correct
            -	    do_unlock(),
            -            {next_state, open, Data#{buttons := []},
            -             [{state_timeout,10_000,lock}]}; % Time in milliseconds
            +	    do_unlock(),
            +            {next_state, open, Data#{buttons := []},
            +             [{state_timeout,10_000,lock}]}; % Time in milliseconds
             	true -> % Incomplete | Incorrect
            -            {next_state, locked, Data#{buttons := NewButtons}}
            /usr/share/doc/packages/erlang-doc/doc/system/sup_princ.html differs (HTML document, UTF-8 Unicode text, with very long lines)
            --- old//usr/share/doc/packages/erlang-doc/doc/system/sup_princ.html	2025-05-10 20:18:59.729105419 +0000
            +++ new//usr/share/doc/packages/erlang-doc/doc/system/sup_princ.html	2025-05-10 20:18:59.729105419 +0000
            @@ -132,24 +132,24 @@
               Example
             

          The callback module for a supervisor starting the server from -gen_server Behaviour can look as follows:

          -module(ch_sup).
          --behaviour(supervisor).
          +gen_server Behaviour can look as follows:

          -module(ch_sup).
          +-behaviour(supervisor).
           
          --export([start_link/0]).
          --export([init/1]).
          +-export([start_link/0]).
          +-export([init/1]).
           
          -start_link() ->
          -    supervisor:start_link(ch_sup, []).
          +start_link() ->
          +    supervisor:start_link(ch_sup, []).
           
          -init(_Args) ->
          -    SupFlags = #href_anchor"ss">strategy => one_for_one, intensity => 1, period => 5},
          -    ChildSpecs = [#{id => ch3,
          -                    start => {ch3, start_link, []},
          +init(_Args) ->
          +    SupFlags = #href_anchor"ss">strategy => one_for_one, intensity => 1, period => 5},
          +    ChildSpecs = [#{id => ch3,
          +                    start => {ch3, start_link, []},
                               restart => permanent,
                               shutdown => brutal_kill,
                               type => worker,
          -                    modules => [ch3]}],
          -    {ok, {SupFlags, ChildSpecs}}.

          The SupFlags variable in the return value from init/1 represents the + modules => [ch3]}], + {ok, {SupFlags, ChildSpecs}}.

          The SupFlags variable in the return value from init/1 represents the supervisor flags.

          The ChildSpecs variable in the return value from init/1 is a list of child specifications.

          @@ -157,15 +157,15 @@ Supervisor Flags

          -

          This is the type definition for the supervisor flags:

          sup_flags() = #{strategy => strategy(),           % optional
          -                intensity => non_neg_integer(),   % optional
          -                period => pos_integer(),          % optional
          -                auto_shutdown => auto_shutdown()} % optional
          -    strategy() = one_for_all
          +

          This is the type definition for the supervisor flags:

          sup_flags() = #{strategy => strategy(),           % optional
          +                intensity => non_neg_integer(),   % optional
          +                period => pos_integer(),          % optional
          +                auto_shutdown => auto_shutdown()} % optional
          +    strategy() = one_for_all
                          | one_for_one
                          | rest_for_one
                          | simple_one_for_one
          -    auto_shutdown() = never
          +    auto_shutdown() = never
                               | any_significant
                               | all_significant

          -

          The type definition for a child specification is as follows:

          child_spec() = #{id => child_id(),             % mandatory
          -                 start => mfargs(),            % mandatory
          -                 restart => restart(),         % optional
          -                 significant => significant(), % optional
          -                 shutdown => shutdown(),       % optional
          -                 type => worker(),             % optional
          -                 modules => modules()}         % optional
          -    child_id() = term()
          -    mfargs() = {M :: module(), F :: atom(), A :: [term()]}
          -    modules() = [module()] | dynamic
          -    restart() = permanent | transient | temporary
          -    significant() = boolean()
          -    shutdown() = brutal_kill | timeout()
          -    worker() = worker | supervisor
          • id is used to identify the child specification internally by the supervisor.

            The id key is mandatory.

            Note that this identifier occasionally has been called "name". As far as +

            The type definition for a child specification is as follows:

            child_spec() = #{id => child_id(),             % mandatory
            +                 start => mfargs(),            % mandatory
            +                 restart => restart(),         % optional
            +                 significant => significant(), % optional
            +                 shutdown => shutdown(),       % optional
            +                 type => worker(),             % optional
            +                 modules => modules()}         % optional
            +    child_id() = term()
            +    mfargs() = {M :: module(), F :: atom(), A :: [term()]}
            +    modules() = [module()] | dynamic
            +    restart() = permanent | transient | temporary
            +    significant() = boolean()
            +    shutdown() = brutal_kill | timeout()
            +    worker() = worker | supervisor
            • id is used to identify the child specification internally by the supervisor.

              The id key is mandatory.

              Note that this identifier occasionally has been called "name". As far as possible, the terms "identifier" or "id" are now used but in order to keep backwards compatibility, some occurrences of "name" can still be found, for example in error messages.

            • start defines the function call used to start the child process. It is a @@ -461,32 +461,32 @@ name of the callback module.

            This information is used by the release handler during upgrades and downgrades; see Release Handling.

            The modules key is optional. If it is not given, it defaults to [M], where M comes from the child's start {M,F,A}.

          Example: The child specification to start the server ch3 in the previous -example look as follows:

          #href_anchor"ss">id => ch3,
          -  start => {ch3, start_link, []},
          +example look as follows:

          #href_anchor"ss">id => ch3,
          +  start => {ch3, start_link, []},
             restart => permanent,
             shutdown => brutal_kill,
             type => worker,
          -  modules => [ch3]}

          or simplified, relying on the default values:

          #{id => ch3,
          +  modules => [ch3]}

          or simplified, relying on the default values:

          #{id => ch3,
             start => {ch3, start_link, []},
             shutdown => brutal_kill}

          Example: A child specification to start the event manager from the chapter about -gen_event:

          #{id => error_man,
          -  start => {gen_event, start_link, [{local, error_man}]},
          -  modules => dynamic}

          Both server and event manager are registered processes which can be expected to +gen_event:

          #{id => error_man,
          +  start => {gen_event, start_link, [{local, error_man}]},
          +  modules => dynamic}

          Both server and event manager are registered processes which can be expected to be always accessible. Thus they are specified to be permanent.

          ch3 does not need to do any cleaning up before termination. Thus, no shutdown time is needed, but brutal_kill is sufficient. error_man can need some time for the event handlers to clean up, thus the shutdown time is set to 5000 ms -(which is the default value).

          Example: A child specification to start another supervisor:

          #{id => sup,
          -  start => {sup, start_link, []},
          +(which is the default value).

          Example: A child specification to start another supervisor:

          #{id => sup,
          +  start => {sup, start_link, []},
             restart => transient,
          -  type => supervisor} % will cause default shutdown=>infinity

          + type => supervisor} % will cause default shutdown=>infinity

          Starting a Supervisor

          In the previous example, the supervisor is started by calling -ch_sup:start_link():

          start_link() ->
          -    supervisor:start_link(ch_sup, []).

          ch_sup:start_link calls function supervisor:start_link/2, which spawns and +ch_sup:start_link():

          start_link() ->
          +    supervisor:start_link(ch_sup, []).

          ch_sup:start_link calls function supervisor:start_link/2, which spawns and links to a new process, a supervisor.

          • The first argument, ch_sup, is the name of the callback module, that is, the module where the init callback function is located.
          • The second argument, [], is a term that is passed as is to the callback function init. Here, init does not need any data and ignores the argument.

          In this case, the supervisor is not registered. Instead its pid must be used. A @@ -494,12 +494,12 @@ supervisor:start_link({local, Name}, Module, Args) or supervisor:start_link({global, Name}, Module, Args).

          The new supervisor process calls the callback function ch_sup:init([]). init -has to return {ok, {SupFlags, ChildSpecs}}:

          init(_Args) ->
          -    SupFlags = #{},
          -    ChildSpecs = [#{id => ch3,
          -                    start => {ch3, start_link, []},
          -                    shutdown => brutal_kill}],
          -    {ok, {SupFlags, ChildSpecs}}.

          Subsequently, the supervisor starts its child processes according to the child +has to return {ok, {SupFlags, ChildSpecs}}:

          init(_Args) ->
          +    SupFlags = #{},
          +    ChildSpecs = [#{id => ch3,
          +                    start => {ch3, start_link, []},
          +                    shutdown => brutal_kill}],
          +    {ok, {SupFlags, ChildSpecs}}.

          Subsequently, the supervisor starts its child processes according to the child specifications in the start specification. In this case there is a single child process, called ch3.

          supervisor:start_link/3 is synchronous. It does not return until all child processes have been started.

          @@ -536,23 +536,23 @@

          A supervisor with restart strategy simple_one_for_one is a simplified one_for_one supervisor, where all child processes are dynamically added instances of the same process.

          The following is an example of a callback module for a simple_one_for_one -supervisor:

          -module(simple_sup).
          --behaviour(supervisor).
          +supervisor:

          -module(simple_sup).
          +-behaviour(supervisor).
           
          --export([start_link/0]).
          --export([init/1]).
          +-export([start_link/0]).
          +-export([init/1]).
           
          -start_link() ->
          -    supervisor:start_link(simple_sup, []).
          +start_link() ->
          +    supervisor:start_link(simple_sup, []).
           
          -init(_Args) ->
          -    SupFlags = #{strategy => simple_one_for_one,
          +init(_Args) ->
          +    SupFlags = #{strategy => simple_one_for_one,
                            intensity => 0,
          -                 period => 1},
          -    ChildSpecs = [#{id => call,
          -                    start => {call, start_link, []},
          -                    shutdown => brutal_kill}],
          -    {ok, {SupFlags, ChildSpecs}}.

          When started, the supervisor does not start any child + period => 1}, + ChildSpecs = [#{id => call, + start => {call, start_link, []}, + shutdown => brutal_kill}], + {ok, {SupFlags, ChildSpecs}}.

          When started, the supervisor does not start any child processes. Instead, all child processes need to be added dynamically by calling supervisor:start_child(Sup, List).

          Sup is the pid, or name, of the supervisor. List is an arbitrary list of terms, which are added to the list of arguments specified in the child @@ -664,7 +664,7 @@ Erlang programming language

          /usr/share/doc/packages/erlang-doc/doc/system/system_limits.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/system/system_limits.html 2025-05-10 20:18:59.749105600 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/system_limits.html 2025-05-10 20:18:59.753105636 +0000 @@ -220,7 +220,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/doc/system/system_principles.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/system_principles.html 2025-05-10 20:18:59.777105854 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/system_principles.html 2025-05-10 20:18:59.777105854 +0000 @@ -270,7 +270,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/doc/system/tablesdatabases.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/tablesdatabases.html 2025-05-10 20:18:59.809106144 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/tablesdatabases.html 2025-05-10 20:18:59.809106144 +0000 @@ -150,11 +150,11 @@

          The delete operation is considered successful if the element was not present in the table. Hence all attempts to check that the element is present in the Ets/Mnesia table before deletion are unnecessary. Here follows an example for -Ets tables:

          DO

          ets:delete(Tab, Key),

          DO NOT

          case ets:lookup(Tab, Key) of
          -    [] ->
          +Ets tables:

          DO

          ets:delete(Tab, Key),

          DO NOT

          case ets:lookup(Tab, Key) of
          +    [] ->
                   ok;
          -    [_|_] ->
          -        ets:delete(Tab, Key)
          +    [_|_] ->
          +        ets:delete(Tab, Key)
           end,

          @@ -166,49 +166,49 @@ functions print_name/1, print_age/1, and print_occupation/1.

          Note

          If the function print_name/1, and so on, had been interface functions, the situation would have been different, as you do not want the user of the interface to know about the internal data representation.

          DO

          %%% Interface function
          -print_person(PersonId) ->
          +print_person(PersonId) ->
               %% Look up the person in the named table person,
          -    case ets:lookup(person, PersonId) of
          -        [Person] ->
          -            print_name(Person),
          -            print_age(Person),
          -            print_occupation(Person);
          -        [] ->
          -            io:format("No person with ID = ~p~n", [PersonID])
          +    case ets:lookup(person, PersonId) of
          +        [Person] ->
          +            print_name(Person),
          +            print_age(Person),
          +            print_occupation(Person);
          +        [] ->
          +            io:format("No person with ID = ~p~n", [PersonID])
               end.
           
           %%% Internal functions
          -print_name(Person) ->
          -    io:format("No person ~p~n", [Person#person.name]).
          +print_name(Person) ->
          +    io:format("No person ~p~n", [Person#person.name]).
           
          -print_age(Person) ->
          -    io:format("No person ~p~n", [Person#person.age]).
          +print_age(Person) ->
          +    io:format("No person ~p~n", [Person#person.age]).
           
          -print_occupation(Person) ->
          -    io:format("No person ~p~n", [Person#person.occupation]).

          DO NOT

          %%% Interface function
          -print_person(PersonId) ->
          +print_occupation(Person) ->
          +    io:format("No person ~p~n", [Person#person.occupation]).

          DO NOT

          %%% Interface function
          +print_person(PersonId) ->
               %% Look up the person in the named table person,
          -    case ets:lookup(person, PersonId) of
          -        [Person] ->
          -            print_name(PersonID),
          -            print_age(PersonID),
          -            print_occupation(PersonID);
          -        [] ->
          -            io:format("No person with ID = ~p~n", [PersonID])
          +    case ets:lookup(person, PersonId) of
          +        [Person] ->
          +            print_name(PersonID),
          +            print_age(PersonID),
          +            print_occupation(PersonID);
          +        [] ->
          +            io:format("No person with ID = ~p~n", [PersonID])
               end.
           
           %%% Internal functions
          -print_name(PersonID) ->
          -    [Person] = ets:lookup(person, PersonId),
          -    io:format("No person ~p~n", [Person#person.name]).
          -
          -print_age(PersonID) ->
          -    [Person] = ets:lookup(person, PersonId),
          -    io:format("No person ~p~n", [Person#person.age]).
          -
          -print_occupation(PersonID) ->
          -    [Person] = ets:lookup(person, PersonId),
          -    io:format("No person ~p~n", [Person#person.occupation]).

          +print_name(PersonID) -> + [Person] = ets:lookup(person, PersonId), + io:format("No person ~p~n", [Person#person.name]). + +print_age(PersonID) -> + [Person] = ets:lookup(person, PersonId), + io:format("No person ~p~n", [Person#person.age]). + +print_occupation(PersonID) -> + [Person] = ets:lookup(person, PersonId), + io:format("No person ~p~n", [Person#person.occupation]).

          @@ -230,30 +230,30 @@ #person{idno = 4, name = "Carl", age = 25, occupation = "mailman"}]

          If you must return all data stored in the Ets table, you can use ets:tab2list/1. However, usually you are only interested in a subset of the information in which case ets:tab2list/1 is expensive. If you only want to -extract one field from each record, for example, the age of every person, then:

          DO

          ets:select(Tab, [{#person{idno='_',
          +extract one field from each record, for example, the age of every person, then:

          DO

          ets:select(Tab, [{#person{idno='_',
                                     name='_',
                                     age='$1',
          -                          occupation = '_'},
          -                [],
          -                ['$1']}]),

          DO NOT

          TabList = ets:tab2list(Tab),
          -lists:map(fun(X) -> X#person.age end, TabList),

          If you are only interested in the age of all persons named "Bryan", then:

          DO

          ets:select(Tab, [{#person{idno='_',
          +                          occupation = '_'},
          +                [],
          +                ['$1']}]),

          DO NOT

          TabList = ets:tab2list(Tab),
          +lists:map(fun(X) -> X#person.age end, TabList),

          If you are only interested in the age of all persons named "Bryan", then:

          DO

          ets:select(Tab, [{#person{idno='_',
                                     name="Bryan",
                                     age='$1',
          -                          occupation = '_'},
          -                [],
          -                ['$1']}])

          DO NOT

          TabList = ets:tab2list(Tab),
          -lists:foldl(fun(X, Acc) -> case X#person.name of
          +                          occupation = '_'},
          +                [],
          +                ['$1']}])

          DO NOT

          TabList = ets:tab2list(Tab),
          +lists:foldl(fun(X, Acc) -> case X#person.name of
                                           "Bryan" ->
          -                                    [X#person.age|Acc];
          +                                    [X#person.age|Acc];
                                            _ ->
                                                Acc
                                      end
          -             end, [], TabList)

          If you need all information stored in the Ets table about persons named "Bryan", -then:

          DO

          ets:select(Tab, [{#person{idno='_',
          +             end, [], TabList)

          If you need all information stored in the Ets table about persons named "Bryan", +then:

          DO

          ets:select(Tab, [{#person{idno='_',
                                     name="Bryan",
                                     age='_',
          -                          occupation = '_'}, [], ['$_']}]),

          DO NOT

          TabList = ets:tab2list(Tab),
          -lists:filter(fun(X) -> X#person.name == "Bryan" end, TabList),

          + occupation = '_'}, [], ['$_']}]),

          DO NOT

          TabList = ets:tab2list(Tab),
          +lists:filter(fun(X) -> X#person.name == "Bryan" end, TabList),

          @@ -297,12 +297,12 @@ #index_entry{name="Bryan", idno=2}, #index_entry{name="Bryan", idno=3}, #index_entry{name="Carl", idno=4}]

          Given this index table, a lookup of the age fields for all persons named -"Bryan" can be done as follows:

          MatchingIDs = ets:lookup(IndexTable,"Bryan"),
          -lists:map(fun(#index_entry{idno = ID}) ->
          -                 [#person{age = Age}] = ets:lookup(PersonTable, ID),
          +"Bryan" can be done as follows:

          MatchingIDs = ets:lookup(IndexTable,"Bryan"),
          +lists:map(fun(#index_entry{idno = ID}) ->
          +                 [#person{age = Age}] = ets:lookup(PersonTable, ID),
                            Age
                     end,
          -          MatchingIDs),

          Notice that this code does not use ets:match/2, but instead uses the + MatchingIDs),

          Notice that this code does not use ets:match/2, but instead uses the ets:lookup/2 call. The lists:map/2 call is only used to traverse the idnos matching the name "Bryan" in the table; thus the number of lookups in the master table is minimized.

          Keeping an index table introduces some overhead when inserting records in the @@ -325,17 +325,17 @@ mnesia:match_object() as these function traverse the whole table. Instead, you can create a secondary index and use mnesia:index_read/3 to get faster access at the expense of using more -memory.

          Example:

          -record(person, {idno, name, age, occupation}).
          +memory.

          Example:

          -record(person, {idno, name, age, occupation}).
                   ...
          -{atomic, ok} =
          -mnesia:create_table(person, [{index,[#person.age]},
          -                              {attributes,
          -                                    record_info(fields, person)}]),
          -{atomic, ok} = mnesia:add_table_index(person, age),
          +{atomic, ok} =
          +mnesia:create_table(person, [{index,[#person.age]},
          +                              {attributes,
          +                                    record_info(fields, person)}]),
          +{atomic, ok} = mnesia:add_table_index(person, age),
           ...
           
           PersonsAge42 =
          -     mnesia:dirty_index_read(person, 42, #person.age),

          + mnesia:dirty_index_read(person, 42, #person.age),

          @@ -349,19 +349,19 @@ the table. Other processes must send update requests to that process.

          Example:

          ...
           %% Using transaction
           
          -Fun = fun() ->
          -          [mnesia:read({Table, Key}),
          -           mnesia:read({Table2, Key2})]
          +Fun = fun() ->
          +          [mnesia:read({Table, Key}),
          +           mnesia:read({Table2, Key2})]
                 end,
           
          /usr/share/doc/packages/erlang-doc/doc/system/tutorial.html differs (HTML document, UTF-8 Unicode text)
          --- old//usr/share/doc/packages/erlang-doc/doc/system/tutorial.html	2025-05-10 20:18:59.833106361 +0000
          +++ new//usr/share/doc/packages/erlang-doc/doc/system/tutorial.html	2025-05-10 20:18:59.833106361 +0000
          @@ -188,7 +188,7 @@
                     Erlang programming language
           
                 

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/doc/system/typespec.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/typespec.html 2025-05-10 20:18:59.857106579 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/typespec.html 2025-05-10 20:18:59.865106652 +0000 @@ -242,11 +242,11 @@ predefined aliases for the type unions also shown in the table.

          Built-in typeDefined as
          term/0any/0
          binary/0<<_:_*8>>
          nonempty_binary/0<<_:8, _:_*8>>
          bitstring/0<<_:_*1>>
          nonempty_bitstring/0<<_:1, _:_*1>>
          boolean/0'false' | 'true'
          byte/00..255
          char/00..16#10ffff
          nil/0[]
          number/0integer/0 | float/0
          list/0[any()]
          maybe_improper_list/0maybe_improper_list(any(), any())
          nonempty_list/0nonempty_list(any())
          string/0[char()]
          nonempty_string/0[char(),...]
          iodata/0iolist() | binary()
          iolist/0maybe_improper_list(byte() | binary() | iolist(), binary() | [])
          map/0#{any() => any()}
          function/0fun()
          module/0atom/0
          mfa/0{module(),atom(),arity()}
          arity/00..255
          identifier/0pid() | port() | reference()
          node/0atom/0
          timeout/0'infinity' | non_neg_integer()
          no_return/0none/0

          Table: Built-in types, predefined aliases

          In addition, the following three built-in types exist and can be thought as defined below, though strictly their "type definition" is not valid syntax according to the type language defined above.

          Built-in typeCan be thought defined by the syntax
          non_neg_integer/00..
          pos_integer/01..
          neg_integer/0..-1

          Table: Additional built-in types

          Note

          The following built-in list types also exist, but they are expected to be -rarely used. Hence, they have long names:

          nonempty_maybe_improper_list() :: nonempty_maybe_improper_list(any(), any())
          -nonempty_improper_list(Type1, Type2)
          -nonempty_maybe_improper_list(Type1, Type2)

          where the last two types define the set of Erlang terms one would expect.

          Also for convenience, record notation is allowed to be used. Records are -shorthands for the corresponding tuples:

          Record :: #Erlang_Atom{}
          -        | #Erlang_Atom{Fields}

          Records are extended to possibly contain type information. This is described in +rarely used. Hence, they have long names:

          nonempty_maybe_improper_list() :: nonempty_maybe_improper_list(any(), any())
          +nonempty_improper_list(Type1, Type2)
          +nonempty_maybe_improper_list(Type1, Type2)

          where the last two types define the set of Erlang terms one would expect.

          Also for convenience, record notation is allowed to be used. Records are +shorthands for the corresponding tuples:

          Record :: #Erlang_Atom{}
          +        | #Erlang_Atom{Fields}

          Records are extended to possibly contain type information. This is described in Type Information in Record Declarations.

          @@ -257,8 +257,8 @@ name as a built-in type.

          It is recommended to avoid deliberately reusing built-in names because it can be confusing. However, when an Erlang/OTP release introduces a new type, code that happened to define its own type having the same name will continue to work.

          As an example, imagine that the Erlang/OTP 42 release introduces a new type -gadget() defined like this:

          -type gadget() :: {'gadget', reference()}.

          Further imagine that some code has its own (different) definition of gadget(), -for example:

          -type gadget() :: #{}.

          Since redefinitions are allowed, the code will still compile (but with a +gadget() defined like this:

          -type gadget() :: {'gadget', reference()}.

          Further imagine that some code has its own (different) definition of gadget(), +for example:

          -type gadget() :: #{}.

          Since redefinitions are allowed, the code will still compile (but with a warning), and Dialyzer will not emit any additional warnings.

          @@ -267,8 +267,8 @@

          As seen, the basic syntax of a type is an atom followed by closed parentheses. New types are declared using -type and -opaque attributes as in the -following:

          -type my_struct_type() :: Type.
          --opaque my_opaq_type() :: Type.

          The type name is the atom my_struct_type, followed by parentheses. Type is a +following:

          -type my_struct_type() :: Type.
          +-opaque my_opaq_type() :: Type.

          The type name is the atom my_struct_type, followed by parentheses. Type is a type as defined in the previous section. A current restriction is that Type can contain only predefined types, or user-defined types which are either of the following:

          • Module-local type, that is, with a definition that is present in the code of @@ -278,10 +278,10 @@ similar restriction currently exists for records.)

            Type declarations can also be parameterized by including type variables between the parentheses. The syntax of type variables is the same as Erlang variables, that is, starts with an upper-case letter. These variables is to -appear on the RHS of the definition. A concrete example follows:

            -type orddict(Key, Val) :: [{Key, Val}].

            A module can export some types to declare that other modules are allowed to -refer to them as remote types. This declaration has the following form:

            -export_type([T1/A1, ..., Tk/Ak]).

            Here the Tis are atoms (the name of the type) and the Ais are their arguments.

            Example:

            -export_type([my_struct_type/0, orddict/2]).

            Assuming that these types are exported from module 'mod', you can refer to -them from other modules using remote type expressions like the following:

            mod:my_struct_type()
            -mod:orddict(atom(), term())

            It is not allowed to refer to types that are not declared as exported.

            Types declared as opaque represent sets of terms whose structure is not +appear on the RHS of the definition. A concrete example follows:

            -type orddict(Key, Val) :: [{Key, Val}].

            A module can export some types to declare that other modules are allowed to +refer to them as remote types. This declaration has the following form:

            -export_type([T1/A1, ..., Tk/Ak]).

            Here the Tis are atoms (the name of the type) and the Ais are their arguments.

            Example:

            -export_type([my_struct_type/0, orddict/2]).

            Assuming that these types are exported from module 'mod', you can refer to +them from other modules using remote type expressions like the following:

            mod:my_struct_type()
            +mod:orddict(atom(), term())

            It is not allowed to refer to types that are not declared as exported.

            Types declared as opaque represent sets of terms whose structure is not supposed to be visible from outside of their defining module. That is, only the module defining them is allowed to depend on their term structure. Consequently, such types do not make much sense as module local - module local types are not @@ -292,33 +292,33 @@ Type Information in Record Declarations

          The types of record fields can be specified in the declaration of the record. -The syntax for this is as follows:

          -record(rec, {field1 :: Type1, field2, field3 :: Type3}).

          For fields without type annotations, their type defaults to any(). That is, the -previous example is a shorthand for the following:

          -record(rec, {field1 :: Type1, field2 :: any(), field3 :: Type3}).

          In the presence of initial values for fields, the type must be declared after -the initialization, as follows:

          -record(rec, {field1 = [] :: Type1, field2, field3 = 42 :: Type3}).

          The initial values for fields are to be compatible with (that is, a member of) +The syntax for this is as follows:

          -record(rec, {field1 :: Type1, field2, field3 :: Type3}).

          For fields without type annotations, their type defaults to any(). That is, the +previous example is a shorthand for the following:

          -record(rec, {field1 :: Type1, field2 :: any(), field3 :: Type3}).

          In the presence of initial values for fields, the type must be declared after +the initialization, as follows:

          -record(rec, {field1 = [] :: Type1, field2, field3 = 42 :: Type3}).

          The initial values for fields are to be compatible with (that is, a member of) the corresponding types. This is checked by the compiler and results in a compilation error if a violation is detected.

          Change

          Before Erlang/OTP 19, for fields without initial values, the singleton type 'undefined' was added to all declared types. In other words, the following -two record declarations had identical effects:

          -record(rec, {f1 = 42 :: integer(),
          -             f2      :: float(),
          -             f3      :: 'a' | 'b'}).
          +two record declarations had identical effects:

          -record(rec, {f1 = 42 :: integer(),
          +             f2      :: float(),
          +             f3      :: 'a' | 'b'}).
           
          --record(rec, {f1 = 42 :: integer(),
          -              f2      :: 'undefined' | float(),
          -              f3      :: 'undefined' | 'a' | 'b'}).

          This is no longer the case. If you require 'undefined' in your record field +-record(rec, {f1 = 42 :: integer(), + f2 :: 'undefined' | float(), + f3 :: 'undefined' | 'a' | 'b'}).

          This is no longer the case. If you require 'undefined' in your record field type, you must explicitly add it to the typespec, as in the 2nd example.

          Any record, containing type information or not, once defined, can be used as a type using the following syntax:

          #rec{}

          In addition, the record fields can be further specified when using a record type by adding type information about the field as follows:

          #rec{some_field :: Type}

          Any unspecified fields are assumed to have the type in the original record declaration.

          Note

          When records are used to create patterns for ETS and Mnesia match functions, -Dialyzer may need some help not to emit bad warnings. For example:

          -type height() :: pos_integer().
          --record(person, {name :: string(), height :: height()}).
          +Dialyzer may need some help not to emit bad warnings. For example:

          -type height() :: pos_integer().
          +-record(person, {name :: string(), height :: height()}).
           
          -lookup(Name, Tab) ->
          -    ets:match_object(Tab, #person{name = Name, _ = '_'}).

          Dialyzer will emit a warning since '_' is not in the type of record field +lookup(Name, Tab) -> + ets:match_object(Tab, #person{name = Name, _ = '_'}).

          Dialyzer will emit a warning since '_' is not in the type of record field height.

          The recommended way of dealing with this is to declare the smallest record field types to accommodate all your needs, and then create refinements as -needed. The modified example:

          -record(person, {name :: string(), height :: height() | '_'}).
          +needed. The modified example:

          -record(person, {name :: string(), height :: height() | '_'}).
           
          --type person() :: #person{height :: height()}.

          In specifications and type declarations the type person() is to be preferred +-type person() :: #person{height :: height()}.

          In specifications and type declarations the type person() is to be preferred before #person{}.

          @@ -331,27 +331,27 @@ arguments, otherwise the compilation fails.

          The following longer format with module name is also valid as long as Module is the name of the current module. This can be useful for documentation purposes.

          -spec Module:Function(ArgType1, ..., ArgTypeN) -> ReturnType.

          Also, for documentation purposes, argument names can be given:

          -spec Function(ArgName1 :: Type1, ..., ArgNameN :: TypeN) -> RT.

          A function specification can be overloaded. That is, it can have several types, -separated by a semicolon (;). For example:

          -spec foo(T1, T2) -> T3;
          -         (T4, T5) -> T6.

          A current restriction, which currently results in a warning by Dialyzer, is that +separated by a semicolon (;). For example:

          -spec foo(T1, T2) -> T3;
          +         (T4, T5) -> T6.

          A current restriction, which currently results in a warning by Dialyzer, is that the domains of the argument types cannot overlap. For example, the following -specification results in a warning:

          -spec foo(pos_integer()) -> pos_integer();
          -         (integer()) -> integer().

          Type variables can be used in specifications to specify relations for the input +specification results in a warning:

          -spec foo(pos_integer()) -> pos_integer();
          +         (integer()) -> integer().

          Type variables can be used in specifications to specify relations for the input and output arguments of a function. For example, the following specification defines the type of a polymorphic identity function:

          -spec id(X) -> X.

          Notice that the above specification does not restrict the input and output type in any way. These types can be constrained by guard-like subtype constraints and -provide bounded quantification:

          -spec id(X) -> X when X :: tuple().

          Currently, the :: constraint (read as "is a subtype of") is the only guard +provide bounded quantification:

          -spec id(X) -> X when X :: tuple().

          Currently, the :: constraint (read as "is a subtype of") is the only guard constraint that can be used in the when part of a -spec attribute.

          Note

          The above function specification uses multiple occurrences of the same type variable. That provides more type information than the following function -specification, where the type variables are missing:

          -spec id(tuple()) -> tuple().

          The latter specification says that the function takes some tuple and returns +specification, where the type variables are missing:

          -spec id(tuple()) -> tuple().

          The latter specification says that the function takes some tuple and returns some tuple. The specification with the X type variable specifies that the function takes a tuple and returns the same tuple.

          However, it is up to the tools that process the specifications to choose whether to take this extra information into account or not.

          The scope of a :: constraint is the (...) -> RetType specification after which it appears. To avoid confusion, it is suggested that different variables are used in different constituents of an overloaded contract, as shown in the -following example:

          -spec foo({X, integer()}) -> X when X :: atom();
          -         ([Y]) -> Y when Y :: number().

          Some functions in Erlang are not meant to return; either because they define +following example:

          -spec foo({X, integer()}) -> X when X :: atom();
          +         ([Y]) -> Y when Y :: number().

          Some functions in Erlang are not meant to return; either because they define servers or because they are used to throw exceptions, as in the following -function:

          my_error(Err) -> throw({error, Err}).

          For such functions, it is recommended to use the special no_return/0 type +function:

          my_error(Err) -> throw({error, Err}).

          For such functions, it is recommended to use the special no_return/0 type for their "return", through a contract of the following form:

          -spec my_error(term()) -> no_return().

          Note

          Erlang uses the shorthand version _ as an anonymous type variable equivalent to term/0 or any/0. For example, the following function

          -spec Function(string(), _) -> string().

          is equivalent to:

          -spec Function(string(), any()) -> string().
          @@ -404,7 +404,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/doc/system/upgrade.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/system/upgrade.html 2025-05-10 20:18:59.885106833 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/upgrade.html 2025-05-10 20:18:59.889106868 +0000 @@ -219,7 +219,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/doc/system/versions.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/versions.html 2025-05-10 20:18:59.913107087 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/versions.html 2025-05-10 20:18:59.913107087 +0000 @@ -333,7 +333,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/doc/system_principles.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/system_principles.html 2025-05-10 20:18:59.933107268 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system_principles.html 2025-05-10 20:18:59.937107304 +0000 @@ -162,7 +162,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/doc/tftp.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/tftp.html 2025-05-10 20:18:59.953107450 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/tftp.html 2025-05-10 20:18:59.957107486 +0000 @@ -162,7 +162,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/doc/tools.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/tools.html 2025-05-10 20:18:59.977107667 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/tools.html 2025-05-10 20:18:59.977107667 +0000 @@ -162,7 +162,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/doc/tutorial.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/tutorial.html 2025-05-10 20:18:59.997107848 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/tutorial.html 2025-05-10 20:18:59.997107848 +0000 @@ -162,7 +162,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/doc/upcoming_incompatibilities.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/upcoming_incompatibilities.html 2025-05-10 20:19:00.025108102 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/upcoming_incompatibilities.html 2025-05-10 20:19:00.025108102 +0000 @@ -170,10 +170,10 @@ Singleton type variables will become a compile-time error

          -

          Before Erlang/OTP 26, the compiler would silenty accept the following spec:

          -spec f(Opts) -> term() when
          -    Opts :: {ok, Unknown} | {error, Unknown}.
          -f(_) -> error.

          In OTP 26, the compiler emits a warning pointing out that the type variable -Unknown is unbound:

          t.erl:6:18: Warning: type variable 'Unknown' is only used once (is unbound)
          +

          Before Erlang/OTP 26, the compiler would silenty accept the following spec:

          -spec f(Opts) -> term() when
          +    Opts :: {ok, Unknown} | {error, Unknown}.
          +f(_) -> error.

          In OTP 26, the compiler emits a warning pointing out that the type variable +Unknown is unbound:

          t.erl:6:18: Warning: type variable 'Unknown' is only used once (is unbound)
           %    6|     Opts :: {ok, Unknown} | {error, Unknown}.
           %     |                  ^

          In OTP 27, that warning will become an error.

          @@ -183,7 +183,7 @@

          Escripts will be compiled by default instead of interpreted. That means that the compiler application must be available.

          The old behavior of interpreting escripts can be restored by adding the -following line to the script file:

          -mode(interpret).

          In OTP 28, support for interpreting an escript will be removed.

          +following line to the script file:

          -mode(interpret).

          In OTP 28, support for interpreting an escript will be removed.

          @@ -235,10 +235,10 @@ %% In OTP 27 it is instead interpreted as a %% Triple-Quoted String equivalent to "String Content"

          """"
          -++ foo() ++
          +++ foo() ++
           """"
           %% Became
          -"" ++ foo() ++ ""
          +"" ++ foo() ++ ""
           %%
           %% In OTP 27 it is instead interpreted as a
           %% Triple-Quoted String (triple-or-more) equivalent to
          @@ -362,7 +362,7 @@
                     Erlang programming language
           
                 

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/doc/wx.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/wx.html 2025-05-10 20:19:00.045108284 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/wx.html 2025-05-10 20:19:00.045108284 +0000 @@ -162,7 +162,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/doc/xmerl.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/doc/xmerl.html 2025-05-10 20:19:00.065108465 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/xmerl.html 2025-05-10 20:19:00.065108465 +0000 @@ -162,7 +162,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/404.html 2025-05-10 20:19:00.085108646 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/404.html 2025-05-10 20:19:00.085108646 +0000 @@ -143,7 +143,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/absform.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/absform.html 2025-05-10 20:19:00.109108864 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/absform.html 2025-05-10 20:19:00.117108936 +0000 @@ -516,7 +516,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/alt_disco.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/alt_disco.html 2025-05-10 20:19:00.137109117 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/alt_disco.html 2025-05-10 20:19:00.141109154 +0000 @@ -206,7 +206,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/alt_dist.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/alt_dist.html 2025-05-10 20:19:00.189109589 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/alt_dist.html 2025-05-10 20:19:00.213109807 +0000 @@ -241,10 +241,10 @@ Exported Callback Functions

          -

          The following functions are mandatory:

          • listen(Name) ->
            -  {ok, {Listen, Address, Creation}} | {error, Error}
            -listen(Name,Host) ->
            -  {ok, {Listen, Address, Creation}} | {error, Error}

            listen/2 is called once in order to listen for incoming connection requests. +

            The following functions are mandatory:

            • listen(Name) ->
              +  {ok, {Listen, Address, Creation}} | {error, Error}
              +listen(Name,Host) ->
              +  {ok, {Listen, Address, Creation}} | {error, Error}

              listen/2 is called once in order to listen for incoming connection requests. The call is made when the distribution is brought up. The argument Name is the part of the node name before the @ sign in the full node name. It can be either an atom or a string. The argument Host is the part of the node name @@ -254,12 +254,12 @@ #net_address{} record is defined in kernel/include/net_address.hrl), and Creation which (currently) is an integer 1, 2, or 3.

              If epmd is to be used for node discovery, you typically want to use the erl_epmd module (part of the kernel application) in order to -register the listen port with epmd and retrieve Creation to use.

            • address() ->
              +register the listen port with epmd and retrieve Creation to use.

            • address() ->
                 Address

              address/0 is called in order to get the Address part of the listen/2 function without creating a listen socket. -All fields except address have to be set in the returned record

              Example:

              address() ->
              -    {ok, Host} = inet:gethostname(),
              -    #net_address{ host = Host, protocol = tcp, family = inet6 }.
            • accept(Listen) ->
              +All fields except address have to be set in the returned record

              Example:

              address() ->
              +    {ok, Host} = inet:gethostname(),
              +    #net_address{ host = Host, protocol = tcp, family = inet6 }.
            • accept(Listen) ->
                 AcceptorPid

              accept/1 should spawn a process that accepts connections. This process should preferably execute on max priority. The process identifier of this process should be returned.

              The Listen argument will be the same as the Listen handle part of the @@ -268,7 +268,7 @@ may not be the process registered as net_kernel) and is in this document identified as Kernel. When a connection has been accepted by the acceptor process, it needs to inform Kernel about the accepted connection. This is -done by passing a message on the form:

              Kernel ! {accept, AcceptorPid, DistController, Family, Proto}

              DistController is either the process or port identifier of the distribution +done by passing a message on the form:

              Kernel ! {accept, AcceptorPid, DistController, Family, Proto}

              DistController is either the process or port identifier of the distribution controller for the connection. The distribution controller should be created by the acceptor processes when a new connection is accepted. Its job is to dispatch traffic on the connection.

              Kernel responds with one of the following messages:

              • {Kernel, controller, SupervisorPid} - The request was accepted and @@ -276,7 +276,7 @@ process (which is created in the accept_connection/5 callback).

              • {Kernel, unsupported_protocol} - The request was rejected. This is a fatal error. The acceptor process should terminate.

              When an accept sequence has been completed the acceptor process is expected to -continue accepting further requests.

            • accept_connection(AcceptorPid, DistCtrl, MyNode, Allowed, SetupTime) ->
              +continue accepting further requests.

            • accept_connection(AcceptorPid, DistCtrl, MyNode, Allowed, SetupTime) ->
                 ConnectionSupervisorPid

              accept_connection/5 should spawn a process that will perform the Erlang distribution handshake for the connection. If the handshake successfully completes it should continue to function as a connection supervisor. This @@ -298,7 +298,7 @@ the handshake in a #hs_data{} record and call dist_util:handshake_other_started(HsData) with this record.

              dist_util:handshake_other_started(HsData) will perform the handshake and if the handshake successfully completes this process will then continue in a -connection supervisor loop as long as the connection is up.

            • setup(Node, Type, MyNode, LongOrShortNames, SetupTime) ->
              +connection supervisor loop as long as the connection is up.

            • setup(Node, Type, MyNode, LongOrShortNames, SetupTime) ->
                 ConnectionSupervisorPid

              setup/5 should spawn a process that connects to Node. When connection has been established it should perform the Erlang distribution handshake for the connection. If the handshake successfully completes it should continue to @@ -324,15 +324,15 @@ the handshake in a #hs_data{} record and call dist_util:handshake_we_started(HsData) with this record.

              dist_util:handshake_we_started(HsData) will perform the handshake and the handshake successfully completes this process will then continue in a -connection supervisor loop as long as the connection is up.

            • close(Listen) ->
              -  void()

              Called in order to close the Listen handle that originally was passed from -the listen/1 callback.

            • select(NodeName) ->
              -  boolean()

              Return true if the host name part of the NodeName is valid for use with -this protocol; otherwise, false.

            There are also two optional functions that may be exported:

            • setopts(Listen, Opts) ->
              -  ok | {error, Error}

              The argument Listen is the handle originally passed from the +connection supervisor loop as long as the connection is up.

            • close(Listen) ->
              +  void()

              Called in order to close the Listen handle that originally was passed from +the listen/1 callback.

            • select(NodeName) ->
              +  boolean()

              Return true if the host name part of the NodeName is valid for use with +this protocol; otherwise, false.

            There are also two optional functions that may be exported:

            • setopts(Listen, Opts) ->
              +  ok | {error, Error}

              The argument Listen is the handle originally passed from the listen/1 callback. The argument Opts is a list of -options to set on future connections.

            • getopts(Listen, Opts) ->
              -  {ok, OptionValues} | {error, Error}

              The argument Listen is the handle originally passed from the +options to set on future connections.

            • getopts(Listen, Opts) ->
              +  {ok, OptionValues} | {error, Error}

              The argument Listen is the handle originally passed from the listen/1 callback. The argument Opts is a list of options to read for future connections.

            @@ -354,36 +354,36 @@ dist_util:start_timer/1.

          • allowed - Information passed as Allowed to accept_connection/5. This field is only mandatory when the remote node initiated the connection. That is, when the connection is set up via -accept_connection/5.

          • f_send - A fun with the following signature:

            fun (DistCtrlr, Data) -> ok | {error, Error}

            where DistCtrlr is the identifier of the distribution controller and Data -is io data to pass to the other side.

            Only used during handshake phase.

          • f_recv - A fun with the following signature:

            fun (DistCtrlr, Length) -> {ok, Packet} | {error, Reason}

            where DistCtrlr is the identifier of the distribution controller. If +accept_connection/5.

          • f_send - A fun with the following signature:

            fun (DistCtrlr, Data) -> ok | {error, Error}

            where DistCtrlr is the identifier of the distribution controller and Data +is io data to pass to the other side.

            Only used during handshake phase.

          • f_recv - A fun with the following signature:

            fun (DistCtrlr, Length) -> {ok, Packet} | {error, Reason}

            where DistCtrlr is the identifier of the distribution controller. If Length is 0, all available bytes should be returned. If Length > 0, exactly Length bytes should be returned, or an error; possibly discarding less than Length bytes of data when the connection is closed from the other side. It is used for passive receive of data from the other end.

            Only used during handshake phase.

          • f_setopts_pre_nodeup - A fun with the -following signature:

            fun (DistCtrlr) -> ok | {error, Error}

            where DistCtrlr is the identifier of the distribution controller. Called +following signature:

            fun (DistCtrlr) -> ok | {error, Error}

            where DistCtrlr is the identifier of the distribution controller. Called just before the distribution channel is taken up for normal traffic.

            Only used during handshake phase.

          • f_setopts_post_nodeup - A fun with -the following signature:

            fun (DistCtrlr) -> ok | {error, Error}

            where DistCtrlr is the identifier of the distribution controller. Called -just after distribution channel has been taken up for normal traffic.

            Only used during handshake phase.

          • f_getll - A fun with the following signature:

            fun (DistCtrlr) -> ID

            where DistCtrlr is the identifier of the distribution controller and ID is +the following signature:

            fun (DistCtrlr) -> ok | {error, Error}

            where DistCtrlr is the identifier of the distribution controller. Called +just after distribution channel has been taken up for normal traffic.

            Only used during handshake phase.

          • f_getll - A fun with the following signature:

            fun (DistCtrlr) -> ID

            where DistCtrlr is the identifier of the distribution controller and ID is the identifier of the low level entity that handles the connection (often -DistCtrlr itself).

            Only used during handshake phase.

          • f_address - A fun with the following signature:

            fun (DistCtrlr, Node) -> NetAddress

            where DistCtrlr is the identifier of the distribution controller, Node is +DistCtrlr itself).

            Only used during handshake phase.

          • f_address - A fun with the following signature:

            fun (DistCtrlr, Node) -> NetAddress

            where DistCtrlr is the identifier of the distribution controller, Node is the node name of the node on the other end, and NetAddress is a #net_address{} record with information about the address for the Node on the other end of the connection. The #net_address{} record is defined in -kernel/include/net_address.hrl.

            Only used during handshake phase.

          • mf_tick - A fun with the following signature:

            fun (DistCtrlr) -> void()

            where DistCtrlr is the identifier of the distribution controller. This +kernel/include/net_address.hrl.

            Only used during handshake phase.

          • mf_tick - A fun with the following signature:

            fun (DistCtrlr) -> void()

            where DistCtrlr is the identifier of the distribution controller. This function should send information over the connection that is not interpreted by the other end while increasing the statistics of received packets on the other end. This is usually implemented by sending an empty packet.

            Note

            It is of vital importance that this operation does not block the caller for -a long time. This since it is called from the connection supervisor.

            Used when connection is up.

          • mf_getstat - A fun with the following signature:

            fun (DistCtrlr) -> {ok, Received, Sent, PendSend}

            where DistCtrlr is the identifier of the distribution controller, Received +a long time. This since it is called from the connection supervisor.

            Used when connection is up.

          • mf_getstat - A fun with the following signature:

            fun (DistCtrlr) -> {ok, Received, Sent, PendSend}

            where DistCtrlr is the identifier of the distribution controller, Received is received packets, Sent is sent packets, and PendSend is amount of data in queue to be sent (typically in bytes, but dist_util only checks whether the value is non-zero to know there is data in queue) or a boolean/0 indicating whether there are packets in queue to be sent.

            Note

            It is of vital importance that this operation does not block the caller for a long time. This since it is called from the connection supervisor.

            Used when connection is up.

          • request_type - The request Type as passed to setup/5. This is only mandatory when the connection has -been initiated by this node. That is, the connection is set up via setup/5.

          • mf_setopts - A fun with the following signature:

            fun (DistCtrl, Opts) -> ok | {error, Error}

            where DistCtrlr is the identifier of the distribution controller and Opts -is a list of options to set on the connection.

            This function is optional. Used when connection is up.

          • mf_getopts - A fun with the following signature:

            fun (DistCtrl, Opts) -> {ok, OptionValues} | {error, Error}

            where DistCtrlr is the identifier of the distribution controller and Opts +been initiated by this node. That is, the connection is set up via setup/5.

          • mf_setopts - A fun with the following signature:

            fun (DistCtrl, Opts) -> ok | {error, Error}

            where DistCtrlr is the identifier of the distribution controller and Opts +is a list of options to set on the connection.

            This function is optional. Used when connection is up.

          • mf_getopts - A fun with the following signature:

            fun (DistCtrl, Opts) -> {ok, OptionValues} | {error, Error}

            where DistCtrlr is the identifier of the distribution controller and Opts is a list of options to read for the connection.

            This function is optional. Used when connection is up.

          • f_handshake_complete - A fun with the -following signature:

            fun (DistCtrlr, Node, DHandle) -> void()

            where DistCtrlr is the identifier of the distribution controller, Node is +following signature:

            fun (DistCtrlr, Node, DHandle) -> void()

            where DistCtrlr is the identifier of the distribution controller, Node is the node name of the node connected at the other end, and DHandle is a distribution handle needed by a distribution controller process when calling the following BIFs:

            This function is called when the handshake has completed and the distribution @@ -519,62 +519,62 @@ because in most situation you need to do it. Unix domain sockets are reliable and order maintaining, so we do not need to implement resends and such in the driver.

            We start writing the example Unix domain sockets driver by declaring prototypes -and filling in a static ErlDrvEntry structure:

            ( 1) #include <stdio.h>
            -( 2) #include <stdlib.h>
            -( 3) #include <string.h>
            -( 4) #include <unistd.h>
            -( 5) #include <errno.h>
            -( 6) #include <sys/types.h>
            -( 7) #include <sys/stat.h>
            -( 8) #include <sys/socket.h>
            -( 9) #include <sys/un.h>
            -(10) #include <fcntl.h>
            +and filling in a static ErlDrvEntry structure:

            ( 1) #include <stdio.h>
            +( 2) #include <stdlib.h>
            +( 3) #include <string.h>
            +( 4) #include <unistd.h>
            +( 5) #include <errno.h>
            +( 6) #include <sys/types.h>
            +( 7) #include <sys/stat.h>
            +( 8) #include <sys/socket.h>
            +( 9) #include <sys/un.h>
            +(10) #include <fcntl.h>
             
            -(11) #define HAVE_UIO_H
            -(12) #include "erl_driver.h"
            +(11) #define HAVE_UIO_H
            +(12) #include "erl_driver.h"
             
            -(13) /*
            +(13) /*
             (14) ** Interface routines
             (15) */
            -(16) static ErlDrvData uds_start(ErlDrvPort port, char *buff);
            -(17) static void uds_stop(ErlDrvData handle);
            -(18) static void uds_command(ErlDrvData handle, char *buff, int bufflen);
            -(19) static void uds_input(ErlDrvData handle, ErlDrvEvent event);
            -(20) static void uds_output(ErlDrvData handle, ErlDrvEvent event);
            -(21) static void uds_finish(void);
            -(22) static int uds_control(ErlDrvData handle, unsigned int command,
            -(23)                        char* buf, int count, char** res, int res_size);
            -
            -(24) /* The driver entry */
            -(25) static ErlDrvEntry uds_driver_entry = {
            -(26)     NULL,                            /* init, N/A */
            -(27)     uds_start,                       /* start, called when port is opened */
            -(28)     uds_stop,                        /* stop, called when port is closed */
            -(29)     uds_command,                     /* output, called when erlang has sent */
            -(30)     uds_input,                       /* ready_input, called when input
            +(16) static ErlDrvData uds_start(ErlDrvPort port, char *buff);
            +(17) static void uds_stop(ErlDrvData handle);
            +(18) static void uds_command(ErlDrvData handle, char *buff, int bufflen);
            +(19) static void uds_input(ErlDrvData handle, ErlDrvEvent event);
            +(20) static void uds_output(ErlDrvData handle, ErlDrvEvent event);
            +(21) static void uds_finish(void);
            +(22) static int uds_control(ErlDrvData handle, unsigned int command,
            +(23)                        char* buf, int count, char** res, int res_size);
            +
            +(24) /* The driver entry */
            +(25) static ErlDrvEntry uds_driver_entry = {
            +(26)     NULL,                            /* init, N/A */
            +(27)     uds_start,                       /* start, called when port is opened */
            +(28)     uds_stop,                        /* stop, called when port is closed */
            +(29)     uds_command,                     /* output, called when erlang has sent */
            +(30)     uds_input,                       /* ready_input, called when input
             (31)                                         descriptor ready */
            /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text)
            --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/api-reference.html	2025-05-10 20:19:00.237110024 +0000
            +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/api-reference.html	2025-05-10 20:19:00.241110061 +0000
            @@ -245,7 +245,7 @@
                       Erlang programming language
             
                   

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/atomics.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/atomics.html 2025-05-10 20:19:00.261110241 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/atomics.html 2025-05-10 20:19:00.269110314 +0000 @@ -667,7 +667,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/automaticyieldingofccode.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/automaticyieldingofccode.html 2025-05-10 20:19:00.289110495 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/automaticyieldingofccode.html 2025-05-10 20:19:00.293110532 +0000 @@ -213,9 +213,9 @@ function is used, the convention is to "comment out" the source for the function by surrounding it with the following #ifdef (this way, one will not get warnings about unused functions):

            #ifdef INCLUDE_YCF_TRANSFORMED_ONLY_FUNCTIONS
            -void my_fun() {
            +void my_fun() {
                 ...
            -}
            +}
             #endif /* INCLUDE_YCF_TRANSFORMED_ONLY_FUNCTIONS */

            While editing the function one can define INCLUDE_YCF_TRANSFORMED_ONLY_FUNCTIONS so that one can see errors and warnings in the non-transformed source.

            @@ -369,7 +369,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/beam_makeops.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/beam_makeops.html 2025-05-10 20:19:00.353111076 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/beam_makeops.html 2025-05-10 20:19:00.381111330 +0000 @@ -155,9 +155,9 @@ BEAM interpreter. For the BeamAsm JIT introduced in OTP 24, the implementation of instructions are defined in emitter functions written in C++.

          Generic instructions have typed operands. Here are a few examples of -operands for move/2:

          {move,{atom,id},{x,5}}.
          -{move,{x,3},{x,0}}.
          -{move,{x,2},{y,1}}.

          When those instructions are loaded, the loader rewrites them +operands for move/2:

          {move,{atom,id},{x,5}}.
          +{move,{x,3},{x,0}}.
          +{move,{x,2},{y,1}}.

          When those instructions are loaded, the loader rewrites them to specific instructions:

          move_cx id 5
           move_xx 3 0
           move_xy 2 1

          Corresponding to each generic instruction, there is a family of @@ -189,9 +189,9 @@ an integer, an atom, or a literal).

          Now let's look at the implementation of the move instruction. There are multiple files containing implementations of instructions in the erts/emulator/beam/emu directory. The move instruction is defined -in instrs.tab. It looks like this:

          move(Src, Dst) {
          +in instrs.tab.  It looks like this:

          move(Src, Dst) {
               $Dst = $Src;
          -}

          The implementation for an instruction largely follows the C syntax, +}

          The implementation for an instruction largely follows the C syntax, except that the variables in the function head don't have any types. The $ before an identifier denotes a macro expansion. Thus, $Src will expand to the code to pick up the source operand for @@ -208,14 +208,14 @@ is stored in the lower 32 bits of the word. In the upper 32 bits is the byte offset to the X register; the register number 5 has been multiplied by the word size size 8.

          In the next word the tagged atom id is stored.

          With that background, we can look at the generated code for move_cx -in beam_hot.h:

          OpCase(move_cx):
          -{
          -  BeamInstr next_pf = BeamCodeAddr(I[2]);
          -  xb(BeamExtraData(I[0])) = I[1];
          +in beam_hot.h:

          OpCase(move_cx):
          +{
          +  BeamInstr next_pf = BeamCodeAddr(I[2]);
          +  xb(BeamExtraData(I[0])) = I[1];
             I += 2;
          -  ASSERT(VALID_INSTR(next_pf));
          -  GotoPF(next_pf);
          -}

          We will go through each line in turn.

          • OpCase(move_cx): defines a label for the instruction. The + ASSERT(VALID_INSTR(next_pf)); + GotoPF(next_pf); +}

          We will go through each line in turn.

          • OpCase(move_cx): defines a label for the instruction. The OpCase() macro is defined in beam_emu.c. It will expand this line to lb_move_cx:.

          • BeamInstr next_pf = BeamCodeAddr(I[2]); fetches the pointer to code for the next instruction to be executed. The BeamCodeAddr() @@ -229,15 +229,15 @@ this case).

          • I += 2 advances the instruction pointer to the next instruction.

          • In a debug-compiled emulator, ASSERT(VALID_INSTR(next_pf)); makes sure that next_pf is a valid instruction (that is, that it points -within the process_main() function in beam_emu.c).

          • GotoPF(next_pf); transfers control to the next instruction.

          Now let's look at the implementation of move_xx:

          OpCase(move_xx):
          -{
          -  Eterm tmp_packed1 = BeamExtraData(I[0]);
          -  BeamInstr next_pf = BeamCodeAddr(I[1]);
          -  xb((tmp_packed1>>BEAM_TIGHT_SHIFT)) = xb(tmp_packed1&BEAM_TIGHT_MASK);
          +within the process_main() function in beam_emu.c).

        • GotoPF(next_pf); transfers control to the next instruction.

        Now let's look at the implementation of move_xx:

        OpCase(move_xx):
        +{
        +  Eterm tmp_packed1 = BeamExtraData(I[0]);
        +  BeamInstr next_pf = BeamCodeAddr(I[1]);
        +  xb((tmp_packed1>>BEAM_TIGHT_SHIFT)) = xb(tmp_packed1&BEAM_TIGHT_MASK);
           I += 1;
        -  ASSERT(VALID_INSTR(next_pf));
        -  GotoPF(next_pf);
        -}

        We will go through the lines that are new or have changed compared to + ASSERT(VALID_INSTR(next_pf)); + GotoPF(next_pf); +}

        We will go through the lines that are new or have changed compared to move_cx.

        • Eterm tmp_packed1 = BeamExtraData(I[0]); picks up both X register numbers packed into the upper 32 bits of the instruction word.

        • BeamInstr next_pf = BeamCodeAddr(I[1]); pre-fetches the address of the next instruction. Note that because both X registers operands fits @@ -246,15 +246,15 @@ copies the source to the destination. (For a 64-bit architecture, BEAM_TIGHT_SHIFT is 16 and BEAM_TIGHT_MASK is 0xFFFF.)

        • I += 1; advances the instruction pointer to the next instruction.

        move_xy is almost identical to move_xx. The only difference is the use of the yb() macro instead of xb() to reference the -destination register:

        OpCase(move_xy):
        -{
        -  Eterm tmp_packed1 = BeamExtraData(I[0]);
        -  BeamInstr next_pf = BeamCodeAddr(I[1]);
        -  yb((tmp_packed1>>BEAM_TIGHT_SHIFT)) = xb(tmp_packed1&BEAM_TIGHT_MASK);
        +destination register:

        OpCase(move_xy):
        +{
        +  Eterm tmp_packed1 = BeamExtraData(I[0]);
        +  BeamInstr next_pf = BeamCodeAddr(I[1]);
        +  yb((tmp_packed1>>BEAM_TIGHT_SHIFT)) = xb(tmp_packed1&BEAM_TIGHT_MASK);
           I += 1;
        -  ASSERT(VALID_INSTR(next_pf));
        -  GotoPF(next_pf);
        -}

        + ASSERT(VALID_INSTR(next_pf)); + GotoPF(next_pf); +}

        @@ -275,13 +275,13 @@ move2 x y x y // In instrs.tab -move2(S1, D1, S2, D2) { +move2(S1, D1, S2, D2) { Eterm V1, V2; V1 = $S1; V2 = $S2; $D1 = V1; $D2 = V2; -}

      When the loader has found a match and replaced the matched instructions, +}

    When the loader has found a match and replaced the matched instructions, it will match the new instructions against the transformation rules. Because of that, we can define the rule for a move3/6 instruction as follows:

    move2 X1=x Y1=y X2=x Y2=y | move X3=x Y3=y =>
    @@ -437,21 +437,21 @@
     i_fcheckerror
     fclearerror
     %endif

    It is also possible to add an %else clause:

    %if ARCH_64
    -BS_SAFE_MUL(A, B, Fail, Dst) {
    -    Uint64 res = ($A) * ($B);
    -    if (res / $B != $A) {
    +BS_SAFE_MUL(A, B, Fail, Dst) {
    +    Uint64 res = ($A) * ($B);
    +    if (res / $B != $A) {
             $Fail;
    -    }
    +    }
         $Dst = res;
    -}
    +}
     %else
    -BS_SAFE_MUL(A, B, Fail, Dst) {
    -    Uint64 res = (Uint64)($A) * (Uint64)($B);
    -    if ((res >> (8*sizeof(Uint))) != 0) {
    +BS_SAFE_MUL(A, B, Fail, Dst) {
    +    Uint64 res = (Uint64)($A) * (Uint64)($B);
    +    if ((res >> (8*sizeof(Uint))) != 0) {
             $Fail;
    -    }
    +    }
         $Dst = res;
    -}
    +}
     %endif

    Symbols that are defined in directives

    The following symbols are always defined.

    • ARCH_64 - is 1 for a 64-bit machine, and 0 otherwise.
    • ARCH_32 - is 1 for 32-bit machine, and 0 otherwise.

    The Makefile for building the emulator currently defines the following symbols by using the -D option on the command line for beam_makeops.

    • USE_VM_PROBES - 1 if the runtime system is compiled to use VM @@ -680,7 +680,7 @@ a non-zero value, the matching of the rule will continue, otherwise the match will fail. Such guard functions are hereafter called predicates.

      The most commonly used guard constraints is equal(). It can be used -to remove a redundant move instructio like this:

      move R1 R2 | equal(R1, R2) => _

      or remove a redundant is_eq_exact instruction like this:

      is_eq_exact Lbl Src1 Src2 | equal(Src1, Src2) => _

      At the time of writing, all predicates are defined in files named +to remove a redundant move instructio like this:

      move R1 R2 | equal(R1, R2) => _

      or remove a redundant is_eq_exact instruction like this:

      is_eq_exact Lbl Src1 Src2 | equal(Src1, Src2) => _

      At the time of writing, all predicates are defined in files named predicates.tab in several directories. In predicates.tab directly in $ERL_TOP/erts/emulator/beam, predicates that are used by both the traditinal emulator and the JIT implementations are contained. @@ -696,33 +696,33 @@ internal loader data structures, but here is quick look at the implementation of a simple predicate called literal_is_map().

      Here is first an example how it is used:

      ismap Fail Lit=q | literal_is_map(Lit) =>

      If the Lit operand is a literal, then the literal_is_map() predicate is called to determine whether it is a map literal. -If it is, the instruction is not needed and can be removed.

      literal_is_map() is implemented like this (in emu/predicates.tab):

      pred.literal_is_map(Lit) {
      +If it is, the instruction is not needed and can be removed.

      literal_is_map() is implemented like this (in emu/predicates.tab):

      pred.literal_is_map(Lit) {
           Eterm term;
       
      -    ASSERT(Lit.type == TAG_q);
      -    term = beamfile_get_literal(&S->beam, Lit.val);
      -    return is_map(term);
      -}

      The pred. prefix tells beam_makeops that this function is a + ASSERT(Lit.type == TAG_q); + term = beamfile_get_literal(&S->beam, Lit.val); + return is_map(term); +}

      The pred. prefix tells beam_makeops that this function is a predicate. Without the prefix, it would have been interpreted as the implementation of an instruction (described in Defining the implementation).

      Predicate functions have a magic variabled called S, which is a pointer to a state struct. In the example, beamfile_get_literal(&S->beam, Lit.val); is used to retrieve the actual term for the literal.

      At the time of writing, the expanded C code generated by -beam_makeops looks like this:

      static int literal_is_map(LoaderState* S, BeamOpArg Lit) {
      +beam_makeops looks like this:

      static int literal_is_map(LoaderState* S, BeamOpArg Lit) {
         Eterm term;
       
      -  ASSERT(Lit.type == TAG_q);
      -  term = S->literals[Lit.val].term;
      -  return is_map(term);;
      -}

      Handling instructions with variable number of operands

      Some instructions, such as select_val/3, essentially has a variable + ASSERT(Lit.type == TAG_q); + term = S->literals[Lit.val].term; + return is_map(term);; +}

      Handling instructions with variable number of operands

      Some instructions, such as select_val/3, essentially has a variable number of operands. Such instructions have a {list,[...]} operand -as their last operand in the BEAM assembly code. For example:

      {select_val,{x,0},
      -            {f,1},
      -            {list,[{atom,b},{f,4},{atom,a},{f,5}]}}.

      The loader will convert a {list,[...]} operand to an u operand whose +as their last operand in the BEAM assembly code. For example:

      {select_val,{x,0},
      +            {f,1},
      +            {list,[{atom,b},{f,4},{atom,a},{f,5}]}}.

      The loader will convert a {list,[...]} operand to an u operand whose value is the number of elements in the list, followed by each element in the list. The instruction above would be translated to the following -generic instruction:

      {select_val,{x,0},{f,1},{u,4},{atom,b},{f,4},{atom,a},{f,5}}

      To match a variable number of arguments we need to use the special +generic instruction:

      {select_val,{x,0},{f,1},{u,4},{atom,b},{f,4},{atom,a},{f,5}}

      To match a variable number of arguments we need to use the special operand type * like this:

      select_val Src=aiq Fail=f Size=u List=* =>
      /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/beamasm.html differs (HTML document, UTF-8 Unicode text, with very long lines)
      --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/beamasm.html	2025-05-10 20:19:00.417111656 +0000
      +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/beamasm.html	2025-05-10 20:19:00.429111765 +0000
      @@ -149,10 +149,10 @@
       used in BeamAsm are much simpler than the interpreter's, as most of the
       transformations for the interpreter are done only to eliminate the instruction
       dispatch overhead.

      Then each instruction is encoded using the C++ functions in the -jit/$ARCH/instr_*.cpp files. For example:

      void BeamModuleAssembler::emit_is_nonempty_list(const ArgVal &Fail, const ArgVal &Src) {
      -  a.test(getArgRef(Src), imm(_TAG_PRIMARY_MASK - TAG_PRIMARY_LIST));
      -  a.jne(labels[Fail.getLabel()]);
      -}

      asmjit provides a fairly straightforward +jit/$ARCH/instr_*.cpp files. For example:

      void BeamModuleAssembler::emit_is_nonempty_list(const ArgVal &Fail, const ArgVal &Src) {
      +  a.test(getArgRef(Src), imm(_TAG_PRIMARY_MASK - TAG_PRIMARY_LIST));
      +  a.jne(labels[Fail.getLabel()]);
      +}

      asmjit provides a fairly straightforward mapping from a C++ function call to the x86 assembly instruction. The above instruction tests if the value in the Src register is a non-empty list and if it is not then it jumps to the fail label.

      For comparison, the interpreter has 8 combinations and specializations of @@ -160,7 +160,7 @@ common patterns.

      The original register allocation done by the Erlang compiler is used to manage the liveness of values and the physical registers are statically allocated to keep the necessary process state. At the moment this is the static register -allocation on x86-64:

      rbx: ErtsSchedulerRegisters struct (contains x/float registers and some metadata)
      +allocation on x86-64:

      rbx: ErtsSchedulerRegisters struct (contains x/float registers and some metadata)
       rbp: Current frame pointer when `perf` support is enabled, otherwise this
            is an optional save slot for the Erlang stack pointer when executing C
            code.
      @@ -187,13 +187,13 @@
       used about double the amount of memory for code as the interpreter, while current
       versions use about 10% more. How was this achieved?

      In BeamAsm we heavily use shared code fragments to try to emit as much code as possible as global shared fragments instead of duplicating the code unnecessarily. -For instance, the return instruction looks something like this:

      Label yield = a.newLabel();
      +For instance, the return instruction looks something like this:

      Label yield = a.newLabel();
       
       /* Decrement reduction counter */
      -a.dec(FCALLS);
      +a.dec(FCALLS);
       /* If FCALLS < 0, jump to the yield-on-return fragment */
      -a.jl(resolve_fragment(ga->get_dispatch_return()));
      -a.ret();

      The code above is not exactly what is emitted, but close enough. The thing to note +a.jl(resolve_fragment(ga->get_dispatch_return())); +a.ret();

      The code above is not exactly what is emitted, but close enough. The thing to note is that the code for doing the context switch is never emitted. Instead, we jump to a global fragment that all return instructions share. This greatly reduces the amount of code that has to be emitted for each module.

      @@ -243,24 +243,24 @@

      As Erlang stacks can be very small, we have to switch over to a different stack when we need to execute C code (which may expect a much larger stack). This is -done through emit_enter_runtime and emit_leave_runtime, for example:

      mov_arg(ARG4, NumFree);
      +done through emit_enter_runtime and emit_leave_runtime, for example:

      mov_arg(ARG4, NumFree);
       
       /* Move to the C stack and swap out our current reductions, stack-, and
        * heap pointer to the process structure. */
      -emit_enter_runtime<Update::eReductions | Update::eStack | Update::eHeap>();
      +emit_enter_runtime<Update::eReductions | Update::eStack | Update::eHeap>();
       
      -a.mov(ARG1, c_p);
      -load_x_reg_array(ARG2);
      -make_move_patch(ARG3, lambdas[Fun.getValue()].patches);
      +a.mov(ARG1, c_p);
      +load_x_reg_array(ARG2);
      +make_move_patch(ARG3, lambdas[Fun.getValue()].patches);
       
       /* Call `new_fun`, asserting that we're on the C stack. */
      -runtime_call<4>(new_fun);
      +runtime_call<4>(new_fun);
       
       /* Move back to the C stack, and read the updated values from the process
        * structure */
      -emit_leave_runtime<Update::eReductions | Update::eStack | Update::eHeap>();
      +emit_leave_runtime<Update::eReductions | Update::eStack | Update::eHeap>();
       
      -a.mov(getXRef(0), RET);

      All combinations of the Update constants are legal, but the ones given to +a.mov(getXRef(0), RET);

      All combinations of the Update constants are legal, but the ones given to emit_leave_runtime must be the same as those given to emit_enter_runtime.

      @@ -271,7 +271,7 @@ any function call. In the interpreter, this is done by rewriting the loaded BEAM code, but this is more complicated in BeamAsm as we want to have a fast and compact way to do this. This is solved by emitting the code below at the -start of each function (x86 variant below):

        0x0: short jmp 6 (address 0x8)
      +start of each function (x86 variant below):

        0x0: short jmp 6 (address 0x8)
         0x2: nop
         0x3: relative near call to shared breakpoint fragment
         0x8: actual code for function

      When code starts to execute it will simply see the short jmp 6 instruction @@ -293,23 +293,23 @@ executable page and once with a writable page. Since they're backed by the same memory, writes to the writable page appear magically in the executable one.

      The erts_writable_code_ptr function can be used to get writable pointers -given a module instance, provided that it has been unsealed first:

      for (i = 0; i < n; i++) {
      +given a module instance, provided that it has been unsealed first:

      for (i = 0; i < n; i++) {
           const ErtsCodeInfo* ci_exec;
           ErtsCodeInfo* ci_rw;
           void *w_ptr;
       
      -    erts_unseal_module(&modp->curr);
      +    erts_unseal_module(&modp->curr);
       
      -    ci_exec = code_hdr->functions[i];
      -    w_ptr = erts_writable_code_ptr(&modp->curr, ci_exec);
      -    ci_rw = (ErtsCodeInfo*)w_ptr;
      -
      -    uninstall_breakpoint(ci_rw, ci_exec);
      -    consolidate_bp_data(modp, ci_rw, 1);
      -    ASSERT(ci_rw->gen_bp == NULL);
      +    ci_exec = code_hdr->functions[i];
      +    w_ptr = erts_writable_code_ptr(&modp->curr, ci_exec);
      +    ci_rw = (ErtsCodeInfo*)w_ptr;
      +
      +    uninstall_breakpoint(ci_rw, ci_exec);
      +    consolidate_bp_data(modp, ci_rw, 1);
      +    ASSERT(ci_rw->gen_bp == NULL);
       
      -    erts_seal_module(&modp->curr);
      -}

      Without the module instance there's no reliable way to figure out the writable + erts_seal_module(&modp->curr); +}

      Without the module instance there's no reliable way to figure out the writable address of a code page, and we rely on address space layout randomization (ASLR) to make it difficult to guess. On some platforms, security is further enhanced by protecting the writable area from writes until the module has been @@ -397,7 +397,7 @@ flamegraph.pl out.folded > out.svg

      We get a graph that would look something like this:

      Linux Perf FlameGraph: dialyzer PLT build

      You can view a larger version here. It contains the same information, but it is easier to share with others as it does not need the symbols in the executable.

      Using the same data we can also produce a graph where the scheduler profile data -has been merged by using sed:

      #href_anchor"p"># Strip [0-9]+_ and/or _[0-9]+ from all scheduler names
      +has been merged by using sed:

      #href_anchor"p"># Strip [0-9]+_ and/or _[0-9]+ from all scheduler names
       ## scheduler names changed in OTP26, hence two expressions
       sed -e 's/^[0-9]\+_//' -e 's/^erts_\([^_]\+\)_[0-9]\+/erts_\1/' out.folded > out.folded_sched
       ## Create the svg
      @@ -552,7 +552,7 @@
                 Erlang programming language
       
             

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/carriermigration.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/carriermigration.html 2025-05-10 20:19:00.449111946 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/carriermigration.html 2025-05-10 20:19:00.453111982 +0000 @@ -407,7 +407,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/codeloading.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/codeloading.html 2025-05-10 20:19:00.473112164 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/codeloading.html 2025-05-10 20:19:00.477112200 +0000 @@ -167,8 +167,8 @@ erts_try_seize_code_load_permission and erts_release_code_load_permission).

      The ability to prepare several modules in parallel is not currently used as almost all code loading is serialized by the code_server -process. The BIF interface is however prepared for this.

        erlang:prepare_loading(Module, Code) -> LoaderState
      -  erlang:finish_loading([LoaderState])

      The idea is that prepare_loading could be called in parallel for +process. The BIF interface is however prepared for this.

        erlang:prepare_loading(Module, Code) -> LoaderState
      +  erlang:finish_loading([LoaderState])

      The idea is that prepare_loading could be called in parallel for different modules and returns a "magic binary" containing the internal state of each prepared module. Function finish_loading could take a list of such states and do the finishing of all of them in one go.

      Currently we use the legacy BIF erlang:load_module which is now @@ -319,7 +319,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/communication.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/communication.html 2025-05-10 20:19:00.497112381 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/communication.html 2025-05-10 20:19:00.497112381 +0000 @@ -202,7 +202,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/counters.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/counters.html 2025-05-10 20:19:00.521112599 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/counters.html 2025-05-10 20:19:00.525112635 +0000 @@ -513,7 +513,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/countinginstructions.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/countinginstructions.html 2025-05-10 20:19:00.545112816 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/countinginstructions.html 2025-05-10 20:19:00.545112816 +0000 @@ -220,7 +220,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/crash_dump.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/crash_dump.html 2025-05-10 20:19:00.573113070 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/crash_dump.html 2025-05-10 20:19:00.577113106 +0000 @@ -405,13 +405,13 @@ interesting. One has to "guess" what is what, but as the information is symbolic, thorough reading of this information can be useful. As an example, we can find the state variable of the Erlang primitive loader online (5) and -(6) in the following example:

      (1)  3cac44   Return addr 0x13BF58 (<terminate process normally>)
      -(2)  y(0)     ["/view/siri_r10_dev/clearcase/otp/erts/lib/kernel/ebin",
      -(3)            "/view/siri_r10_dev/clearcase/otp/erts/lib/stdlib/ebin"]
      -(4)  y(1)     <0.1.0>
      -(5)  y(2)     {state,[],none,#Fun<erl_prim_loader.6.7085890>,undefined,#Fun<erl_prim_loader.7.9000327>,
      -(6)            #Fun<erl_prim_loader.8.116480692>,#Port<0.2>,infinity,#Fun<erl_prim_loader.9.10708760>}
      -(7)  y(3)     infinity

      When interpreting the data for a process, it is helpful to know that anonymous +(6) in the following example:

      (1)  3cac44   Return addr 0x13BF58 (<terminate process normally>)
      +(2)  y(0)     ["/view/siri_r10_dev/clearcase/otp/erts/lib/kernel/ebin",
      +(3)            "/view/siri_r10_dev/clearcase/otp/erts/lib/stdlib/ebin"]
      +(4)  y(1)     <0.1.0>
      +(5)  y(2)     {state,[],none,#Fun<erl_prim_loader.6.7085890>,undefined,#Fun<erl_prim_loader.7.9000327>,
      +(6)            #Fun<erl_prim_loader.8.116480692>,#Port<0.2>,infinity,#Fun<erl_prim_loader.9.10708760>}
      +(7)  y(3)     infinity

      When interpreting the data for a process, it is helpful to know that anonymous function objects (funs) are given the following:

      • A name constructed from the name of the function in which they are created
      • A number (starting with 0) indicating the number of that fun within that function

      @@ -477,7 +477,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/delayeddealloc.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/delayeddealloc.html 2025-05-10 20:19:00.597113288 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/delayeddealloc.html 2025-05-10 20:19:00.601113324 +0000 @@ -342,7 +342,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      Missing in old package: /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/dist/search_data-4F4A610F.js Missing in old package: /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/dist/search_data-4F4A610F.js /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/driver.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/driver.html 2025-05-10 20:19:00.645113723 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/driver.html 2025-05-10 20:19:00.661113867 +0000 @@ -180,12 +180,12 @@ terms, so binary_to_term is called in Erlang to convert the result to term form.

      The code is available in pg_sync.c in the sample directory of erts.

      The driver entry contains the functions that will be called by the emulator. In this example, only start, stop, and control are provided:

      /* Driver interface declarations */
      -static ErlDrvData start(ErlDrvPort port, char *command);
      -static void stop(ErlDrvData drv_data);
      -static int control(ErlDrvData drv_data, unsigned int command, char *buf,
      -                   int len, char **rbuf, int rlen);
      +static ErlDrvData start(ErlDrvPort port, char *command);
      +static void stop(ErlDrvData drv_data);
      +static int control(ErlDrvData drv_data, unsigned int command, char *buf,
      +                   int len, char **rbuf, int rlen);
       
      -static ErlDrvEntry pq_driver_entry = {
      +static ErlDrvEntry pq_driver_entry = {
           NULL,                        /* init */
           start,
           stop,
      @@ -202,10 +202,10 @@
           NULL,                        /* flush */
           NULL,                        /* call */
           NULL                         /* event */
      -};

      We have a structure to store state needed by the driver, in this case we only -need to keep the database connection:

      typedef struct our_data_s {
      +};

      We have a structure to store state needed by the driver, in this case we only +need to keep the database connection:

      typedef struct our_data_s {
           PGconn* conn;
      -} our_data_t;

      The control codes that we have defined are as follows:

      /* Keep the following definitions in alignment with the
      +} our_data_t;

      The control codes that we have defined are as follows:

      /* Keep the following definitions in alignment with the
        * defines in erl_pq_sync.erl
        */
       
      @@ -221,130 +221,130 @@
        * the driver entry.
        */
       
      -DRIVER_INIT(pq_drv)
      -{
      +DRIVER_INIT(pq_drv)
      +{
           return &pq_driver_entry;
      -}

      Here some initialization is done, start is called from open_port/2. The data +}

      Here some initialization is done, start is called from open_port/2. The data will be passed to control and stop.

      /* DRIVER INTERFACE */
      -static ErlDrvData start(ErlDrvPort port, char *command)
      -{
      +static ErlDrvData start(ErlDrvPort port, char *command)
      +{
           our_data_t* data;
       
      -    data = (our_data_t*)driver_alloc(sizeof(our_data_t));
      +    data = (our_data_t*)driver_alloc(sizeof(our_data_t));
           data->conn = NULL;
      -    set_port_control_flags(port, PORT_CONTROL_FLAG_BINARY);
      -    return (ErlDrvData)data;
      -}

      We call disconnect to log out from the database. (This should have been done -from Erlang, but just in case.)

      static int do_disconnect(our_data_t* data, ei_x_buff* x);
      -
      -static void stop(ErlDrvData drv_data)
      -{
      -    our_data_t* data = (our_data_t*)drv_data;
      -
      -    do_disconnect(data, NULL);
      -    driver_free(data);
      -}

      We use the binary format only to return data to the emulator; input data is a + set_port_control_flags(port, PORT_CONTROL_FLAG_BINARY); + return (ErlDrvData)data; +}

      We call disconnect to log out from the database. (This should have been done +from Erlang, but just in case.)

      static int do_disconnect(our_data_t* data, ei_x_buff* x);
      +
      +static void stop(ErlDrvData drv_data)
      +{
      +    our_data_t* data = (our_data_t*)drv_data;
      +
      +    do_disconnect(data, NULL);
      +    driver_free(data);
      +}

      We use the binary format only to return data to the emulator; input data is a string parameter for connect and select. The returned data consists of Erlang terms.

      The functions get_s and ei_x_to_new_binary are utilities that are used to make the code shorter. get_s duplicates the string and zero-terminates it, as the postgres client library wants that. ei_x_to_new_binary takes an ei_x_buff buffer, allocates a binary, and copies the data there. This binary is returned in *rbuf. (Notice that this binary is freed by the emulator, not -by us.)

      static char* get_s(const char* buf, int len);
      -static int do_connect(const char *s, our_data_t* data, ei_x_buff* x);
      -static int do_select(const char* s, our_data_t* data, ei_x_buff* x);
      +by us.)

      static char* get_s(const char* buf, int len);
      +static int do_connect(const char *s, our_data_t* data, ei_x_buff* x);
      +static int do_select(const char* s, our_data_t* data, ei_x_buff* x);
       
       /* As we are operating in binary mode, the return value from control
        * is irrelevant, as long as it is not negative.
        */
      -static int control(ErlDrvData drv_data, unsigned int command, char *buf,
      -                   int len, char **rbuf, int rlen)
      -{
      +static int control(ErlDrvData drv_data, unsigned int command, char *buf,
      +                   int len, char **rbuf, int rlen)
      +{
           int r;
           ei_x_buff x;
      -    our_data_t* data = (our_data_t*)drv_data;
      -    char* s = get_s(buf, len);
      -    ei_x_new_with_version(&x);
      -    switch (command) {
      -        case DRV_CONNECT:    r = do_connect(s, data, &x);  break;
      -        case DRV_DISCONNECT: r = do_disconnect(data, &x);  break;
      -        case DRV_SELECT:     r = do_select(s, data, &x);   break;
      +    our_data_t* data = (our_data_t*)drv_data;
      +    char* s = get_s(buf, len);
      +    ei_x_new_with_version(&x);
      +    switch (command) {
      +        case DRV_CONNECT:    r = do_connect(s, data, &x);  break;
      +        case DRV_DISCONNECT: r = do_disconnect(data, &x);  break;
      +        case DRV_SELECT:     r = do_select(s, data, &x);   break;
               default:             r = -1;        break;
      -    }
      -    *rbuf = (char*)ei_x_to_new_binary(&x);
      -    ei_x_free(&x);
      -    driver_free(s);
      +    }
      +    *rbuf = (char*)ei_x_to_new_binary(&x);
      +    ei_x_free(&x);
      +    driver_free(s);
           return r;
      -}

      do_connect is where we log in to the database. If the connection was +}

      do_connect is where we log in to the database. If the connection was successful, we store the connection handle in the driver data, and return 'ok'. Otherwise, we return the error message from postgres and store NULL in -the driver data.

      static int do_connect(const char *s, our_data_t* data, ei_x_buff* x)
      -{
      -    PGconn* conn = PQconnectdb(s);
      -    if (PQstatus(conn) != CONNECTION_OK) {
      -        encode_error(x, conn);
      -        PQfinish(conn);
      +the driver data.

      static int do_connect(const char *s, our_data_t* data, ei_x_buff* x)
      +{
      +    PGconn* conn = PQconnectdb(s);
      +    if (PQstatus(conn) != CONNECTION_OK) {
      +        encode_error(x, conn);
      +        PQfinish(conn);
               conn = NULL;
      -    } else {
      -        encode_ok(x);
      -    }
      +    } else {
      +        encode_ok(x);
      +    }
           data->conn = conn;
           return 0;
      -}

      If we are connected (and if the connection handle is not NULL), we log out +}

      If we are connected (and if the connection handle is not NULL), we log out from the database. We need to check if we should encode an 'ok', as we can get -here from function stop, which does not return data to the emulator:

      static int do_disconnect(our_data_t* data, ei_x_buff* x)
      -{
      -    if (data->conn == NULL)
      +here from function stop, which does not return data to the emulator:

      static int do_disconnect(our_data_t* data, ei_x_buff* x)
      +{
      +    if (data->conn == NULL)
               return 0;
      -    PQfinish(data->conn);
      +    PQfinish(data->conn);
           data->conn = NULL;
      -    if (x != NULL)
      -        encode_ok(x);
      +    if (x != NULL)
      +        encode_ok(x);
           return 0;
      -}

      We execute a query and encode the result. Encoding is done in another C module, -pg_encode.c, which is also provided as sample code.

      static int do_select(const char* s, our_data_t* data, ei_x_buff* x)
      -{
      -   PGresult* res = PQexec(data->conn, s);
      -    encode_result(x, res, data->conn);
      -    PQclear(res);
      +}

      We execute a query and encode the result. Encoding is done in another C module, +pg_encode.c, which is also provided as sample code.

      static int do_select(const char* s, our_data_t* data, ei_x_buff* x)
      +{
      +   PGresult* res = PQexec(data->conn, s);
      +    encode_result(x, res, data->conn);
      +    PQclear(res);
           return 0;
      -}

      Here we check the result from postgres. If it is data, we encode it as lists of +}

      Here we check the result from postgres. If it is data, we encode it as lists of lists with column data. Everything from postgres is C strings, so we use ei_x_encode_string to send the result as strings to Erlang. (The head of the -list contains the column names.)

      void encode_result(ei_x_buff* x, PGresult* res, PGconn* conn)
      -{
      +list contains the column names.)

      void encode_result(ei_x_buff* x, PGresult* res, PGconn* conn)
      +{
           int row, n_rows, col, n_cols;
      -    switch (PQresultStatus(res)) {
      +    switch (PQresultStatus(res)) {
           case PGRES_TUPLES_OK:
      -        n_rows = PQntuples(res);
      -        n_cols = PQnfields(res);
      -        ei_x_encode_tuple_header(x, 2);
      -        encode_ok(x);
      -        ei_x_encode_list_header(x, n_rows+1);
      /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/driver_entry.html differs (HTML document, UTF-8 Unicode text, with very long lines)
      --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/driver_entry.html	2025-05-10 20:19:00.685114086 +0000
      +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/driver_entry.html	2025-05-10 20:19:00.693114158 +0000
      @@ -176,54 +176,54 @@
         
         Data Types
       

      -

      ErlDrvEntry

      typedef struct erl_drv_entry {
      -    int (*init)(void);          /* Called at system startup for statically
      +

      ErlDrvEntry

      typedef struct erl_drv_entry {
      +    int (*init)(void);          /* Called at system startup for statically
                                          linked drivers, and after loading for
                                          dynamically loaded drivers */
       #ifndef ERL_SYS_DRV
      -    ErlDrvData (*start)(ErlDrvPort port, char *command);
      +    ErlDrvData (*start)(ErlDrvPort port, char *command);
                                       /* Called when open_port/2 is invoked,
                                          return value -1 means failure */
       #else
      -    ErlDrvData (*start)(ErlDrvPort port, char *command, SysDriverOpts* opts);
      +    ErlDrvData (*start)(ErlDrvPort port, char *command, SysDriverOpts* opts);
                                       /* Special options, only for system driver */
       #endif
      -    void (*stop)(ErlDrvData drv_data);
      +    void (*stop)(ErlDrvData drv_data);
                                       /* Called when port is closed, and when the
                                          emulator is halted */
      -    void (*output)(ErlDrvData drv_data, char *buf, ErlDrvSizeT len);
      +    void (*output)(ErlDrvData drv_data, char *buf, ErlDrvSizeT len);
                                       /* Called when we have output from Erlang to
                                          the port */
      -    void (*ready_input)(ErlDrvData drv_data, ErlDrvEvent event);
      +    void (*ready_input)(ErlDrvData drv_data, ErlDrvEvent event);
                                       /* Called when we have input from one of
                                          the driver's handles */
      -    void (*ready_output)(ErlDrvData drv_data, ErlDrvEvent event);
      +    void (*ready_output)(ErlDrvData drv_data, ErlDrvEvent event);
                                       /* Called when output is possible to one of
                                          the driver's handles */
           char *driver_name;          /* Name supplied as command in
                                          erlang:open_port/2 */
      -    void (*finish)(void);       /* Called before unloading the driver -
      +    void (*finish)(void);       /* Called before unloading the driver -
                                          dynamic drivers only */
           void *handle;               /* Reserved, used by emulator internally */
      -    ErlDrvSSizeT (*control)(ErlDrvData drv_data, unsigned int command,
      +    ErlDrvSSizeT (*control)(ErlDrvData drv_data, unsigned int command,
                                   char *buf, ErlDrvSizeT len,
      -			    char **rbuf, ErlDrvSizeT rlen);
      +			    char **rbuf, ErlDrvSizeT rlen);
                                       /* "ioctl" for drivers - invoked by
                                          port_control/3 */
      -    void (*timeout)(ErlDrvData drv_data);
      +    void (*timeout)(ErlDrvData drv_data);
                                       /* Handling of time-out in driver */
      -    void (*outputv)(ErlDrvData drv_data, ErlIOVec *ev);
      +    void (*outputv)(ErlDrvData drv_data, ErlIOVec *ev);
                                       /* Called when we have output from Erlang
                                          to the port */
      -    void (*ready_async)(ErlDrvData drv_data, ErlDrvThreadData thread_data);
      -    void (*flush)(ErlDrvData drv_data);
      +    void (*ready_async)(ErlDrvData drv_data, ErlDrvThreadData thread_data);
      +    void (*flush)(ErlDrvData drv_data);
                                       /* Called when the port is about to be
                                          closed, and there is data in the
                                          driver queue that must be flushed
                                          before 'stop' can be called */
      -    ErlDrvSSizeT (*call)(ErlDrvData drv_data, unsigned int command,
      +    ErlDrvSSizeT (*call)(ErlDrvData drv_data, unsigned int command,
                                char *buf, ErlDrvSizeT len,
      -			 char **rbuf, ErlDrvSizeT rlen, unsigned int *flags);
      +			 char **rbuf, ErlDrvSizeT rlen, unsigned int *flags);
                                       /* Works mostly like 'control', a synchronous
                                          call into the driver */
           void* unused_event_callback;
      @@ -232,11 +232,11 @@
           int minor_version;          /* ERL_DRV_EXTENDED_MINOR_VERSION */
           int driver_flags;           /* ERL_DRV_FLAGs */
           void *handle2;              /* Reserved, used by emulator internally */
      -    void (*process_exit)(ErlDrvData drv_data, ErlDrvMonitor *monitor);
      +    void (*process_exit)(ErlDrvData drv_data, ErlDrvMonitor *monitor);
                                       /* Called when a process monitor fires */
      -    void (*stop_select)(ErlDrvEvent event, void* reserved);
      +    void (*stop_select)(ErlDrvEvent event, void* reserved);
                                       /* Called to close an event object */
      - } ErlDrvEntry;
      • int (*init)(void) - Called directly after the driver has been + } ErlDrvEntry;

      • int (*init)(void) - Called directly after the driver has been loaded by erl_ddll:load_driver/2 (actually when the driver is added to the driver list). The driver is to return 0, or, if the driver cannot initialize, -1.

      • ErlDrvData (*start)(ErlDrvPort port, char* command) - Called @@ -421,7 +421,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/epmd_cmd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/epmd_cmd.html 2025-05-10 20:19:00.717114375 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/epmd_cmd.html 2025-05-10 20:19:00.717114375 +0000 @@ -305,7 +305,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_cmd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_cmd.html 2025-05-10 20:19:00.757114739 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_cmd.html 2025-05-10 20:19:00.773114883 +0000 @@ -153,18 +153,18 @@ init process and can be retrieved by calling init:get_plain_arguments/0. Plain arguments can occur before the first flag, or after a -- flag. Also, the -extra flag causes everything that follows to become plain arguments.

      Examples:

      % erl +W w -sname arnie +R 9 -s my_init -extra +bertie
      -(arnie@host)1> init:get_argument(sname).
      -{ok,[["arnie"]]}
      -(arnie@host)2> init:get_plain_arguments().
      -["+bertie"]

      Here +W w and +R 9 are emulator flags. -s my_init is an init flag, +(arnie@host)1> init:get_argument(sname). +{ok,[["arnie"]]} +(arnie@host)2> init:get_plain_arguments(). +["+bertie"]

      Here +W w and +R 9 are emulator flags. -s my_init is an init flag, interpreted by init. -sname arnie is a user flag, stored by init. It is read by Kernel and causes the Erlang runtime system to become distributed. Finally, everything after -extra (that is, +bertie) is considered as plain arguments.

      % erl -myflag 1
      -1> init:get_argument(myflag).
      -{ok,[["1"]]}
      -2> init:get_plain_arguments().
      -[]

      Here the user flag -myflag 1 is passed to and stored by the init process. It +1> init:get_argument(myflag). +{ok,[["1"]]} +2> init:get_plain_arguments(). +[]

      Here the user flag -myflag 1 is passed to and stored by the init process. It is a user-defined flag, presumably used by some user-defined application.

      @@ -702,7 +702,7 @@ The user-defined CPU topology overrides any automatically detected CPU topology. The CPU topology is used when binding schedulers to logical processors. This option must be before -+sbt on the command-line.

      <Id> = integer(); when 0 =< <Id> =< 65535
      ++sbt on the command-line.

      <Id> = integer(); when 0 =< <Id> =< 65535
       <IdRange> = <Id>-<Id>
       <IdOrIdRange> = <Id> | <IdRange>
       <IdList> = <IdOrIdRange>,<IdOrIdRange> | <IdOrIdRange>
      @@ -735,22 +735,22 @@
       NUMA node. If <ProcessorIds> is omitted, its default position is before
       <NodeIds>. That is, the default is processor external NUMA nodes.

      If a list of identifiers is used in an <IdDefs>:

      • <LogicalIds> must be a list of identifiers.
      • At least one other identifier type besides <LogicalIds> must also have a list of identifiers.
      • All lists of identifiers must produce the same number of identifiers.

      A simple example. A single quad core processor can be described as follows:

      % erl +sct L0-3c0-3
      -1> erlang:system_info(cpu_topology).
      -[{processor,[{core,{logical,0}},
      -             {core,{logical,1}},
      -             {core,{logical,2}},
      -             {core,{logical,3}}]}]

      A more complicated example with two quad core processors, each processor in +1> erlang:system_info(cpu_topology). +[{processor,[{core,{logical,0}}, + {core,{logical,1}}, + {core,{logical,2}}, + {core,{logical,3}}]}]

      A more complicated example with two quad core processors, each processor in its own NUMA node. The ordering of logical processors is a bit weird. This to give a better example of identifier lists:

      % erl +sct L0-1,3-2c0-3p0N0:L7,4,6-5c0-3p1N1
      -1> erlang:system_info(cpu_topology).
      -[{node,[{processor,[{core,{logical,0}},
      -                    {core,{logical,1}},
      -                    {core,{logical,3}},
      -                    {core,{logical,2}}]}]},
      - {node,[{processor,[{core,{logical,7}},
      -                    {core,{logical,4}},
      -                    {core,{logical,6}},
      -                    {core,{logical,5}}]}]}]

      As long as real identifiers are correct, it is OK to pass a CPU topology +1> erlang:system_info(cpu_topology). +[{node,[{processor,[{core,{logical,0}}, + {core,{logical,1}}, + {core,{logical,3}}, + {core,{logical,2}}]}]}, + {node,[{processor,[{core,{logical,7}}, + {core,{logical,4}}, + {core,{logical,6}}, + {core,{logical,5}}]}]}]

      As long as real identifiers are correct, it is OK to pass a CPU topology that is not a correct description of the CPU topology. When used with care this can be very useful. This to trick the emulator to bind its schedulers as you want. For example, if you want to run multiple Erlang runtime systems @@ -925,10 +925,10 @@ user's home directory and then filename:basedir(user_config, "erlang").

      If an .erlang file is found, it is assumed to contain valid Erlang expressions. These expressions are evaluated as if they were input to the -shell.

      A typical .erlang file contains a set of search paths, for example:

      io:format("executing user profile in $HOME/.erlang\n",[]).
      -code:add_path("/home/calvin/test/ebin").
      -code:add_path("/home/hobbes/bigappl-1.2/ebin").
      -io:format(".erlang rc finished\n",[]).

    • user_default and shell_default - Functions in the shell that are not +shell.

      A typical .erlang file contains a set of search paths, for example:

      io:format("executing user profile in $HOME/.erlang\n",[]).
      +code:add_path("/home/calvin/test/ebin").
      +code:add_path("/home/hobbes/bigappl-1.2/ebin").
      +io:format(".erlang rc finished\n",[]).
    • user_default and shell_default - Functions in the shell that are not prefixed by a module name are assumed to be functional objects (funs), built-in functions (BIFs), or belong to the module user_default or shell_default.

      To include private shell commands, define them in a module user_default and @@ -990,7 +990,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_dist_protocol.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_dist_protocol.html 2025-05-10 20:19:00.805115173 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_dist_protocol.html 2025-05-10 20:19:00.813115246 +0000 @@ -256,7 +256,7 @@ client ->> EPMD: NAMES_REQ EPMD -->> client: NAMES_RESP
    1
    110

    Table: NAMES_REQ (110)

    The response for a NAMES_REQ is as follows:

    4
    EPMDPortNoNodeInfo*

    Table: NAMES_RESP

    NodeInfo is a string written for each active node. When all NodeInfo has -been written the connection is closed by the EPMD.

    NodeInfo is, as expressed in Erlang:

    io:format("name ~ts at port ~p~n", [NodeName, Port]).

    +been written the connection is closed by the EPMD.

    NodeInfo is, as expressed in Erlang:

    io:format("name ~ts at port ~p~n", [NodeName, Port]).

    @@ -271,9 +271,9 @@ client ->> EPMD: DUMP_REQ EPMD -->> client: DUMP_RESP

    1
    100

    Table: DUMP_REQ

    The response for a DUMP_REQ is as follows:

    4
    EPMDPortNoNodeInfo*

    Table: DUMP_RESP

    NodeInfo is a string written for each node kept in the EPMD. When all -NodeInfo has been written the connection is closed by the EPMD.

    NodeInfo is, as expressed in Erlang:

    io:format("active name     ~ts at port ~p, fd = ~p~n",
    -          [NodeName, Port, Fd]).

    or

    io:format("old/unused name ~ts at port ~p, fd = ~p ~n",
    -          [NodeName, Port, Fd]).

    +NodeInfo has been written the connection is closed by the EPMD.

    NodeInfo is, as expressed in Erlang:

    io:format("active name     ~ts at port ~p, fd = ~p~n",
    +          [NodeName, Port, Fd]).

    or

    io:format("old/unused name ~ts at port ~p, fd = ~p ~n",
    +          [NodeName, Port, Fd]).

    @@ -411,7 +411,7 @@ Semigraphic View

    -
    A (initiator)                                      B (acceptor)
    +
    A (initiator)                                      B (acceptor)
     
     TCP connect ------------------------------------>
                                                        TCP accept
    @@ -421,36 +421,36 @@
     
       <---------------------------------------------- send_status
     recv_status
    -(if status was 'alive'
    +(if status was 'alive'
      send_status - - - - - - - - - - - - - - - - - ->
    -                                                   recv_status)
    +                                                   recv_status)
     
    -                          (ChB)                      ChB = gen_challenge()
    +                          (ChB)                      ChB = gen_challenge()
       <---------------------------------------------- send_challenge
     recv_challenge
     
    -(if old send_name
    +(if old send_name
      send_complement - - - - - - - - - - - - - - - ->
    -                                                   recv_complement)
    +                                                   recv_complement)
     
    -ChA = gen_challenge(),
    -OCA = out_cookie(B),
    -DiA = gen_digest(ChB, OCA)
    -                          (ChA, DiA)
    +ChA = gen_challenge(),
    +OCA = out_cookie(B),
    +DiA = gen_digest(ChB, OCA)
    +                          (ChA, DiA)
     send_challenge_reply --------------------------->
                                                        recv_challenge_reply
    -                                                   ICB = in_cookie(A),
    +                                                   ICB = in_cookie(A),
                                                        check:
    -                                                   DiA == gen_digest (ChB, ICB)?
    +                                                   DiA == gen_digest (ChB, ICB)?
                                                        - if OK:
    -                                                    OCB = out_cookie(A),
    -                                                    DiB = gen_digest (ChA, OCB)
    -                          (DiB)
    +                                                    OCB = out_cookie(A),
    +                                                    DiB = gen_digest (ChA, OCB)
    +                          (DiB)
       <----------------------------------------------- send_challenge_ack
     recv_challenge_ack                                  DONE
    -ICA = in_cookie(B),                                - else:
    +ICA = in_cookie(B),                                - else:
     check:                                              CLOSE
    -DiB == gen_digest(ChA, ICA)?
    +DiB == gen_digest(ChA, ICA)?
     - if OK:
      DONE
     - else:
    @@ -766,7 +766,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_driver.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_driver.html 2025-05-10 20:19:00.861115681 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_driver.html 2025-05-10 20:19:00.885115899 +0000 @@ -333,7 +333,7 @@
    • ErlDrvSizeT - An unsigned integer type to be used as size_t.

    • ErlDrvSSizeT - A signed integer type, the size of -ErlDrvSizeT.

    • ErlDrvSysInfo

      typedef struct ErlDrvSysInfo {
      +ErlDrvSizeT.

    • ErlDrvSysInfo

      typedef struct ErlDrvSysInfo {
          int driver_major_version;
          int driver_minor_version;
          char *erts_version;
      @@ -345,7 +345,7 @@
          int nif_major_version;
          int nif_minor_version;
          int dirty_scheduler_support;
      -} ErlDrvSysInfo;

      The ErlDrvSysInfo structure is used for storage of information about the +} ErlDrvSysInfo;

    The ErlDrvSysInfo structure is used for storage of information about the Erlang runtime system. driver_system_info writes the system information when passed a reference to a ErlDrvSysInfo structure. The fields @@ -401,12 +401,12 @@ aligned for storage of an array of doubles (usually 8-byte aligned).

  • ErlDrvData - A handle to driver-specific data, passed to the driver callbacks. It is a pointer, and is most often type cast to a specific pointer in the driver.

  • SysIOVec - A system I/O vector, as used by writev on Unix and -WSASend on Win32. It is used in ErlIOVec.

  • ErlIOVec

    typedef struct ErlIOVec {
    +WSASend on Win32. It is used in ErlIOVec.

  • ErlIOVec

    typedef struct ErlIOVec {
       int vsize;
       ErlDrvSizeT size;
       SysIOVec* iov;
       ErlDrvBinary** binv;
    -} ErlIOVec;

    The I/O vector used by the emulator and drivers is a list of binaries, with a +} ErlIOVec;

  • The I/O vector used by the emulator and drivers is a list of binaries, with a SysIOVec pointing to the buffers of the binaries. It is used in driver_outputv and the outputv driver callback. Also, the driver queue is an ErlIOVec.

  • ErlDrvMonitor - When a driver creates a monitor for a process, a @@ -485,8 +485,8 @@ add_driver_entry() -

    void add_driver_entry(ErlDrvEntry
    -        *de);

    Adds a driver entry to the list of drivers known by Erlang. The +

    void add_driver_entry(ErlDrvEntry
    +        *de);

    Adds a driver entry to the list of drivers known by Erlang. The init function of parameter de is called.

    Note

    To use this function for adding drivers residing in dynamically loaded code is dangerous. If the driver code for the added driver resides in the same dynamically loaded module (that is, .so file) as a normal dynamically loaded @@ -498,7 +498,7 @@ driver_alloc() -

    void * driver_alloc(ErlDrvSizeT size);

    Allocates a memory block of the size specified in size, and returns it. This +

    void * driver_alloc(ErlDrvSizeT size);

    Allocates a memory block of the size specified in size, and returns it. This fails only on out of memory, in which case NULL is returned. (This is most often a wrapper for malloc).

    Memory allocated must be explicitly freed with a corresponding call to driver_free (unless otherwise stated).

    This function is thread-safe.

    @@ -507,7 +507,7 @@ driver_alloc_binary()

    -
    ErlDrvBinary * driver_alloc_binary(ErlDrvSizeT size);

    Allocates a driver binary with a memory block of at least size bytes, and +

    ErlDrvBinary * driver_alloc_binary(ErlDrvSizeT size);

    Allocates a driver binary with a memory block of at least size bytes, and returns a pointer to it, or NULL on failure (out of memory). When a driver binary has been sent to the emulator, it must not be changed. Every allocated binary is to be freed by a corresponding call to @@ -521,9 +521,9 @@ driver_async() -

    long driver_async(ErlDrvPort port, unsigned
    -        int* key, void (*async_invoke)(void*), void* async_data, void
    -        (*async_free)(void*));

    Performs an asynchronous call. The function async_invoke is invoked in a +

    long driver_async(ErlDrvPort port, unsigned
    +        int* key, void (*async_invoke)(void*), void* async_data, void
    +        (*async_free)(void*));

    Performs an asynchronous call. The function async_invoke is invoked in a thread separate from the emulator thread. This enables the driver to perform time-consuming, blocking operations without blocking the emulator.

    The async thread pool size can be set with command-line argument +A in erl(1). If an async @@ -555,7 +555,7 @@ driver_async_port_key() -

    unsigned int driver_async_port_key(ErlDrvPort port);

    Calculates a key for later use in driver_async. +

    unsigned int driver_async_port_key(ErlDrvPort port);

    Calculates a key for later use in driver_async. The keys are evenly distributed so that a fair mapping between port IDs and async thread IDs is achieved.

    Note

    Before Erlang/OTP R16, the port ID could be used as a key with proper casting, but after the rewrite of the port subsystem, this is no longer the case. With @@ -566,7 +566,7 @@ driver_binary_dec_refc() -

    long driver_binary_dec_refc(ErlDrvBinary *bin);

    Decrements the reference count on bin and returns the reference count reached +

    long driver_binary_dec_refc(ErlDrvBinary *bin);

    Decrements the reference count on bin and returns the reference count reached after the decrement.

    This function is thread-safe.

    Note

    The reference count of driver binary is normally to be decremented by calling driver_free_binary.

    driver_binary_dec_refc does not free the binary if the reference count reaches zero. Only use driver_binary_dec_refc when you are sure not to @@ -576,21 +576,21 @@ driver_binary_get_refc() -

    long driver_binary_get_refc(ErlDrvBinary *bin);

    Returns the current reference count on bin.

    This function is thread-safe.

    +
    long driver_binary_get_refc(ErlDrvBinary *bin);

    Returns the current reference count on bin.

    This function is thread-safe.

    driver_binary_inc_refc()

    -
    long driver_binary_inc_refc(ErlDrvBinary *bin);

    Increments the reference count on bin and returns the reference count reached +

    long driver_binary_inc_refc(ErlDrvBinary *bin);

    Increments the reference count on bin and returns the reference count reached after the increment.

    This function is thread-safe.

    driver_caller()

    -
    ErlDrvTermData driver_caller(ErlDrvPort
    -        port);

    Returns the process ID of the process that made the current call to the driver. +

    ErlDrvTermData driver_caller(ErlDrvPort
    +        port);

    Returns the process ID of the process that made the current call to the driver. The process ID can be used with driver_send_term to send back data to the caller. driver_caller only returns valid data when currently executing in one @@ -603,14 +603,14 @@ driver_cancel_timer() -

    int driver_cancel_timer(ErlDrvPort port);

    Cancels a timer set with driver_set_timer.

    The return value is 0.

    +
    int driver_cancel_timer(ErlDrvPort port);

    Cancels a timer set with driver_set_timer.

    The return value is 0.

    driver_compare_monitors()

    -
    int driver_compare_monitors(const ErlDrvMonitor
    -        *monitor1, const ErlDrvMonitor *monitor2);

    Compares two ErlDrvMonitors. Can also be used to imply some artificial order +

    int driver_compare_monitors(const ErlDrvMonitor
    +        *monitor1, const ErlDrvMonitor *monitor2);

    Compares two ErlDrvMonitors. Can also be used to imply some artificial order on monitors, for whatever reason.

    Returns 0 if monitor1 and monitor2 are equal, < 0 if monitor1 < monitor2, and > 0 if monitor1 > monitor2.

    @@ -618,16 +618,16 @@ driver_connected()

    -
    ErlDrvTermData driver_connected(ErlDrvPort
    -        port);

    Returns the port owner process.

    Notice that this function is not thread-safe.

    +
    ErlDrvTermData driver_connected(ErlDrvPort
    +        port);

    Returns the port owner process.

    Notice that this function is not thread-safe.

    driver_create_port()

    -
    ErlDrvPort driver_create_port(ErlDrvPort port,
    +
    ErlDrvPort driver_create_port(ErlDrvPort port,
             ErlDrvTermData owner_pid, char* name,
    -        ErlDrvData drv_data);

    Creates a new port executing the same driver code as the port creating the new + ErlDrvData drv_data);

    Creates a new port executing the same driver code as the port creating the new port.

    • port - The port handle of the port (driver instance) creating the new port.

    • owner_pid - The process ID of the Erlang process to become owner of the new port. This process will be linked to the new port. You usually want to use @@ -648,15 +648,15 @@ driver_demonitor_process() -

      int driver_demonitor_process(ErlDrvPort port,
      -        const ErlDrvMonitor *monitor);

      Cancels a monitor created earlier.

      Returns 0 if a monitor was removed and > 0 if the monitor no longer exists.

      +
      int driver_demonitor_process(ErlDrvPort port,
      +        const ErlDrvMonitor *monitor);

      Cancels a monitor created earlier.

      Returns 0 if a monitor was removed and > 0 if the monitor no longer exists.

      driver_deq()

      -
      ErlDrvSizeT driver_deq(ErlDrvPort port,
      -        ErlDrvSizeT size);

      Dequeues data by moving the head pointer forward in the driver queue by size +

      ErlDrvSizeT driver_deq(ErlDrvPort port,
      +        ErlDrvSizeT size);

      Dequeues data by moving the head pointer forward in the driver queue by size bytes. The data in the queue is deallocated.

      Returns the number of bytes remaining in the queue on success, otherwise -1.

      This function can be called from any thread if a port data lock associated with the port is locked by the calling thread during the call.

      @@ -665,8 +665,8 @@ driver_enq()

      -
      int driver_enq(ErlDrvPort port, char* buf,
      -        ErlDrvSizeT len);

      Enqueues data in the driver queue. The data in buf is copied (len bytes) and +

      int driver_enq(ErlDrvPort port, char* buf,
      +        ErlDrvSizeT len);

      Enqueues data in the driver queue. The data in buf is copied (len bytes) and placed at the end of the driver queue. The driver queue is normally used in a FIFO way.

      The driver queue is available to queue output from the emulator to the driver (data from the driver to the emulator is queued by the emulator in normal Erlang @@ -681,8 +681,8 @@ driver_enq_bin() -

      int driver_enq_bin(ErlDrvPort port,
      -        ErlDrvBinary *bin, ErlDrvSizeT offset, ErlDrvSizeT len);

      Enqueues a driver binary in the driver queue. The data in bin at offset with +

      int driver_enq_bin(ErlDrvPort port,
      +        ErlDrvBinary *bin, ErlDrvSizeT offset, ErlDrvSizeT len);

      Enqueues a driver binary in the driver queue. The data in bin at offset with length len is placed at the end of the queue. This function is most often /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_ext_dist.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_ext_dist.html 2025-05-10 20:19:00.917116188 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_ext_dist.html 2025-05-10 20:19:00.925116262 +0000 @@ -440,7 +440,7 @@ positive and 1 if it is negative. The digits are stored with the least significant byte stored first. To calculate the integer, the following formula can be used:

      B = 256
      -(d0*B^0 + d1*B^1 + d2*B^2 + ... d(N-1)*B^(n-1))

      +(d0*B^0 + d1*B^1 + d2*B^2 + ... d(N-1)*B^(n-1))

  • @@ -625,7 +625,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_nif.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_nif.html 2025-05-10 20:19:00.993116878 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_nif.html 2025-05-10 20:19:01.025117168 +0000 @@ -155,29 +155,29 @@

    A minimal example of a NIF library can look as follows:

    /* niftest.c */
     #include <erl_nif.h>
     
    -static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
    -{
    -    return enif_make_string(env, "Hello world!", ERL_NIF_LATIN1);
    -}
    -
    -static ErlNifFunc nif_funcs[] =
    -{
    -    {"hello", 0, hello}
    -};
    +static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
    +{
    +    return enif_make_string(env, "Hello world!", ERL_NIF_LATIN1);
    +}
    +
    +static ErlNifFunc nif_funcs[] =
    +{
    +    {"hello", 0, hello}
    +};
     
    -ERL_NIF_INIT(niftest,nif_funcs,NULL,NULL,NULL,NULL)

    The Erlang module can look as follows:

    -module(niftest).
    +ERL_NIF_INIT(niftest,nif_funcs,NULL,NULL,NULL,NULL)

    The Erlang module can look as follows:

    -module(niftest).
     
    --export([init/0, hello/0]).
    +-export([init/0, hello/0]).
     
    --nifs([hello/0]).
    +-nifs([hello/0]).
     
    --on_load(init/0).
    +-on_load(init/0).
     
    -init() ->
    -      erlang:load_nif("./niftest", 0).
    +init() ->
    +      erlang:load_nif("./niftest", 0).
     
    -hello() ->
    -      erlang:nif_error("NIF library not loaded").

    Compile and test can look as follows (on Linux):

    $> gcc -fPIC -shared -o niftest.so niftest.c -I $ERL_ROOT/usr/include/
    +hello() ->
    +      erlang:nif_error("NIF library not loaded").

    Compile and test can look as follows (on Linux):

    $> gcc -fPIC -shared -o niftest.so niftest.c -I $ERL_ROOT/usr/include/
     $> erl
     
     1> c(niftest).
    @@ -223,21 +223,21 @@
     
     ERL_NIF_TERM world_atom;
     
    -static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
    -{
    -    world_atom = enif_make_atom(env, "world");
    +static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
    +{
    +    world_atom = enif_make_atom(env, "world");
         return 0;
    -}
    +}
     
    -static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
    -{
    -    ERL_NIF_TERM hello_string = enif_make_string(env, "Hello", ERL_NIF_LATIN1);
    -    return enif_make_tuple2(env, hello_string, world_atom);
    -}
    +static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
    +{
    +    ERL_NIF_TERM hello_string = enif_make_string(env, "Hello", ERL_NIF_LATIN1);
    +    return enif_make_tuple2(env, hello_string, world_atom);
    +}
     
    -static ErlNifFunc nif_funcs[] = { { "hello", 0, hello } };
    +static ErlNifFunc nif_funcs[] = { { "hello", 0, hello } };
     
    -ERL_NIF_INIT(niftest, nif_funcs, load, NULL, NULL, NULL)
  • Binaries - Terms of type binary are accessed with the help of struct type +ERL_NIF_INIT(niftest, nif_funcs, load, NULL, NULL, NULL)

  • Binaries - Terms of type binary are accessed with the help of struct type ErlNifBinary, which contains a pointer (data) to the raw binary data and the length (size) of the data in bytes. Both data and size are read-only and are only to be written using calls to API @@ -275,19 +275,19 @@ garbage collector or enif_release_resource). Resource types are uniquely identified by a supplied name string and the name of the implementing module.

    The following is a template example of how to create and return a resource object.

    ERL_NIF_TERM term;
    -MyStruct* obj = enif_alloc_resource(my_resource_type, sizeof(MyStruct));
    +MyStruct* obj = enif_alloc_resource(my_resource_type, sizeof(MyStruct));
     
     /* initialize struct ... */
     
    -term = enif_make_resource(env, obj);
    +term = enif_make_resource(env, obj);
     
    -if (keep_a_reference_of_our_own) {
    +if (keep_a_reference_of_our_own) {
         /* store &#href_anchor"w">
    -}
    -else {
    -    enif_release_resource(obj);
    +}
    +else {
    +    enif_release_resource(obj);
         /* resource now only owned by "Erlang" */
    -}
    +}
     return term;

    Notice that once enif_make_resource creates the term to return to Erlang, the code can choose to either keep its own native pointer to the allocated struct and release it later, or release it immediately and rely only on the @@ -339,50 +339,50 @@ libraries can however fail if deprecated features are used.

  • Time Measurement - Support for time measurement in NIF libraries:

  • I/O Queues
    The Erlang nif library contains function for easily working with I/O vectors as used by the unix system call writev. The I/O Queue is not thread safe, so -some other synchronization mechanism has to be used.

    Typical usage when writing to a file descriptor looks like this:

    int writeiovec(ErlNifEnv *env, ERL_NIF_TERM term, ERL_NIF_TERM *tail,
    -               ErlNifIOQueue *q, int fd) {
    +some other synchronization mechanism has to be used.

    Typical usage when writing to a file descriptor looks like this:

    int writeiovec(ErlNifEnv *env, ERL_NIF_TERM term, ERL_NIF_TERM *tail,
    +               ErlNifIOQueue *q, int fd) {
     
         ErlNifIOVec vec, *iovec = &vec;
         SysIOVec *sysiovec;
         int saved_errno;
         int iovcnt, n;
     
    -    if (!enif_inspect_iovec(env, 64, term, tail, &iovec))
    +    if (!enif_inspect_iovec(env, 64, term, tail, &iovec))
             return -2;
     
    -    if (enif_ioq_size(q) > 0) {
    +    if (enif_ioq_size(q) > 0) {
             /* If the I/O queue contains data we enqueue the iovec and
                then peek the data to write out of the queue. */
    -        if (!enif_ioq_enqv(q, iovec, 0))
    +        if (!enif_ioq_enqv(q, iovec, 0))
                 return -3;
     
    -        sysiovec = enif_ioq_peek(q, &iovcnt);
    -    } else {
    +        sysiovec = enif_ioq_peek(q, &iovcnt);
    +    } else {
             /* If the I/O queue is empty we skip the trip through it. */
             iovcnt = iovec->iovcnt;
             sysiovec = iovec->iov;
    -    }
    +    }
     
         /* Attempt to write the data */
    -    n = writev(fd, sysiovec, iovcnt);
    +    n = writev(fd, sysiovec, iovcnt);
         saved_errno = errno;
     
    -    if (enif_ioq_size(q) == 0) {
    +    if (enif_ioq_size(q) == 0) {
             /* If the I/O queue was initially empty we enqueue any
                remaining data into the queue for writing later. */
    -        if (n >= 0 && !enif_ioq_enqv(q, iovec, n))
    +        if (n >= 0 && !enif_ioq_enqv(q, iovec, n))
                 return -3;
    -    } else {
    +    } else {
             /* Dequeue any data that was written from the queue. */
    -        if (n > 0 && !enif_ioq_deq(q, n, NULL))
    +        if (n > 0 && !enif_ioq_deq(q, n, NULL))
                 return -4;
    -    }
    +    }
     
         /* return n, which is either number of bytes written or -1 if
            some error happened */
         errno = saved_errno;
         return n;
    -}
  • Long-running NIFs
    As mentioned in the warning text at the beginning of +}

  • Long-running NIFs
    As mentioned in the warning text at the beginning of this manual page, it is of vital importance that a native function returns relatively fast. It is difficult to give an exact maximum amount of time that a native function is allowed to work, but usually a well-behaving native @@ -512,12 +512,12 @@ with all its terms is valid until you explicitly invalidate it with enif_free_env or enif_send.

  • All contained terms of a list/tuple/map must belong to the same environment as the list/tuple/map itself. Terms can be copied between environments with -enif_make_copy.

  • ErlNifFunc

    typedef struct {
    +enif_make_copy.

  • ErlNifFunc

    typedef struct {
         const char* name;
         unsigned arity;
    -    ERL_NIF_TERM (*fptr)(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
    +    ERL_NIF_TERM (*fptr)(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
         unsigned flags;
    -} ErlNifFunc;

    Describes a NIF by its name, arity, and implementation.

    • fptr - A pointer to the function that implements the NIF.

    • argv - Contains the function arguments passed to the NIF.

    • argc - The array length, that is, the function arity. argv[N-1] thus +} ErlNifFunc;

  • Describes a NIF by its name, arity, and implementation.

    • fptr - A pointer to the function that implements the NIF.

    • argv - Contains the function arguments passed to the NIF.

    • argc - The array length, that is, the function arity. argv[N-1] thus denotes the Nth argument to the NIF. Notice that the argument argc allows for the same C function to implement several Erlang functions with different arity (but probably with the same name).

    • flags - Is 0 for a regular NIF (and so its value can be omitted for @@ -561,25 +561,25 @@ type. It can be copied, moved in memory, forgotten, and so on.

    • ErlNifResourceType - Each instance of ErlNifResourceType represents a class of memory-managed resource objects that can be garbage collected. Each resource type has a unique name and a -destructor function that is called when objects of its type are released.

    • ErlNifResourceTypeInit

      typedef struct {
      +destructor function that is called when objects of its type are released.

    • ErlNifResourceTypeInit

      typedef struct {
           ErlNifResourceDtor* dtor;       // #1 Destructor
           ErlNifResourceStop* stop;       // #2 Select stop
           ErlNifResourceDown* down;       // #3 Monitor down
      /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_prim_loader.html differs (HTML document, UTF-8 Unicode text, with very long lines)
      --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_prim_loader.html	2025-05-10 20:19:01.053117422 +0000
      +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_prim_loader.html	2025-05-10 20:19:01.057117458 +0000
      @@ -412,7 +412,7 @@
       

      Retrieves information about a file.

      Returns {ok, FileInfo} if successful, otherwise error. FileInfo is a record file_info, defined in the Kernel include file file.hrl. Include the following directive in the module from which the -function is called:

      -include_lib("kernel/include/file.hrl").

      For more information about the record see file:read_file_info/2.

      Filename can also be a file in an archive, for example, +function is called:

      -include_lib("kernel/include/file.hrl").

      For more information about the record see file:read_file_info/2.

      Filename can also be a file in an archive, for example, $OTPROOT/lib/mnesia-4.4.7.ez/mnesia-4.4.7/ebin/mnesia. For information about archive files, see code.

      @@ -504,7 +504,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_tracer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_tracer.html 2025-05-10 20:19:01.093117785 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erl_tracer.html 2025-05-10 20:19:01.105117893 +0000 @@ -149,107 +149,107 @@ module, a much more lightweight message tracer is used, which only records who sent messages to who.

      The following is an example session using it on Linux:

      $ gcc -I erts-8.0/include/ -fPIC -shared -o erl_msg_tracer.so erl_msg_tracer.c
       $ erl
      -Erlang/OTP 19 [DEVELOPMENT] [erts-8.0] [source-ed2b56b] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false]
      +Erlang/OTP 19 [DEVELOPMENT] [erts-8.0] [source-ed2b56b] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false]
       
      -Eshell V8.0  (abort with ^G)
      -1> c(erl_msg_tracer), erl_msg_tracer:load().
      +Eshell V8.0  (abort with ^G)
      +1> c(erl_msg_tracer), erl_msg_tracer:load().
       ok
      -2> Tracer = spawn(fun F() -> receive M -> io:format("~p~n",[M]), F() end end).
      +2> Tracer = spawn(fun F() -> receive M -> io:format("~p~n",[M]), F() end end).
       <0.37.0>
      -3> erlang:trace(new, true, [send,{tracer, erl_msg_tracer, Tracer}]).
      +3> erlang:trace(new, true, [send,{tracer, erl_msg_tracer, Tracer}]).
       0
      -{trace,<0.39.0>,<0.27.0>}
      -4> {ok, D} = file:open("/tmp/tmp.data",[write]).
      -{trace,#Port<0.486>,<0.40.0>}
      -{trace,<0.40.0>,<0.21.0>}
      -{trace,#Port<0.487>,<0.4.0>}
      -{trace,#Port<0.488>,<0.4.0>}
      -{trace,#Port<0.489>,<0.4.0>}
      -{trace,#Port<0.490>,<0.4.0>}
      -{ok,<0.40.0>}
      -{trace,<0.41.0>,<0.27.0>}
      -5>

      erl_msg_tracer.erl:

      -module(erl_msg_tracer).
      +{trace,<0.39.0>,<0.27.0>}
      +4> {ok, D} = file:open("/tmp/tmp.data",[write]).
      +{trace,#Port<0.486>,<0.40.0>}
      +{trace,<0.40.0>,<0.21.0>}
      +{trace,#Port<0.487>,<0.4.0>}
      +{trace,#Port<0.488>,<0.4.0>}
      +{trace,#Port<0.489>,<0.4.0>}
      +{trace,#Port<0.490>,<0.4.0>}
      +{ok,<0.40.0>}
      +{trace,<0.41.0>,<0.27.0>}
      +5>

      erl_msg_tracer.erl:

      -module(erl_msg_tracer).
       
      --export([enabled/3, trace/5, load/0]).
      +-export([enabled/3, trace/5, load/0]).
       
      -load() ->
      -    erlang:load_nif("erl_msg_tracer", []).
      +load() ->
      +    erlang:load_nif("erl_msg_tracer", []).
       
      -enabled(_, _, _) ->
      +enabled(_, _, _) ->
           error.
       
      -trace(_, _, _, _, _) ->
      +trace(_, _, _, _, _) ->
           error.

      erl_msg_tracer.c:

      #include <erl_nif.h>
       
       /* NIF interface declarations */
      -static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info);
      -static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info);
      -static void unload(ErlNifEnv* env, void* priv_data);
      +static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info);
      +static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info);
      +static void unload(ErlNifEnv* env, void* priv_data);
       
       /* The NIFs: */
      -static ERL_NIF_TERM enabled(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
      -static ERL_NIF_TERM trace(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
      +static ERL_NIF_TERM enabled(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
      +static ERL_NIF_TERM trace(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
       
      -static ErlNifFunc nif_funcs[] = {
      -    {"enabled", 3, enabled},
      -    {"trace", 5, trace}
      -};
      +static ErlNifFunc nif_funcs[] = {
      +    {"enabled", 3, enabled},
      +    {"trace", 5, trace}
      +};
       
      -ERL_NIF_INIT(erl_msg_tracer, nif_funcs, load, NULL, upgrade, unload)
      +ERL_NIF_INIT(erl_msg_tracer, nif_funcs, load, NULL, upgrade, unload)
       
      -static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
      -{
      +static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
      +{
           *priv_data = NULL;
           return 0;
      -}
      +}
       
      -static void unload(ErlNifEnv* env, void* priv_data)
      -{
      +static void unload(ErlNifEnv* env, void* priv_data)
      +{
       
      -}
      +}
       
      -static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data,
      -		   ERL_NIF_TERM load_info)
      -{
      -    if (*old_priv_data != NULL || *priv_data != NULL) {
      +static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data,
      +		   ERL_NIF_TERM load_info)
      +{
      +    if (*old_priv_data != NULL || *priv_data != NULL) {
       	return -1; /* Don't know how to do that */
      -    }
      -    if (load(env, priv_data, load_info)) {
      +    }
      +    if (load(env, priv_data, load_info)) {
       	return -1;
      -    }
      +    }
           return 0;
      -}
      +}
       
       /*
        * argv[0]: TraceTag
        * argv[1]: TracerState
        * argv[2]: Tracee
        */
      -static ERL_NIF_TERM enabled(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
      -{
      +static ERL_NIF_TERM enabled(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
      +{
           ErlNifPid to_pid;
      -    if (enif_get_local_pid(env, argv[1], &to_pid))
      -        if (!enif_is_process_alive(env, &to_pid))
      -            if (enif_is_identical(enif_make_atom(env, "trace_status"), argv[0]))
      +    if (enif_get_local_pid(env, argv[1], &to_pid))
      +        if (!enif_is_process_alive(env, &to_pid))
      +            if (enif_is_identical(enif_make_atom(env, "trace_status"), argv[0]))
                       /* tracer is dead so we should remove this tracepoint */
      -                return enif_make_atom(env, "remove");
      +                return enif_make_atom(env, "remove");
                   else
      -                return enif_make_atom(env, "discard");
      +                return enif_make_atom(env, "discard");
       
           /* Only generate trace for when tracer != tracee */
      -    if (enif_is_identical(argv[1], argv[2]))
      -        return enif_make_atom(env, "discard");
      +    if (enif_is_identical(argv[1], argv[2]))
      +        return enif_make_atom(env, "discard");
       
           /* Only trigger trace messages on 'send' */
      -    if (enif_is_identical(enif_make_atom(env, "send"), argv[0]))
      -        return enif_make_atom(env, "trace");
      +    if (enif_is_identical(enif_make_atom(env, "send"), argv[0]))
      +        return enif_make_atom(env, "trace");
       
           /* Have to answer trace_status */
      -    if (enif_is_identical(enif_make_atom(env, "trace_status"), argv[0]))
      -        return enif_make_atom(env, "trace");
      +    if (enif_is_identical(enif_make_atom(env, "trace_status"), argv[0]))
      +        return enif_make_atom(env, "trace");
       
      -    return enif_make_atom(env, "discard");
      -}
      +    return enif_make_atom(env, "discard");
      +}
       
       /*
        * argv[0]: TraceTag, should only be 'send'
      @@ -258,20 +258,20 @@
        * argv[3]: Message
        * argv[4]: Options, map containing Recipient
        */
      -static ERL_NIF_TERM trace(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
      -{
      +static ERL_NIF_TERM trace(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
      +{
           ErlNifPid to_pid;
           ERL_NIF_TERM recipient, msg;
       
      -    if (enif_get_local_pid(env, argv[1], &to_pid)) {
      -      if (enif_get_map_value(env, argv[4], enif_make_atom(env, "extra"), &recipient)) {
      -        msg = enif_make_tuple3(env, enif_make_atom(env, "trace"), argv[2], recipient);
      -        enif_send(env, &to_pid, NULL, msg);
      -      }
      -    }
      +    if (enif_get_local_pid(env, argv[1], &to_pid)) {
      +      if (enif_get_map_value(env, argv[4], enif_make_atom(env, "extra"), &recipient)) {
      +        msg = enif_make_tuple3(env, enif_make_atom(env, "trace"), argv[2], recipient);
      +        enif_send(env, &to_pid, NULL, msg);
      +      }
      +    }
       
      -    return enif_make_atom(env, "ok");
      -}
      +
      return enif_make_atom(env, "ok"); +}
      /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erlang.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erlang.html 2025-05-10 20:19:01.333119960 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erlang.html 2025-05-10 20:19:01.433120866 +0000 @@ -7036,8 +7036,8 @@

      Continues computing the adler32 checksum by combining the previous checksum, -OldAdler, with the checksum of Data.

      The following code:

      X = erlang:adler32(Data1),
      -Y = erlang:adler32(X,Data2).

      assigns the same value to Y as this:

      Y = erlang:adler32([Data1,Data2]).
      +OldAdler, with the checksum of Data.

      The following code:

      X = erlang:adler32(Data1),
      +Y = erlang:adler32(X,Data2).

      assigns the same value to Y as this:

      Y = erlang:adler32([Data1,Data2]).
      @@ -7070,10 +7070,10 @@

      Combines two previously computed adler32 checksums.

      This computation requires the size of the data object for the second checksum -to be known.

      The following code:

      Y = erlang:adler32(Data1),
      -Z = erlang:adler32(Y,Data2).

      assigns the same value to Z as this:

      X = erlang:adler32(Data1),
      -Y = erlang:adler32(Data2),
      -Z = erlang:adler32_combine(X,Y,iolist_size(Data2)).
      +to be known.

      The following code:

      Y = erlang:adler32(Data1),
      +Z = erlang:adler32(Y,Data2).

      assigns the same value to Z as this:

      X = erlang:adler32(Data1),
      +Y = erlang:adler32(Data2),
      +Z = erlang:adler32_combine(X,Y,iolist_size(Data2)).
      @@ -7130,8 +7130,8 @@

      Continues computing the crc32 checksum by combining the previous checksum, -OldCrc, with the checksum of Data.

      The following code:

      X = erlang:crc32(Data1),
      -Y = erlang:crc32(X,Data2).

      assigns the same value to Y as this:

      Y = erlang:crc32([Data1,Data2]).
      +OldCrc, with the checksum of Data.

      The following code:

      X = erlang:crc32(Data1),
      +Y = erlang:crc32(X,Data2).

      assigns the same value to Y as this:

      Y = erlang:crc32([Data1,Data2]).
      @@ -7164,10 +7164,10 @@

      Combines two previously computed crc32 checksums.

      This computation requires the size of the data object for the second checksum -to be known.

      The following code:

      Y = erlang:crc32(Data1),
      -Z = erlang:crc32(Y,Data2).

      assigns the same value to Z as this:

      X = erlang:crc32(Data1),
      -Y = erlang:crc32(Data2),
      -Z = erlang:crc32_combine(X,Y,iolist_size(Data2)).
      +to be known.

      The following code:

      Y = erlang:crc32(Data1),
      +Z = erlang:crc32(Y,Data2).

      assigns the same value to Z as this:

      X = erlang:crc32(Data1),
      +Y = erlang:crc32(Data2),
      +Z = erlang:crc32_combine(X,Y,iolist_size(Data2)).
      @@ -8391,11 +8391,11 @@ in the result returned by nodes/0.

    • hidden - The node is connected to the node of the calling process through a hidden connection. That is, the node name would not appear in the result returned by nodes/0.

    • this - This is the node of the calling process.

    • known - The node is not connected but known to the node of the calling -process.

    Example:

    (a@localhost)1> nodes([this, connected], #{connection_id=>true, node_type=>true}).
    -[{c@localhost,#{connection_id => 13892108,node_type => hidden}},
    - {b@localhost,#{connection_id => 3067553,node_type => visible}},
    - {a@localhost,#{connection_id => undefined,node_type => this}}]
    -(a@localhost)2>
    +process.

    Example:

    (a@localhost)1> nodes([this, connected], #{connection_id=>true, node_type=>true}).
    +[{c@localhost,#{connection_id => 13892108,node_type => hidden}},
    + {b@localhost,#{connection_id => 3067553,node_type => visible}},
    + {a@localhost,#{connection_id => undefined,node_type => this}}]
    +(a@localhost)2>
    @@ -8505,9 +8505,9 @@

    Returns an integer or float that is the arithmetical absolute value of Float -or Int.

    For example:

    > abs(-3.33).
    +or Int.

    For example:

    > abs(-3.33).
     3.33
    -> abs(-3).
    +> abs(-3).
     3
    @@ -8539,8 +8539,8 @@

    Returns a new tuple that has one element more than Tuple1, and contains the elements in Tuple1 followed by Term as the last element.

    Semantically equivalent to list_to_tuple(tuple_to_list(Tuple1) ++ [Term]), but much -faster.

    For example:

    > erlang:append_element({one, two}, three).
    -{one,two,three}
    +faster.

    For example:

    > erlang:append_element({one, two}, three).
    +{one,two,three}
    @@ -8607,7 +8607,7 @@ representation. If Encoding is utf8 or unicode, the characters are encoded using UTF-8 where characters may require multiple bytes.

    Change

    As from Erlang/OTP 20, atoms can contain any Unicode character and atom_to_binary(Atom, latin1) may fail if the text -representation for Atom contains a Unicode character > 255.

    Example:

    > atom_to_binary('Erlang', latin1).
    +representation for Atom contains a Unicode character > 255.

    Example:

    > atom_to_binary('Erlang', latin1).
     <<"Erlang">>
    @@ -8639,9 +8639,9 @@

    Returns a list of unicode code points corresponding to the text representation -of Atom.

    For example:

    > atom_to_list('Erlang').
    -"Erlang"
    > atom_to_list('你好').
    -[20320,22909]

    See unicode for how to convert the resulting list to different formats.

    +of Atom.

    For example:

    > atom_to_list('Erlang').
    +"Erlang"
    > atom_to_list('你好').
    +[20320,22909]

    See unicode for how to convert the resulting list to different formats.

    @@ -8679,9 +8679,9 @@

    Extracts the part of the binary described by PosLen.

    Negative length can be used to extract bytes at the end of a binary.

    For example:

    1> Bin = <<1,2,3,4,5,6,7,8,9,10>>.
    -2> binary_part(Bin,{byte_size(Bin), -5}).
    +2> binary_part(Bin,{byte_size(Bin), -5}).
     <<6,7,8,9,10>>

    Failure: badarg if PosLen in any way references outside the binary.

    Start is zero-based, that is:

    1> Bin = <<1,2,3>>
    -2> binary_part(Bin,{0,2}).
    +2> binary_part(Bin,{0,2}).
     <<1,2>>

    For details about the PosLen semantics, see binary.

    @@ -8789,8 +8789,8 @@ garbage collected. Therefore, it is recommended to consider whether binary_to_existing_atom/2 is a better option than binary_to_atom/2. The default limits can be found -in Efficiency Guide (section System Limits).

    Examples:

    > binary_to_atom(<<"Erlang">>, latin1).
    -'Erlang'
    > binary_to_atom(<<1024/utf8>>, utf8).
    +in Efficiency Guide (section System Limits).

    Examples:

    > binary_to_atom(<<"Erlang">>, latin1).
    +'Erlang'
    > binary_to_atom(<<1024/utf8>>, utf8).
     'Ѐ'
    @@ -8903,7 +8903,7 @@ -

    Returns the float whose text representation is Binary.

    For example:

    > binary_to_float(<<"2.2017764e+0">>).
    +

    Returns the float whose text representation is Binary.

    For example:

    > binary_to_float(<<"2.2017764e+0">>).
     2.2017764

    The float string format is the same as the format for Erlang float literals except for that underscores are not permitted.

    Failure: badarg if Binary contains a bad representation of a float.

    @@ -8938,7 +8938,7 @@ -

    Returns an integer whose text representation is Binary.

    For example:

    > binary_to_integer(<<"123">>).
    +

    Returns an integer whose text representation is Binary.

    For example:

    > binary_to_integer(<<"123">>).
     123

    binary_to_integer/1 accepts the same string formats as list_to_integer/1.

    Failure: badarg if Binary contains a bad representation of an integer.

    @@ -8972,7 +8972,7 @@ -

    Returns an integer whose text representation in base Base is Binary.

    For example:

    > binary_to_integer(<<"3FF">>, 16).
    +

    Returns an integer whose text representation in base Base is Binary.

    For example:

    > binary_to_integer(<<"3FF">>, 16).
     1023

    binary_to_integer/2 accepts the same string formats as list_to_integer/2.

    Failure: badarg if Binary contains a bad representation of an integer.

    @@ -9071,9 +9071,9 @@

    Returns an Erlang term that is the result of decoding binary object Binary, which must be encoded according to the -Erlang external term format.

    > Bin = term_to_binary(hello).
    +Erlang external term format.

    > Bin = term_to_binary(hello).
     <<131,100,0,5,104,101,108,108,111>>
    -> hello = binary_to_term(Bin).
    +> hello = binary_to_term(Bin).
     hello

    Warning

    When decoding binaries from untrusted sources, the untrusted source may submit data in a way to create resources, such as atoms and remote references, that cannot be garbage collected and lead to Denial of Service attack. In such @@ -9122,11 +9122,11 @@ (as they are embedded in certain structures, such as process identifiers, refs, and funs), and creation of new external function references. None of those resources are garbage collected, so unchecked creation of them can -exhaust available memory.

    > binary_to_term(<<131,100,0,5,"hello">>, [safe]).
    +exhaust available memory.

    > binary_to_term(<<131,100,0,5,"hello">>, [safe]).
     ** exception error: bad argument
     > hello.
     hello
    -> binary_to_term(<<131,100,0,5,"hello">>, [safe]).
    +> binary_to_term(<<131,100,0,5,"hello">>, [safe]).
     hello

    Warning

    The safe option ensures the data is safely processed by the Erlang runtime but it does not guarantee the data is safe to your application. You must always validate data from untrusted sources. If the binary is stored or @@ -9134,10 +9134,10 @@ cryptographically signing it.

  • used - Changes the return value to {Term, Used} where Used is the number of bytes actually read from Binary.

    > Input = <<131,100,0,5,"hello","world">>.
     <<131,100,0,5,104,101,108,108,111,119,111,114,108,100>>
    -> {Term, Used} = binary_to_term(Input, [used]).
    -{hello, 9}
    -> split_binary(Input, Used).
    -{<<131,100,0,5,104,101,108,108,111>>, <<"world">>}
  • Failure: badarg if safe is specified and unsafe data is decoded.

    See also term_to_binary/1, binary_to_term/1, and list_to_existing_atom/1.

    /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erlc_cmd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erlc_cmd.html 2025-05-10 20:19:01.473121230 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erlc_cmd.html 2025-05-10 20:19:01.477121266 +0000 @@ -299,7 +299,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erlsrv_cmd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erlsrv_cmd.html 2025-05-10 20:19:01.497121447 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erlsrv_cmd.html 2025-05-10 20:19:01.501121484 +0000 @@ -315,28 +315,28 @@ ** A Console control handler that ignores the log off events, ** and lets the default handler take care of other events. */
    -BOOL WINAPI service_aware_handler(DWORD ctrl){ - if(ctrl == CTRL_LOGOFF_EVENT) +BOOL WINAPI service_aware_handler(DWORD ctrl){ + if(ctrl == CTRL_LOGOFF_EVENT) return TRUE; - if(ctrl == CTRL_SHUTDOWN_EVENT) + if(ctrl == CTRL_SHUTDOWN_EVENT) return TRUE; return FALSE; -} +} -void initialize_handler(void){ - char buffer[2]; +void initialize_handler(void){ + char buffer[2]; /* * We assume we are running as a service if this * environment variable is defined. */ - if(GetEnvironmentVariable("ERLSRV_SERVICE_NAME",buffer, - (DWORD) 2)){ + if(GetEnvironmentVariable("ERLSRV_SERVICE_NAME",buffer, + (DWORD) 2)){ /* ** Actually set the control handler */ - SetConsoleCtrlHandler(&service_aware_handler, TRUE); - } -}

    + SetConsoleCtrlHandler(&service_aware_handler, TRUE); + } +}

    @@ -405,7 +405,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erts_alloc.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erts_alloc.html 2025-05-10 20:19:01.525121701 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/erts_alloc.html 2025-05-10 20:19:01.533121774 +0000 @@ -538,7 +538,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/escript_cmd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/escript_cmd.html 2025-05-10 20:19:01.553121955 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/escript_cmd.html 2025-05-10 20:19:01.557121991 +0000 @@ -131,7 +131,7 @@ Synopsis

    -
    script-name [arg1 arg2...]

    +
    script-name [arg1 arg2...]

    @@ -143,24 +143,24 @@ $ cat factorial

    #!/usr/bin/env escript
     %% -*- erlang -*-
     %%! -sname factorial -mnesia debug verbose
    -main([String]) ->
    +main([String]) ->
         try
    -        N = list_to_integer(String),
    -        F = fac(N),
    -        io:format("factorial ~w = ~w\n", [N,F])
    +        N = list_to_integer(String),
    +        F = fac(N),
    +        io:format("factorial ~w = ~w\n", [N,F])
         catch
             _:_ ->
    -            usage()
    +            usage()
         end;
    -main(_) ->
    -    usage().
    +main(_) ->
    +    usage().
     
    -usage() ->
    -    io:format("usage: factorial integer\n"),
    -    halt(1).
    +usage() ->
    +    io:format("usage: factorial integer\n"),
    +    halt(1).
     
    -fac(0) -> 1;
    -fac(N) -> N * fac(N-1).
    $ ./factorial 5
    +fac(0) -> 1;
    +fac(N) -> N * fac(N-1).
    $ ./factorial 5
     factorial 5 = 120
     $ ./factorial
     usage: factorial integer
    @@ -173,7 +173,7 @@
     If the directive is present, it must be located on the second line.

    If a comment selecting the encoding exists, it can be located on the second line.

    Note

    The encoding specified by the above mentioned comment applies to the script itself. The encoding of the I/O-server, however, must be set explicitly as -follows:

    io:setopts([{encoding, latin1}])

    The default encoding of the I/O-server for +follows:

    io:setopts([{encoding, latin1}])

    The default encoding of the I/O-server for standard_io is unicode if its supported. (see section Summary of Options) in @@ -192,7 +192,7 @@ script (the pathname is usually, but not always, absolute).

    If the file contains source code (as in the example above), it is processed by the epp preprocessor. This means that you, for example, can use predefined macros (such as ?MODULE) and include directives like the -include_lib -directive. For example, use

    -include_lib("kernel/include/file.hrl").

    to include the record definitions for the records used by function +directive. For example, use

    -include_lib("kernel/include/file.hrl").

    to include the record definitions for the records used by function file:read_link_info/1. You can also select encoding by including an encoding comment here, but if a valid encoding comment exists on the second line, it takes precedence.

    The script is checked for syntactic and semantic correctness before it is run. @@ -200,7 +200,7 @@ script will still be run. If there are errors, they are printed and the script will not be run and its exit status is 127.

    Both the module declaration and the export declaration of the main/1 function are optional.

    By default, the script will be compiled by the Erlang compiler.

    It is possible to force it to be interpreted by including the following line -somewhere in the script file:

    -mode(interpret).

    Execution of interpreted code is slower than compiled code, and some language +somewhere in the script file:

    -mode(interpret).

    Execution of interpreted code is slower than compiled code, and some language constructs will not work, but there is no requirement for the Erlang compiler application to be available.

    Change

    Before Erlang/OTP 27 the script would be interpreted by default.

    @@ -313,7 +313,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/garbagecollection.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/garbagecollection.html 2025-05-10 20:19:01.581122209 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/garbagecollection.html 2025-05-10 20:19:01.585122245 +0000 @@ -137,25 +137,25 @@ Creating Data

    -

    Terms are created on the heap by evaluating expressions. There are two major types of terms: immediate terms which require no heap space (small integers, atoms, pids, port ids etc) and cons or boxed terms (tuple, big num, binaries etc) that do require heap space. Immediate terms do not need any heap space because they are embedded into the containing structure.

    Let's look at an example that returns a tuple with the newly created data.

    data(Foo) ->
    -   Cons = [42|Foo],
    -   Literal = {text, "hello world!"},
    -   {tag, Cons, Literal}.

    In this example we first create a new cons cell with an integer and a tuple with some text. Then a tuple of size three wrapping the other values with an atom tag is created and returned.

    On the heap tuples require a word size for each of its elements as well as for the header. Cons cells always require two words. Adding these things together, we get seven words for the tuples and 26 words for the cons cells. The string "hello world!" is a list of cons cells and thus requires 24 words. The atom tag and the integer 42 do not require any additional heap memory since it is an immediate. Adding all the terms together, the heap space required in this example should be 33 words.

    Compiling this code to beam assembly (erlc -S) shows exactly what is happening.

    ...
    -{test_heap,6,1}.
    -{put_list,{integer,42},{x,0},{x,1}}.
    -{put_tuple,3,{x,0}}.
    -{put,{atom,tag}}.
    -{put,{x,1}}.
    -{put,{literal,{text,"hello world!"}}}.
    +

    Terms are created on the heap by evaluating expressions. There are two major types of terms: immediate terms which require no heap space (small integers, atoms, pids, port ids etc) and cons or boxed terms (tuple, big num, binaries etc) that do require heap space. Immediate terms do not need any heap space because they are embedded into the containing structure.

    Let's look at an example that returns a tuple with the newly created data.

    data(Foo) ->
    +   Cons = [42|Foo],
    +   Literal = {text, "hello world!"},
    +   {tag, Cons, Literal}.

    In this example we first create a new cons cell with an integer and a tuple with some text. Then a tuple of size three wrapping the other values with an atom tag is created and returned.

    On the heap tuples require a word size for each of its elements as well as for the header. Cons cells always require two words. Adding these things together, we get seven words for the tuples and 26 words for the cons cells. The string "hello world!" is a list of cons cells and thus requires 24 words. The atom tag and the integer 42 do not require any additional heap memory since it is an immediate. Adding all the terms together, the heap space required in this example should be 33 words.

    Compiling this code to beam assembly (erlc -S) shows exactly what is happening.

    ...
    +{test_heap,6,1}.
    +{put_list,{integer,42},{x,0},{x,1}}.
    +{put_tuple,3,{x,0}}.
    +{put,{atom,tag}}.
    +{put,{x,1}}.
    +{put,{literal,{text,"hello world!"}}}.
     return.

    Looking at the assembler code we can see three things: The heap requirement in this function turns out to be only six words, as seen by the {test_heap,6,1} instruction. All the allocations are combined to a single instruction. The bulk of the data {text, "hello world!"} is a literal. Literals, sometimes referred to as constants, are not allocated in the function since they are a part of the module and allocated at load time.

    If there is not enough space available on the heap to satisfy the test_heap instructions request for memory, then a garbage collection is initiated. It may happen immediately in the test_heap instruction, or it can be delayed until a later time depending on what state the process is in. If the garbage collection is delayed, any memory needed will be allocated in heap fragments. Heap fragments are extra memory blocks that are a part of the young heap, but are not allocated in the contiguous area where terms normally reside. See The young heap for more details.

    The collector

    -

    Erlang has a copying semi-space garbage collector. This means that when doing a garbage collection, the terms are copied from one distinct area, called the from space, to a new clean area, called the to space. The collector starts by scanning the root-set (stack, registers, etc).

    Garbage collection: initial values

    It follows all the pointers from the root-set to the heap and copies each term word by word to the to space.

    After the header word has been copied a move marker is destructively placed in it pointing to the term in the to space. Any other term that points to the already moved term will see this move marker and copy the referring pointer instead. For example, if the have the following Erlang code:

    foo(Arg) ->
    -    T = {test, Arg},
    -    {wrapper, T, T, T}.

    Only one copy of T exists on the heap and during the garbage collection only the first time T is encountered will it be copied.

    Garbage collection: root set scan

    After all terms referenced by the root-set have been copied, the collector scans the to space and copies all terms that these terms reference. When scanning, the collector steps through each term on the to space and any term still referencing the from space is copied over to the to space. Some terms contain non-term data (the payload of a on heap binary for instance). When encountered by the collector, these values are simply skipped.

    Garbage collection: heap scan

    Every term object we can reach is copied to the to space and stored on top off the scan stop line, and then the scan stop is moved to the end of the last object.

    Garbage collection: heap scan

    When scan stop marker catches up to the scan start marker, the garbage collection is done. At this point we can deallocate the entire from space and therefore reclaim the entire young heap.

    +

    Erlang has a copying semi-space garbage collector. This means that when doing a garbage collection, the terms are copied from one distinct area, called the from space, to a new clean area, called the to space. The collector starts by scanning the root-set (stack, registers, etc).

    Garbage collection: initial values

    It follows all the pointers from the root-set to the heap and copies each term word by word to the to space.

    After the header word has been copied a move marker is destructively placed in it pointing to the term in the to space. Any other term that points to the already moved term will see this move marker and copy the referring pointer instead. For example, if the have the following Erlang code:

    foo(Arg) ->
    +    T = {test, Arg},
    +    {wrapper, T, T, T}.

    Only one copy of T exists on the heap and during the garbage collection only the first time T is encountered will it be copied.

    Garbage collection: root set scan

    After all terms referenced by the root-set have been copied, the collector scans the to space and copies all terms that these terms reference. When scanning, the collector steps through each term on the to space and any term still referencing the from space is copied over to the to space. Some terms contain non-term data (the payload of a on heap binary for instance). When encountered by the collector, these values are simply skipped.

    Garbage collection: heap scan

    Every term object we can reach is copied to the to space and stored on top off the scan stop line, and then the scan stop is moved to the end of the last object.

    Garbage collection: heap scan

    When scan stop marker catches up to the scan start marker, the garbage collection is done. At this point we can deallocate the entire from space and therefore reclaim the entire young heap.

    @@ -179,11 +179,11 @@ Literals

    -

    When garbage collecting a heap (young or old) all literals are left in place and not copied. To figure out if a term should be copied or not when doing a garbage collection the following pseudo code is used:

    if (erts_is_literal(ptr) || (on_old_heap(ptr) && !fullsweep)) {
    +

    When garbage collecting a heap (young or old) all literals are left in place and not copied. To figure out if a term should be copied or not when doing a garbage collection the following pseudo code is used:

    if (erts_is_literal(ptr) || (on_old_heap(ptr) && !fullsweep)) {
       /* literal or non fullsweep - do not copy */
    -} else {
    -  copy(ptr);
    -}

    The erts_is_literal check works differently on different architectures and operating systems.

    On 64 bit systems that allow mapping of unreserved virtual memory areas (most operating systems except Windows), an area of size 1 GB (by default) is mapped and then all literals are placed within that area. Then all that has to be done to determine if something is a literal or not is two quick pointer checks. This system relies on the fact that a memory page that has not been touched yet does not take any actual space. So even if 1 GB of virtual memory is mapped, only the memory which is actually needed for literals is allocated in ram. The size of the literal area is configurable through the +MIscs erts_alloc option.

    On 32 bit systems, there is not enough virtual memory space to allocate 1 GB for just literals, so instead small 256 KB sized literal regions are created on demand and a card mark bit-array of the entire 32 bit memory space is then used to determine if a term is a literal or not. Since the total memory space is only 32 bits, the card mark bit-array is only 256 words large. On a 64 bit system the same bit-array would have to be 1 tera words large, so this technique is only viable on 32 bit systems. Doing lookups in the array is a little more expensive then just doing the pointer checks that can be done in 64 bit systems, but not extremely so.

    On 64 bit windows, on which erts_alloc cannot do unreserved virtual memory mappings, a special tag within the Erlang term object is used to determine if something is a literal or not. This is very cheap, however, the tag is only available on 64 bit machines, and it is possible to do a great deal of other nice optimizations with this tag in the future (like for instance a more compact list implementation) so it is not used on operating systems where it is not needed.

    This behaviour is different from how it worked prior to Erlang/OTP 19.0. Before 19.0 the literal check was done by checking if the pointer pointed to the young or old heap block. If it did not, then it was considered a literal. This lead to considerable overhead and strange memory usage scenarios, so it was removed in 19.0.

    +} else { + copy(ptr); +}

    The erts_is_literal check works differently on different architectures and operating systems.

    On 64 bit systems that allow mapping of unreserved virtual memory areas (most operating systems except Windows), an area of size 1 GB (by default) is mapped and then all literals are placed within that area. Then all that has to be done to determine if something is a literal or not is two quick pointer checks. This system relies on the fact that a memory page that has not been touched yet does not take any actual space. So even if 1 GB of virtual memory is mapped, only the memory which is actually needed for literals is allocated in ram. The size of the literal area is configurable through the +MIscs erts_alloc option.

    On 32 bit systems, there is not enough virtual memory space to allocate 1 GB for just literals, so instead small 256 KB sized literal regions are created on demand and a card mark bit-array of the entire 32 bit memory space is then used to determine if a term is a literal or not. Since the total memory space is only 32 bits, the card mark bit-array is only 256 words large. On a 64 bit system the same bit-array would have to be 1 tera words large, so this technique is only viable on 32 bit systems. Doing lookups in the array is a little more expensive then just doing the pointer checks that can be done in 64 bit systems, but not extremely so.

    On 64 bit windows, on which erts_alloc cannot do unreserved virtual memory mappings, a special tag within the Erlang term object is used to determine if something is a literal or not. This is very cheap, however, the tag is only available on 64 bit machines, and it is possible to do a great deal of other nice optimizations with this tag in the future (like for instance a more compact list implementation) so it is not used on operating systems where it is not needed.

    This behaviour is different from how it worked prior to Erlang/OTP 19.0. Before 19.0 the literal check was done by checking if the pointer pointed to the young or old heap block. If it did not, then it was considered a literal. This lead to considerable overhead and strange memory usage scenarios, so it was removed in 19.0.

    @@ -266,7 +266,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/inet_cfg.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/inet_cfg.html 2025-05-10 20:19:01.609122463 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/inet_cfg.html 2025-05-10 20:19:01.617122535 +0000 @@ -165,11 +165,11 @@ The user configuration file is always examined last in the configuration process, making it possible for the user to override any default values or previously made settings. Call inet:get_rc() to view the state of the inet -configuration database.

    The valid configuration parameters are as follows:

    • {file, Format, File}.
      -  Format = atom()
      -  File = string()

      Specify a system file that Erlang is to read configuration data from. Format -tells the parser how the file is to be interpreted:

      • resolv (Unix resolv.conf)
      • host_conf_freebsd (FreeBSD host.conf)
      • host_conf_bsdos (BSDOS host.conf)
      • host_conf_linux (Linux host.conf)
      • nsswitch_conf (Unix nsswitch.conf)
      • hosts (Unix hosts)

      File is to specify the filename with full path.

    • {resolv_conf, File}.
      -  File = string()

      Specify a system file that Erlang is to read resolver configuration from for +configuration database.

      The valid configuration parameters are as follows:

      • {file, Format, File}.
        +  Format = atom()
        +  File = string()

        Specify a system file that Erlang is to read configuration data from. Format +tells the parser how the file is to be interpreted:

        • resolv (Unix resolv.conf)
        • host_conf_freebsd (FreeBSD host.conf)
        • host_conf_bsdos (BSDOS host.conf)
        • host_conf_linux (Linux host.conf)
        • nsswitch_conf (Unix nsswitch.conf)
        • hosts (Unix hosts)

        File is to specify the filename with full path.

      • {resolv_conf, File}.
        +  File = string()

        Specify a system file that Erlang is to read resolver configuration from for the internal DNS client inet_res, and monitor for changes, even if it does not exist. The path must be absolute.

        This can override the configuration parameters nameserver and search depending on the contents of the specified file. They can also change any time @@ -177,61 +177,61 @@ in the future. This emulates the old behavior of not configuring the DNS client when the node is started in short name distributed mode.

        If this parameter is not specified, it defaults to /etc/resolv.conf unless environment variable ERL_INET_ETC_DIR is set, which defines the directory -for this file to some maybe other than /etc.

      • {hosts_file, File}.
        -  File = string()

        Specify a system file that Erlang is to read resolver configuration from for +for this file to some maybe other than /etc.

      • {hosts_file, File}.
        +  File = string()

        Specify a system file that Erlang is to read resolver configuration from for the internal hosts file resolver, and monitor for changes, even if it does not exist. The path must be absolute.

        These host entries are searched after all added with {file, hosts, File} above or {host, IP, Aliases} below when lookup option file is used.

        If the file is specified as an empty string "", no file is read or monitored in the future. This emulates the old behavior of not configuring the DNS client when the node is started in short name distributed mode.

        If this parameter is not specified, it defaults to /etc/hosts unless environment variable ERL_INET_ETC_DIR is set, which defines the directory -for this file to some maybe other than /etc.

      • {registry, Type}.
        -  Type = atom()

        Specify a system registry that Erlang is to read configuration data from. -win32 is the only valid option.

      • {host, IP, Aliases}.
        -  IP = tuple()

        Aliases = [string()]

        Add host entry to the hosts table.

      • {domain, Domain}.
        -  Domain = string()

        Set domain name.

      • {nameserver, IP [,Port]}.
        -  IP = tuple()
        -  Port = integer()

        Add address (and port, if other than default) of the primary nameserver to use -for inet_res.

      • {alt_nameserver, IP [,Port]}.
        -  IP = tuple()
        -  Port = integer()

        Add address (and port, if other than default) of the secondary nameserver for -inet_res.

      • {search, Domains}.
        -  Domains = [string()]

        Add search domains for inet_res.

      • {lookup, Methods}.
        -  Methods = [atom()]

        Specify lookup methods and in which order to try them. The valid methods are +for this file to some maybe other than /etc.

      • {registry, Type}.
        +  Type = atom()

        Specify a system registry that Erlang is to read configuration data from. +win32 is the only valid option.

      • {host, IP, Aliases}.
        +  IP = tuple()

        Aliases = [string()]

        Add host entry to the hosts table.

      • {domain, Domain}.
        +  Domain = string()

        Set domain name.

      • {nameserver, IP [,Port]}.
        +  IP = tuple()
        +  Port = integer()

        Add address (and port, if other than default) of the primary nameserver to use +for inet_res.

      • {alt_nameserver, IP [,Port]}.
        +  IP = tuple()
        +  Port = integer()

        Add address (and port, if other than default) of the secondary nameserver for +inet_res.

      • {search, Domains}.
        +  Domains = [string()]

        Add search domains for inet_res.

      • {lookup, Methods}.
        +  Methods = [atom()]

        Specify lookup methods and in which order to try them. The valid methods are as follows:

        • native (use system calls)
        • file (use host data retrieved from system configuration files and/or the user configuration file)
        • dns (use the Erlang DNS client inet_res for nameserver queries)

        The lookup method string tries to parse the hostname as an IPv4 or IPv6 string and return the resulting IP address. It is automatically tried first when native is not in the Methods list. To skip it in this case, the pseudo lookup method nostring can be inserted anywhere in the Methods -list.

      • {cache_size, Size}.
        -  Size = integer()

        Set the resolver cache size for dns lookups. native lookups are not -cached. Defaults to 100 DNS records.

      • {cache_refresh, Time}.
        -  Time = integer()

        Set how often (in milliseconds) the resolver cache for inet_res is -refreshed (that is, expired DNS records are deleted). Defaults to 1 hour.

      • {timeout, Time}.
        -  Time = integer()

        Set the time to wait until retry (in milliseconds) for DNS queries made by -inet_res. Defaults to 2 seconds.

      • {retry, N}.
        -  N = integer()

        Set the number of DNS queries inet_res will try before giving up. Defaults -to 3.

      • {servfail_retry_timeout, Time}.
        -  Time = non_neg_integer()

        After all name servers have been tried, there is a timeout before the name +list.

      • {cache_size, Size}.
        +  Size = integer()

        Set the resolver cache size for dns lookups. native lookups are not +cached. Defaults to 100 DNS records.

      • {cache_refresh, Time}.
        +  Time = integer()

        Set how often (in milliseconds) the resolver cache for inet_res is +refreshed (that is, expired DNS records are deleted). Defaults to 1 hour.

      • {timeout, Time}.
        +  Time = integer()

        Set the time to wait until retry (in milliseconds) for DNS queries made by +inet_res. Defaults to 2 seconds.

      • {retry, N}.
        +  N = integer()

        Set the number of DNS queries inet_res will try before giving up. Defaults +to 3.

      • {servfail_retry_timeout, Time}.
        +  Time = non_neg_integer()

        After all name servers have been tried, there is a timeout before the name servers are tried again. This is to prevent the server from answering the query with what's in the servfail cache, inet_res. Defaults to 1500 milli -seconds .

      • {inet6, Bool}.
        +seconds .

      • {inet6, Bool}.
           Bool = true | false

        Tells the DNS client inet_res to look up IPv6 addresses. Defaults to -false.

      • {usevc, Bool}.
        +false.

      • {usevc, Bool}.
           Bool = true | false

        Tells the DNS client inet_res to use TCP (Virtual Circuit) instead of UDP. -Defaults to false.

      • {edns, Version}.
        +Defaults to false.

      • {edns, Version}.
           Version = false | 0

        Sets the EDNS version that inet_res will use. The only allowed version is -zero. Defaults to false, which means not to use EDNS.

      • {udp_payload_size, Size}.
        -  N = integer()

        Sets the allowed UDP payload size inet_res will advertise in EDNS queries. +zero. Defaults to false, which means not to use EDNS.

      • {udp_payload_size, Size}.
        +  N = integer()

        Sets the allowed UDP payload size inet_res will advertise in EDNS queries. Also sets the limit when the DNS query will be deemed too large for UDP forcing a TCP query instead; this is not entirely correct, as the advertised UDP payload size of the individual nameserver is what is to be used, but this simple strategy will do until a more intelligent (probing, caching) algorithm needs to be implemented. Default to 1280, which stems from the standard -Ethernet MTU size.

      • {udp, Module}.
        -  Module = atom()

        Tell Erlang to use another primitive UDP module than inet_udp.

      • {tcp, Module}.
        -  Module = atom()

        Tell Erlang to use another primitive TCP module than inet_tcp.

      • clear_hosts.

        Clear the hosts table.

      • clear_ns.

        Clear the list of recorded nameservers (primary and secondary).

      • clear_search.

        Clear the list of search domains.

      +Ethernet MTU size.

    • {udp, Module}.
      +  Module = atom()

      Tell Erlang to use another primitive UDP module than inet_udp.

    • {tcp, Module}.
      +  Module = atom()

      Tell Erlang to use another primitive TCP module than inet_tcp.

    • clear_hosts.

      Clear the hosts table.

    • clear_ns.

      Clear the list of recorded nameservers (primary and secondary).

    • clear_search.

      Clear the list of search domains.

    @@ -246,19 +246,19 @@ (in this example named erl_inetrc, stored in directory ./cfg_files) can then look as follows (Unix):

    %% -- ERLANG INET CONFIGURATION FILE --
     %% read the hosts file
    -{file, hosts, "/etc/hosts"}.
    +{file, hosts, "/etc/hosts"}.
     %% add a particular host
    -{host, {134,138,177,105}, ["finwe"]}.
    +{host, {134,138,177,105}, ["finwe"]}.
     %% do not monitor the hosts file
    -{hosts_file, ""}.
    +{hosts_file, ""}.
     %% read and monitor nameserver config from here
    -{resolv_conf, "/usr/local/etc/resolv.conf"}.
    +{resolv_conf, "/usr/local/etc/resolv.conf"}.
     %% enable EDNS
    -{edns,0}.
    +{edns,0}.
     %% disable caching
    -{cache_size, 0}.
    +{cache_size, 0}.
     %% specify lookup method
    -{lookup, [file, dns]}.

    And Erlang can, for example, be started as follows:

    % erl -sname my_node -kernel inetrc '"./cfg_files/erl_inetrc"'
    +{lookup, [file, dns]}.

    And Erlang can, for example, be started as follows:

    % erl -sname my_node -kernel inetrc '"./cfg_files/erl_inetrc"'
    @@ -305,7 +305,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/init.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/init.html 2025-05-10 20:19:01.641122753 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/init.html 2025-05-10 20:19:01.649122825 +0000 @@ -161,8 +161,8 @@ initialization process.

  • -extra - Everything following -extra is considered plain arguments and can be retrieved using get_plain_arguments/0.

    Example:

    % erl -extra +A 1 --
     ...
    -1> init:get_plain_arguments().
    -["+A","1","--"]

    The -extra flag can be passed on the command line, through ERL_*FLAGS or +1> init:get_plain_arguments(). +["+A","1","--"]

  • The -extra flag can be passed on the command line, through ERL_*FLAGS or -args_file. It only effects the remaining command-line flags in the entity in which it is passed. If multiple -extra flags are passed they are concatenated using the same order rules as ERL_*FLAGS or -args_file in @@ -216,13 +216,13 @@

    % erl -- a b -children thomas claire -ages 7 3 -- x y
     ...
     
    -1> init:get_plain_arguments().
    -["a","b","x","y"]
    -2> init:get_argument(children).
    -{ok,[["thomas","claire"]]}
    -3> init:get_argument(ages).
    -{ok, [["7","3"]]}
    -4> init:get_argument(silly).
    +1> init:get_plain_arguments().
    +["a","b","x","y"]
    +2> init:get_argument(children).
    +{ok,[["thomas","claire"]]}
    +3> init:get_argument(ages).
    +{ok, [["7","3"]]}
    +4> init:get_argument(silly).
     error

    @@ -524,12 +524,12 @@

    Returns all values associated with the command-line user flag Flag.

    If Flag is provided several times, each Values is returned in preserved order. Example:

    % erl -a b c -a d
     ...
    -1> init:get_argument(a).
    -{ok,[["b","c"],["d"]]}

    The following flags are defined automatically and can be retrieved using this +1> init:get_argument(a). +{ok,[["b","c"],["d"]]}

    The following flags are defined automatically and can be retrieved using this function:

    Returns error if no value is associated with Flag.

    +{ok,[["/usr/local/otp/releases/otp_beam_solaris8_r10b_patched"]]}
  • progname - The name of the program which started Erlang:

    3> init:get_argument(progname).
    +{ok,[["erl"]]}
  • home - The home directory (on Unix, the value of $HOME):

    4> init:get_argument(home).
    +{ok,[["/home/harry"]]}
  • Returns error if no value is associated with Flag.

    @@ -827,7 +827,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/introduction.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/introduction.html 2025-05-10 20:19:01.665122971 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/introduction.html 2025-05-10 20:19:01.669123007 +0000 @@ -188,7 +188,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/match_spec.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/match_spec.html 2025-05-10 20:19:01.697123261 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/match_spec.html 2025-05-10 20:19:01.705123333 +0000 @@ -371,70 +371,70 @@ Tracing Examples -

    Match an argument list of three, where the first and third arguments are equal:

    [{['$1', '_', '$1'],
    -  [],
    -  []}]

    Match an argument list of three, where the second argument is a number > 3:

    [{['_', '$1', '_'],
    -  [{ '>', '$1', 3}],
    -  []}]

    Match an argument list of three, where the third argument is either a tuple +

    Match an argument list of three, where the first and third arguments are equal:

    [{['$1', '_', '$1'],
    +  [],
    +  []}]

    Match an argument list of three, where the second argument is a number > 3:

    [{['_', '$1', '_'],
    +  [{ '>', '$1', 3}],
    +  []}]

    Match an argument list of three, where the third argument is either a tuple containing argument one and two, or a list beginning with argument one and two -(that is, [a,b,[a,b,c]] or [a,b,{a,b}]):

    [{['$1', '$2', '$3'],
    -  [{'orelse',
    -      {'=:=', '$3', {{'$1','$2'}}},
    -      {'and',
    -        {'=:=', '$1', {hd, '$3'}},
    -        {'=:=', '$2', {hd, {tl, '$3'}}}}}],
    -  []}]

    The above problem can also be solved as follows:

    [{['$1', '$2', {'$1', '$2}], [], []},
    - {['$1', '$2', ['$1', '$2' | '_']], [], []}]

    Match two arguments, where the first is a tuple beginning with a list that in +(that is, [a,b,[a,b,c]] or [a,b,{a,b}]):

    [{['$1', '$2', '$3'],
    +  [{'orelse',
    +      {'=:=', '$3', {{'$1','$2'}}},
    +      {'and',
    +        {'=:=', '$1', {hd, '$3'}},
    +        {'=:=', '$2', {hd, {tl, '$3'}}}}}],
    +  []}]

    The above problem can also be solved as follows:

    [{['$1', '$2', {'$1', '$2}], [], []},
    + {['$1', '$2', ['$1', '$2' | '_']], [], []}]

    Match two arguments, where the first is a tuple beginning with a list that in turn begins with the second argument times two (that is, [{[4,x],y},2] or -[{[8], y, z},4]):

    [{['$1', '$2'],[{'=:=', {'*', 2, '$2'}, {hd, {element, 1, '$1'}}}],
    -  []}]

    Match three arguments. When all three are equal and are numbers, append the +[{[8], y, z},4]):

    [{['$1', '$2'],[{'=:=', {'*', 2, '$2'}, {hd, {element, 1, '$1'}}}],
    +  []}]

    Match three arguments. When all three are equal and are numbers, append the process dump to the trace message, otherwise let the trace message be "as is", -but set the sequential trace token label to 4711:

    [{['$1', '$1', '$1'],
    -  [{is_number, '$1'}],
    -  [{message, {process_dump}}]},
    - {'_', [], [{set_seq_token, label, 4711}]}]

    As can be noted above, the parameter list can be matched against a single +but set the sequential trace token label to 4711:

    [{['$1', '$1', '$1'],
    +  [{is_number, '$1'}],
    +  [{message, {process_dump}}]},
    + {'_', [], [{set_seq_token, label, 4711}]}]

    As can be noted above, the parameter list can be matched against a single MatchVariable or an '_'. To replace the whole parameter list with a single variable is a special case. In all other cases the MatchHead must be a -proper list.

    Generate a trace message only if the trace control word is set to 1:

    [{'_',
    -  [{'==',{get_tcw},{const, 1}}],
    -  []}]

    Generate a trace message only if there is a seq_trace token:

    [{'_',
    -  [{'==',{is_seq_trace},{const, 1}}],
    -  []}]

    Remove the 'silent' trace flag when the first argument is 'verbose', and add -it when it is 'silent':

    [{'$1',
    -  [{'==',{hd, '$1'},verbose}],
    -  [{trace, [silent],[]}]},
    - {'$1',
    -  [{'==',{hd, '$1'},silent}],
    -  [{trace, [],[silent]}]}]

    Add a return_trace message if the function is of arity 3:

    [{'$1',
    -  [{'==',{length, '$1'},3}],
    -  [{return_trace}]},
    - {'_',[],[]}]

    Generate a trace message only if the function is of arity 3 and the first -argument is 'trace':

    [{['trace','$2','$3'],
    -  [],
    -  []},
    - {'_',[],[]}]

    +proper list.

    Generate a trace message only if the trace control word is set to 1:

    [{'_',
    +  [{'==',{get_tcw},{const, 1}}],
    +  []}]

    Generate a trace message only if there is a seq_trace token:

    [{'_',
    +  [{'==',{is_seq_trace},{const, 1}}],
    +  []}]

    Remove the 'silent' trace flag when the first argument is 'verbose', and add +it when it is 'silent':

    [{'$1',
    +  [{'==',{hd, '$1'},verbose}],
    +  [{trace, [silent],[]}]},
    + {'$1',
    +  [{'==',{hd, '$1'},silent}],
    +  [{trace, [],[silent]}]}]

    Add a return_trace message if the function is of arity 3:

    [{'$1',
    +  [{'==',{length, '$1'},3}],
    +  [{return_trace}]},
    + {'_',[],[]}]

    Generate a trace message only if the function is of arity 3 and the first +argument is 'trace':

    [{['trace','$2','$3'],
    +  [],
    +  []},
    + {'_',[],[]}]

    ETS Examples

    Match all objects in an ETS table, where the first element is the atom -'strider' and the tuple arity is 3, and return the whole object:

    [{{strider,'_','_'},
    -  [],
    -  ['$_']}]

    Match all objects in an ETS table with arity > 1 and the first element is -'gandalf', and return element 2:

    [{'$1',
    -  [{'==', gandalf, {element, 1, '$1'}},{'>=',{size, '$1'},2}],
    -  [{element,2,'$1'}]}]

    In this example, if the first element had been the key, it is much more +'strider' and the tuple arity is 3, and return the whole object:

    [{{strider,'_','_'},
    +  [],
    +  ['$_']}]

    Match all objects in an ETS table with arity > 1 and the first element is +'gandalf', and return element 2:

    [{'$1',
    +  [{'==', gandalf, {element, 1, '$1'}},{'>=',{size, '$1'},2}],
    +  [{element,2,'$1'}]}]

    In this example, if the first element had been the key, it is much more efficient to match that key in the MatchHead part than in the MatchConditions part. The search space of the tables is restricted with regards to the MatchHead so that only objects with the matching key are searched.

    Match tuples of three elements, where the second element is either 'merry' or -'pippin', and return the whole objects:

    [{{'_',merry,'_'},
    -  [],
    -  ['$_']},
    - {{'_',pippin,'_'},
    -  [],
    -  ['$_']}]

    Function ets:test_ms/2 can be useful for testing complicated ETS matches.

    +'pippin', and return the whole objects:

    [{{'_',merry,'_'},
    +  [],
    +  ['$_']},
    + {{'_',pippin,'_'},
    +  [],
    +  ['$_']}]

    Function ets:test_ms/2 can be useful for testing complicated ETS matches.

    @@ -481,7 +481,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/notes.html 2025-05-10 20:19:01.873124856 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/notes.html 2025-05-10 20:19:01.953125582 +0000 @@ -228,7 +228,7 @@ Improvements and New Features -
    • Improved documentation of timers.

      Own Id: OTP-19360 Aux Id: ERIERL-1149, PR-9062

    • The label for a process can now be retrieved also using process_info(Pid, label) in addition to proc_lib:get_label/1.

      This new option is useful when one wants to retrieve more than one process info item. For example:

      process_info(Pid, [label,registered_name])

      Own Id: OTP-19373 Aux Id: PR-9108

    +
    • Improved documentation of timers.

      Own Id: OTP-19360 Aux Id: ERIERL-1149, PR-9062

    • The label for a process can now be retrieved also using process_info(Pid, label) in addition to proc_lib:get_label/1.

      This new option is useful when one wants to retrieve more than one process info item. For example:

      process_info(Pid, [label,registered_name])

      Own Id: OTP-19373 Aux Id: PR-9108

    @@ -276,8 +276,8 @@ Fixed Bugs and Malfunctions

    -
    • The erl -man example has been corrected to not consider values set in ERL_ZFLAGS and stop parsing arguments when a -- is encountered.

      Own Id: OTP-19098 Aux Id: PR-8478, GH-8477

    • Compiler warnings for Windows I/O back-end have been silenced.

      Own Id: OTP-19113

    • Bugs related to return_to trace have been fixed. It did not work for more than once trace session and it did sometimes not trigger for exceptions.

      Own Id: OTP-19122

    • Potential deadlocks while writing a crash dump have been eliminated.

      Own Id: OTP-19133 Aux Id: PR-8521, GH-8498

    • When loading a damaged or too old BEAM file, the runtime system could crash.

      Own Id: OTP-19153 Aux Id: PR-8623

    • A scheduler thread could get stuck when deleting a memory allocator carrier when adjacent carriers were deleted and/or inserted simultaneously by other schedulers. This in turn could cause the other schedulers to get stuck as well.

      Own Id: OTP-19154 Aux Id: GH-8613, PR-8627

    • Statistics for number of carriers in a shared pool after calling instrument:allocations or instrument:carriers are now correct. Also, a potential bug in carrier block scanning was eliminated.

      Own Id: OTP-19166 Aux Id: PR-8636

    • A race in the kTLS flavour of SSL distribution has been fixed so that inet_drv.c doesn't read ahead too much data, which could cause the kTLS encryption to be activated too late when some encrypted data had already been read into the inet_drv.c buffer as unencrypted.

      Own Id: OTP-19175 Aux Id: GH-8561, PR-8690

    • Fixed an emulator crash relating to compressed ETS tables.

      Own Id: OTP-19176 Aux Id: PR-8683

    • A function (encode_sockaddr) was called with superfluous argument, on Windows, in the net nif.

      Own Id: OTP-19181

    • Fixed a crash that could happen on reallocation failure.

      Own Id: OTP-19192

    • Man pages are now available for erl, erlc, dialyzer, and all other programs that are included in Erlang/OTP.

      Own Id: OTP-19201 Aux Id: PR-8740

    • A previous correction in the Erlang/OTP 27.0.1 emergency patch had the unfortunate side effect of sometimes causing an unnecessary fullsweep (major) garbage collection instead of a generation (minor) garbage collection. This has been corrected.

      Own Id: OTP-19209 Aux Id: PR-8751, PR-8539

    • Fixed trace matchspec functions trace and enable_trace to use the session tracer when enabling trace flags on untraced processes.

      Own Id: OTP-19211 Aux Id: GH-8657

    • Fixed a typo in the type spec for erlang:garbage_collection_defaults/0.

      Own Id: OTP-19215 Aux Id: PR-8757

    • Corrected socket:ioctl for genaddr (SIOCGENADDR).

      Own Id: OTP-19216

    • The support for Transparent Huge Pages has been disabled on non-amd64 Linux systems.

      Own Id: OTP-19219 Aux Id: PR-8702

    • Fixed a race condition on Windows when upgrading from -noshell to a shell that would cause Erlang to crash with the error:

      {&#href_anchor"p">,
      -  'The I/O operation has been aborted because of either a thread exit or an application request.'}.

      Own Id: OTP-19220 Aux Id: PR-8774, GH-7621

    +
    • The erl -man example has been corrected to not consider values set in ERL_ZFLAGS and stop parsing arguments when a -- is encountered.

      Own Id: OTP-19098 Aux Id: PR-8478, GH-8477

    • Compiler warnings for Windows I/O back-end have been silenced.

      Own Id: OTP-19113

    • Bugs related to return_to trace have been fixed. It did not work for more than once trace session and it did sometimes not trigger for exceptions.

      Own Id: OTP-19122

    • Potential deadlocks while writing a crash dump have been eliminated.

      Own Id: OTP-19133 Aux Id: PR-8521, GH-8498

    • When loading a damaged or too old BEAM file, the runtime system could crash.

      Own Id: OTP-19153 Aux Id: PR-8623

    • A scheduler thread could get stuck when deleting a memory allocator carrier when adjacent carriers were deleted and/or inserted simultaneously by other schedulers. This in turn could cause the other schedulers to get stuck as well.

      Own Id: OTP-19154 Aux Id: GH-8613, PR-8627

    • Statistics for number of carriers in a shared pool after calling instrument:allocations or instrument:carriers are now correct. Also, a potential bug in carrier block scanning was eliminated.

      Own Id: OTP-19166 Aux Id: PR-8636

    • A race in the kTLS flavour of SSL distribution has been fixed so that inet_drv.c doesn't read ahead too much data, which could cause the kTLS encryption to be activated too late when some encrypted data had already been read into the inet_drv.c buffer as unencrypted.

      Own Id: OTP-19175 Aux Id: GH-8561, PR-8690

    • Fixed an emulator crash relating to compressed ETS tables.

      Own Id: OTP-19176 Aux Id: PR-8683

    • A function (encode_sockaddr) was called with superfluous argument, on Windows, in the net nif.

      Own Id: OTP-19181

    • Fixed a crash that could happen on reallocation failure.

      Own Id: OTP-19192

    • Man pages are now available for erl, erlc, dialyzer, and all other programs that are included in Erlang/OTP.

      Own Id: OTP-19201 Aux Id: PR-8740

    • A previous correction in the Erlang/OTP 27.0.1 emergency patch had the unfortunate side effect of sometimes causing an unnecessary fullsweep (major) garbage collection instead of a generation (minor) garbage collection. This has been corrected.

      Own Id: OTP-19209 Aux Id: PR-8751, PR-8539

    • Fixed trace matchspec functions trace and enable_trace to use the session tracer when enabling trace flags on untraced processes.

      Own Id: OTP-19211 Aux Id: GH-8657

    • Fixed a typo in the type spec for erlang:garbage_collection_defaults/0.

      Own Id: OTP-19215 Aux Id: PR-8757

    • Corrected socket:ioctl for genaddr (SIOCGENADDR).

      Own Id: OTP-19216

    • The support for Transparent Huge Pages has been disabled on non-amd64 Linux systems.

      Own Id: OTP-19219 Aux Id: PR-8702

    • Fixed a race condition on Windows when upgrading from -noshell to a shell that would cause Erlang to crash with the error:

      {&#href_anchor"p">,
      +  'The I/O operation has been aborted because of either a thread exit or an application request.'}.

      Own Id: OTP-19220 Aux Id: PR-8774, GH-7621

    @@ -314,17 +314,17 @@ Improvements and New Features

    -
    • Refactored how the JIT handles POSIX signals and how they affect thread stacks, allowing us to use the native stack register for Erlang stacks on more platforms.

      Notably, containers built on 64-bit x86 Alpine Linux images will now perform much better in sequential code. As an example, running dialyzer over the OTP code base finishes about 15% quicker.

      Own Id: OTP-18568 Aux Id: PR-7174

    • The instrument module can now track allocations on a per-process or per-port basis.

      Own Id: OTP-18577 Aux Id: PR-7236

    • The pid field returned from erlang:fun_info/1,2 is now always the pid for the init process of the local node, not the pid for the actual process that created the fun.

      POTENTIAL INCOMPATIBILITY

      Own Id: OTP-18594 Aux Id: PR-7274

    • By default, escripts will now be compiled instead of interpreted. That means that the compiler application must be installed.

      POTENTIAL INCOMPATIBILITY

      Own Id: OTP-18639 Aux Id: PR-7348

    • A binary returned from the socket receive functions is no longer created as a sub binary of an often large receive buffer binary (socket option {otp,rcvbuf}). This avoids space waste, trusting the allocators to implement reallocation efficiently.

      Own Id: OTP-18642 Aux Id: GH-6152, PR-7465

    • The default process limit has been raised to 1048576 processes.

      Own Id: OTP-18699 Aux Id: PR-7388

    • The erlang:system_monitor/2 functionality is now able to monitor long message queues in the system.

      Own Id: OTP-18709 Aux Id: PR-7651

    • The erl command now supports the -S flag, which is similar to the -run flag, except that it will pass all arguments up to end of the command line to the called function. (The -run flag will not pass arguments beginning with a hyphen.) Another difference is that -S will always call a function with one argument, passing an empty list if no arguments were given.

      Own Id: OTP-18744 Aux Id: PR-7470

    • When implementing an alternative carrier for the Erlang distribution, a separate input handler process may now be registered, using erlang:dist_ctrl_input_handler/2, also in the case when the distribution controller is a port.

      Own Id: OTP-18774 Aux Id: PR-7110

    • The call stack trace has now been added to the error reported by erlang:process_flag/2 when max_heap_size limit has been exceeded.

      Own Id: OTP-18779 Aux Id: PR-7592

    • -callback attributes have been added to erl_tracer.

      Own Id: OTP-18794 Aux Id: PR-7703

    • For inet_backend = socket, setting the active socket option alone, to once, true or N has been optimized, as well as the corresponding data delivery.

      Own Id: OTP-18835

    • New functions socket:sendv/* for sending I/O vectors have been added.

      Own Id: OTP-18845

    • Socket options that take string now also accept binaries.

      Own Id: OTP-18849 Aux Id: PR-6510

    • Native coverage support has been implemented in the JIT. It will automatically be used by the cover tool to reduce the execution overhead when running cover-compiled code.

      There are also new APIs to support native coverage without using the cover tool.

      To instrument code for native coverage it must be compiled with the line_coverage option.

      To enable native coverage in the runtime system, start it like so:

      $ erl +JPcover true

      There are also the following new functions for supporting native coverage:

      Own Id: OTP-18856 Aux Id: PR-7856

    • Changed the default value of the command line flag -code_path_choice to strict.

      Note that for application systems using archives, it is necessary to add the code_path_choice relaxed to the command line that invokes erl.

      Own Id: OTP-18894 Aux Id: PR-7243

    • Added module loading to erl -init_debug printouts.

      Own Id: OTP-18929 Aux Id: PR-8004

    • When the runtime system halts, it performs various flush operations before terminating. By default there is no limit on how much time the flush operations are allowed to take. A new halt flush timeout functionality has been introduced which can be used for limiting the amount of time that the flushing operations are allowed to take. For more information see the documentation of the flush_timeout option of the erlang:halt/2 BIF and the documentation of the erl +zhft <Timeout> command line flag.

      Own Id: OTP-18938 Aux Id: PR-8035, GH-7438

    • Optimized code loading by moving certain operations from the code server to the caller.

      Own Id: OTP-18941 Aux Id: PR-7981

    • Updated asmjit to version a465fe71ab3d0e224b2b4bd0fac69ae68ab9239d

      Own Id: OTP-18942

    • The deprecated functions in zlib have been removed. That includes inflateChunk/{1,2}, getBufSize/1, setBufSize/2, the CRC32 functions, and the Adler checksum functions.

      Own Id: OTP-18950

    • The documentation has been migrated to use Markdown and ExDoc.

      Own Id: OTP-18955 Aux Id: PR-8026

    • Safe destructive update of tuples has been implemented in the compiler and runtime system. This allows the VM to update tuples in-place when it is safe to do so, thus improving performance by doing less copying but also by producing less garbage.

      Example:

      -record(rec, {a,b,c}).
      +
      • Refactored how the JIT handles POSIX signals and how they affect thread stacks, allowing us to use the native stack register for Erlang stacks on more platforms.

        Notably, containers built on 64-bit x86 Alpine Linux images will now perform much better in sequential code. As an example, running dialyzer over the OTP code base finishes about 15% quicker.

        Own Id: OTP-18568 Aux Id: PR-7174

      • The instrument module can now track allocations on a per-process or per-port basis.

        Own Id: OTP-18577 Aux Id: PR-7236

      • The pid field returned from erlang:fun_info/1,2 is now always the pid for the init process of the local node, not the pid for the actual process that created the fun.

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-18594 Aux Id: PR-7274

      • By default, escripts will now be compiled instead of interpreted. That means that the compiler application must be installed.

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-18639 Aux Id: PR-7348

      • A binary returned from the socket receive functions is no longer created as a sub binary of an often large receive buffer binary (socket option {otp,rcvbuf}). This avoids space waste, trusting the allocators to implement reallocation efficiently.

        Own Id: OTP-18642 Aux Id: GH-6152, PR-7465

      • The default process limit has been raised to 1048576 processes.

        Own Id: OTP-18699 Aux Id: PR-7388

      • The erlang:system_monitor/2 functionality is now able to monitor long message queues in the system.

        Own Id: OTP-18709 Aux Id: PR-7651

      • The erl command now supports the -S flag, which is similar to the -run flag, except that it will pass all arguments up to end of the command line to the called function. (The -run flag will not pass arguments beginning with a hyphen.) Another difference is that -S will always call a function with one argument, passing an empty list if no arguments were given.

        Own Id: OTP-18744 Aux Id: PR-7470

      • When implementing an alternative carrier for the Erlang distribution, a separate input handler process may now be registered, using erlang:dist_ctrl_input_handler/2, also in the case when the distribution controller is a port.

        Own Id: OTP-18774 Aux Id: PR-7110

      • The call stack trace has now been added to the error reported by erlang:process_flag/2 when max_heap_size limit has been exceeded.

        Own Id: OTP-18779 Aux Id: PR-7592

      • -callback attributes have been added to erl_tracer.

        Own Id: OTP-18794 Aux Id: PR-7703

      • For inet_backend = socket, setting the active socket option alone, to once, true or N has been optimized, as well as the corresponding data delivery.

        Own Id: OTP-18835

      • New functions socket:sendv/* for sending I/O vectors have been added.

        Own Id: OTP-18845

      • Socket options that take string now also accept binaries.

        Own Id: OTP-18849 Aux Id: PR-6510

      • Native coverage support has been implemented in the JIT. It will automatically be used by the cover tool to reduce the execution overhead when running cover-compiled code.

        There are also new APIs to support native coverage without using the cover tool.

        To instrument code for native coverage it must be compiled with the line_coverage option.

        To enable native coverage in the runtime system, start it like so:

        $ erl +JPcover true

        There are also the following new functions for supporting native coverage:

        Own Id: OTP-18856 Aux Id: PR-7856

      • Changed the default value of the command line flag -code_path_choice to strict.

        Note that for application systems using archives, it is necessary to add the code_path_choice relaxed to the command line that invokes erl.

        Own Id: OTP-18894 Aux Id: PR-7243

      • Added module loading to erl -init_debug printouts.

        Own Id: OTP-18929 Aux Id: PR-8004

      • When the runtime system halts, it performs various flush operations before terminating. By default there is no limit on how much time the flush operations are allowed to take. A new halt flush timeout functionality has been introduced which can be used for limiting the amount of time that the flushing operations are allowed to take. For more information see the documentation of the flush_timeout option of the erlang:halt/2 BIF and the documentation of the erl +zhft <Timeout> command line flag.

        Own Id: OTP-18938 Aux Id: PR-8035, GH-7438

      • Optimized code loading by moving certain operations from the code server to the caller.

        Own Id: OTP-18941 Aux Id: PR-7981

      • Updated asmjit to version a465fe71ab3d0e224b2b4bd0fac69ae68ab9239d

        Own Id: OTP-18942

      • The deprecated functions in zlib have been removed. That includes inflateChunk/{1,2}, getBufSize/1, setBufSize/2, the CRC32 functions, and the Adler checksum functions.

        Own Id: OTP-18950

      • The documentation has been migrated to use Markdown and ExDoc.

        Own Id: OTP-18955 Aux Id: PR-8026

      • Safe destructive update of tuples has been implemented in the compiler and runtime system. This allows the VM to update tuples in-place when it is safe to do so, thus improving performance by doing less copying but also by producing less garbage.

        Example:

        -record(rec, {a,b,c}).
         
        -update(#href_anchor"ss">rec{a=needs_update,b=N}=R0) ->
        -    R = R0#rec{a=up_to_date},
        +update(#href_anchor"ss">rec{a=needs_update,b=N}=R0) ->
        +    R = R0#rec{a=up_to_date},
             if
                 N < 0 ->
        -            R#rec{c=negative};
        +            R#rec{c=negative};
                 N == 0 ->
        -            R#rec{c=zero};
        +            R#rec{c=zero};
                 N > 0 ->
        -            R#rec{c=positive}
        +            R#rec{c=positive}
             end.

        The record updates in each of the three clauses of the if can safely be done in-place, because variable R is not used again.

        Own Id: OTP-18972 Aux Id: PR-8090

      • The obsolete and undocumented support for opening a port to an external resource by passing an atom (or a string) as first argument to open_port(), implemented by the vanilla driver, @@ -3270,9 +3270,9 @@ has now been removed.

        * POTENTIAL INCOMPATIBILITY *

        Own Id: OTP-16329 Aux Id: OTP-15621

      • The return value when using the httph and httph_bin option to erlang:decode_packet/3 and inet:setopts/2 has been changed to also include the original header unmodified. See erlang:decode_packet/3. Example:

         >
        -      erlang:decode_packet(httph_bin,<<"HELLO:
        -      hi\r\n\r\n">>,[]).
        -      {ok,{http_header,0,<<"Hello">>,<<"HELLO">>,<<"hi">>},<<"\r\n">>}

        Own Id: OTP-16347 Aux Id: PR-2466

      • Ensure net_kernel:monitor_nodes/1 sends nodedown messages of a failed + erlang:decode_packet(httph_bin,<<"HELLO: + hi\r\n\r\n">>,[]). + {ok,{http_header,0,<<"Hello">>,<<"HELLO">>,<<"hi">>},<<"\r\n">>}

      Own Id: OTP-16347 Aux Id: PR-2466

    • Ensure net_kernel:monitor_nodes/1 sends nodedown messages of a failed connection before nodeup messages of a reestablished connection toward the same node.

      Own Id: OTP-16362

    • Update of sequential tracing to also support other information transfers than message passing.

      Own Id: OTP-16370 Aux Id: OTP-15251, OTP-15232

    • socket: It is now possible to create a socket from an already existing file @@ -10983,12 +10983,12 @@ viewed as two operations performed atomically. Asynchronously send an unlink signal or a demonitor signal, and ignore any future results of the link or monitor.

      NOTE: This change can cause some obscure code to fail which previously did -not. For example, the following code might hang:

                  Mon = erlang:monitor(process, Pid),
      +not. For example, the following code might hang:

                  Mon = erlang:monitor(process, Pid),
                   %% ...
      -            exit(Pid, bang),
      -            erlang:demonitor(Mon),
      +            exit(Pid, bang),
      +            erlang:demonitor(Mon),
                   receive
      -                {'DOWN', Mon , process, Pid, _} -> ok
      +                {'DOWN', Mon , process, Pid, _} -> ok
                   %% We were previously guaranteed to get a down message
                   %% (since we exited the process ourself), so we could
                   %% in this case leave out:
      @@ -11542,7 +11542,7 @@
                 Erlang programming language
       
             

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/persistent_term.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/persistent_term.html 2025-05-10 20:19:01.993125944 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/persistent_term.html 2025-05-10 20:19:01.997125980 +0000 @@ -200,9 +200,9 @@

      The following example shows how lock contention for ETS tables can be minimized by having one ETS table for each scheduler. The table identifiers for the ETS tables are stored as a single persistent term:

          %% There is one ETS table for each scheduler.
      -    Sid = erlang:system_info(scheduler_id),
      -    Tid = element(Sid, persistent_term:get(?MODULE)),
      -    ets:update_counter(Tid, Key, 1).
      +
      Sid = erlang:system_info(scheduler_id), + Tid = element(Sid, persistent_term:get(?MODULE)), + ets:update_counter(Tid, Key, 1).
    @@ -613,7 +613,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/portsignals.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/portsignals.html 2025-05-10 20:19:02.017126162 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/portsignals.html 2025-05-10 20:19:02.021126198 +0000 @@ -403,7 +403,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/processmanagementoptimizations.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/processmanagementoptimizations.html 2025-05-10 20:19:02.041126379 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/processmanagementoptimizations.html 2025-05-10 20:19:02.041126379 +0000 @@ -324,7 +324,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/ptables.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/ptables.html 2025-05-10 20:19:02.061126560 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/ptables.html 2025-05-10 20:19:02.065126596 +0000 @@ -460,7 +460,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/run_erl_cmd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/run_erl_cmd.html 2025-05-10 20:19:02.085126778 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/run_erl_cmd.html 2025-05-10 20:19:02.089126814 +0000 @@ -251,7 +251,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/search.html 2025-05-10 20:19:02.109126996 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/search.html 2025-05-10 20:19:02.109126996 +0000 @@ -122,7 +122,7 @@
    - + /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/start_cmd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/start_cmd.html 2025-05-10 20:19:02.129127177 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/start_cmd.html 2025-05-10 20:19:02.129127177 +0000 @@ -188,7 +188,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/start_erl_cmd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/start_erl_cmd.html 2025-05-10 20:19:02.149127358 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/start_erl_cmd.html 2025-05-10 20:19:02.153127395 +0000 @@ -234,7 +234,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/supercarrier.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/supercarrier.html 2025-05-10 20:19:02.173127576 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/supercarrier.html 2025-05-10 20:19:02.177127611 +0000 @@ -229,12 +229,12 @@ and free entire pages and we don't want to waste an entire page just to hold the block header of the following pages.

    Instead we store the meta information about all the free segments in a dedicated area apart from the sa and sua areas. Every free segment is -represented by a descriptor struct (ErtsFreeSegDesc).

    typedef struct {
    +represented by a descriptor struct (ErtsFreeSegDesc).

    typedef struct {
         RBTNode snode;      /* node in 'stree' */
         RBTNode anode;      /* node in 'atree' */
         char* start;
         char* end;
    -}ErtsFreeSegDesc;

    To find the smallest free segment that will satisfy a carrier allocation +}ErtsFreeSegDesc;

    To find the smallest free segment that will satisfy a carrier allocation (best fit), the free segments are organized in a tree sorted by size (stree). We search in this tree at allocation. If no free segment of sufficient size was found, the area (sa or sua) is instead expanded. @@ -321,7 +321,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/threadprogress.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/threadprogress.html 2025-05-10 20:19:02.197127793 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/threadprogress.html 2025-05-10 20:19:02.197127793 +0000 @@ -426,7 +426,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/time_correction.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/time_correction.html 2025-05-10 20:19:02.225128047 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/time_correction.html 2025-05-10 20:19:02.229128083 +0000 @@ -564,9 +564,9 @@ the event occurs.

    Do

    Determine the order of events by saving a tuple containing monotonic time and a strictly monotonically increasing integer as -follows:

    Time = erlang:monotonic_time(),
    -UMI = erlang:unique_integer([monotonic]),
    -EventTag = {Time, UMI}

    These tuples are strictly monotonically ordered on the current runtime system +follows:

    Time = erlang:monotonic_time(),
    +UMI = erlang:unique_integer([monotonic]),
    +EventTag = {Time, UMI}

    These tuples are strictly monotonically ordered on the current runtime system instance according to creation time. It is important that the monotonic time is in the first element (the most significant element when comparing two-tuples). Using the monotonic time in the tuples, you can calculate time @@ -645,7 +645,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/tracing.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/tracing.html 2025-05-10 20:19:02.253128301 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/tracing.html 2025-05-10 20:19:02.253128301 +0000 @@ -149,23 +149,23 @@ to inspecting the stack we can only say where we're going to return to, which is not quite the same thing.

    As an illustration, when the caller option is enabled all trace messages from bar/1 will say that they were called from foo/0, even though it -went through a bunch of other functions on the way:

    foo() ->
    -    lots(),
    +went through a bunch of other functions on the way:

    foo() ->
    +    lots(),
         ok.
     
    -lots() ->
    -    'of'().
    +lots() ->
    +    'of'().
     
    -'of'() ->
    -    indirections().
    +'of'() ->
    +    indirections().
     
    -indirections() ->
    -    bar(10).
    +indirections() ->
    +    bar(10).
     
    -bar(0) ->
    +bar(0) ->
         done;
    -bar(N) ->
    -    bar(N - 1).

    +bar(N) -> + bar(N - 1).

    @@ -390,7 +390,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/tty.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/tty.html 2025-05-10 20:19:02.277128519 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/tty.html 2025-05-10 20:19:02.277128519 +0000 @@ -195,7 +195,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/werl_cmd.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/werl_cmd.html 2025-05-10 20:19:02.297128700 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/werl_cmd.html 2025-05-10 20:19:02.301128736 +0000 @@ -200,7 +200,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/zlib.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/zlib.html 2025-05-10 20:19:02.333129027 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.7/doc/html/zlib.html 2025-05-10 20:19:02.345129135 +0000 @@ -133,18 +133,18 @@ data. The data format is described by RFC 1950, RFC 1951, and -RFC 1952.

    A typical (compress) usage is as follows:

    Z = zlib:open(),
    -ok = zlib:deflateInit(Z,default),
    +RFC 1952.

    A typical (compress) usage is as follows:

    Z = zlib:open(),
    +ok = zlib:deflateInit(Z,default),
     
    -Compress = fun(end_of_data, _Cont) -> [];
    -              (Data, Cont) ->
    -                 [zlib:deflate(Z, Data)|Cont(Read(),Cont)]
    +Compress = fun(end_of_data, _Cont) -> [];
    +              (Data, Cont) ->
    +                 [zlib:deflate(Z, Data)|Cont(Read(),Cont)]
                end,
    -Compressed = Compress(Read(),Compress),
    -Last = zlib:deflate(Z, [], finish),
    -ok = zlib:deflateEnd(Z),
    -zlib:close(Z),
    -list_to_binary([Compressed|Last])

    In all functions errors, {'EXIT',{Reason,Backtrace}}, can be thrown, where +Compressed = Compress(Read(),Compress), +Last = zlib:deflate(Z, [], finish), +ok = zlib:deflateEnd(Z), +zlib:close(Z), +list_to_binary([Compressed|Last])

    In all functions errors, {'EXIT',{Reason,Backtrace}}, can be thrown, where Reason describes the error.

    Typical Reasons:

    • badarg - Bad argument.

    • not_initialized - The stream hasn't been initialized, eg. if inflateInit/1 wasn't called prior to a call to inflate/2.

    • not_on_controlling_process - The stream was used by a process that doesn't control it. Use set_controlling_process/2 if you need to transfer a @@ -853,11 +853,11 @@ full too often can seriously degrade the compression.

      If Flush is set to finish, pending input is processed, pending output is flushed, and deflate/3 returns. Afterwards the only possible operations on the stream are deflateReset/1 or deflateEnd/1.

      Flush can be set to finish immediately after -deflateInit if all compression is to be done in one step.

      Example:

      zlib:deflateInit(Z),
      -B1 = zlib:deflate(Z,Data),
      -B2 = zlib:deflate(Z,<< >>,finish),
      -zlib:deflateEnd(Z),
      -list_to_binary([B1,B2])
      +deflateInit if all compression is to be done in one step.

      Example:

      zlib:deflateInit(Z),
      +B1 = zlib:deflate(Z,Data),
      +B2 = zlib:deflate(Z,<< >>,finish),
      +zlib:deflateEnd(Z),
      +list_to_binary([B1,B2])
      @@ -1409,20 +1409,20 @@ {'EXIT',{{need_dictionary,Adler},_StackTrace}} exception.

      The dictionary chosen by the compressor can be determined from the Adler value returned or thrown by the call to the inflate function. The compressor and decompressor must use the same dictionary (See deflateSetDictionary/2).

      After setting the dictionary the inflate operation should be retried without new -input.

      Example:

      deprecated_unpack(Z, Compressed, Dict) ->
      -     case catch zlib:inflate(Z, Compressed) of
      -          {'EXIT',{{need_dictionary,_DictID},_}} ->
      -                 ok = zlib:inflateSetDictionary(Z, Dict),
      -                 Uncompressed = zlib:inflate(Z, []);
      +input.

      Example:

      deprecated_unpack(Z, Compressed, Dict) ->
      +     case catch zlib:inflate(Z, Compressed) of
      +          {'EXIT',{{need_dictionary,_DictID},_}} ->
      +                 ok = zlib:inflateSetDictionary(Z, Dict),
      +                 Uncompressed = zlib:inflate(Z, []);
                 Uncompressed ->
                        Uncompressed
            end.
       
      -new_unpack(Z, Compressed, Dict) ->
      -    case zlib:inflate(Z, Compressed, [{exception_on_need_dict, false}]) of
      -        {need_dictionary, _DictId, Output} ->
      -            ok = zlib:inflateSetDictionary(Z, Dict),
      -            [Output | zlib:inflate(Z, [])];
      +new_unpack(Z, Compressed, Dict) ->
      +    case zlib:inflate(Z, Compressed, [{exception_on_need_dict, false}]) of
      +        {need_dictionary, _DictId, Output} ->
      +            ok = zlib:inflateSetDictionary(Z, Dict),
      +            [Output | zlib:inflate(Z, [])];
               Uncompressed ->
                   Uncompressed
           end.
      @@ -1498,18 +1498,18 @@ desired, and the function will return {finished, Output} once all queued data has been decompressed.

      This function can introduce some output latency (reading input without producing any output).

      If a preset dictionary is required for further decompression, this function -returns a need_dictionary tuple. See inflateSetDictionary/2) for details.

      Example:

      walk(Compressed, Handler) ->
      -    Z = zlib:open(),
      -    zlib:inflateInit(Z),
      -    loop(Z, Handler, zlib:safeInflate(Z, Compressed)),
      -    zlib:inflateEnd(Z),
      -    zlib:close(Z).
      -
      -loop(Z, Handler, {continue, Output}) ->
      -    Handler(Output),
      -    loop(Z, Handler, zlib:safeInflate(Z, []));
      -loop(Z, Handler, {finished, Output}) ->
      -    Handler(Output).
      +returns a need_dictionary tuple. See inflateSetDictionary/2) for details.

      Example:

      walk(Compressed, Handler) ->
      +    Z = zlib:open(),
      +    zlib:inflateInit(Z),
      +    loop(Z, Handler, zlib:safeInflate(Z, Compressed)),
      +    zlib:inflateEnd(Z),
      +    zlib:close(Z).
      +
      +loop(Z, Handler, {continue, Output}) ->
      +    Handler(Output),
      +    loop(Z, Handler, zlib:safeInflate(Z, []));
      +loop(Z, Handler, {finished, Output}) ->
      +    Handler(Output).
      @@ -1648,7 +1648,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/404.html 2025-05-10 20:19:02.365129317 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/404.html 2025-05-10 20:19:02.365129317 +0000 @@ -147,7 +147,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/api-reference.html 2025-05-10 20:19:02.385129498 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/api-reference.html 2025-05-10 20:19:02.385129498 +0000 @@ -185,7 +185,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1.epub/OEBPS/asn1_getting_started.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1.epub/OEBPS/asn1_getting_started.xhtml 2025-05-10 20:19:02.409129716 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1.epub/OEBPS/asn1_getting_started.xhtml 2025-05-10 20:19:02.413129752 +0000 @@ -38,37 +38,37 @@ the syntax is correct and that the text represents proper ASN.1 code before generating an abstract syntax tree. The code generator then uses the abstract syntax tree to generate code.

      The generated Erlang files are placed in the current directory or in the -directory specified with option {outdir,Dir}.

      The compiler can be called from the Erlang shell like this:

      1> asn1ct:compile("People", [ber]).
      -ok

      Option verbose can be added to get information about the generated files:

      2> asn1ct:compile("People", [ber,verbose]).
      +directory specified with option {outdir,Dir}.

      The compiler can be called from the Erlang shell like this:

      1> asn1ct:compile("People", [ber]).
      +ok

      Option verbose can be added to get information about the generated files:

      2> asn1ct:compile("People", [ber,verbose]).
       Erlang ASN.1 compiling "People.asn"
      ---{generated,"People.asn1db"}--
      ---{generated,"People.hrl"}--
      ---{generated,"People.erl"}--
      +--{generated,"People.asn1db"}--
      +--{generated,"People.hrl"}--
      +--{generated,"People.erl"}--
       ok

      ASN.1 module People is now accepted and the abstract syntax tree is saved in file People.asn1db. The generated Erlang code is compiled using the Erlang compiler and loaded into the Erlang runtime system. There is now an API for -encode/2 and decode/2 in module People, which is called like this:

      'People':encode(<Type name>, <Value>)

      or:

      'People':decode(<Type name>, <Value>)

      Assume that there is a network application that receives instances of the ASN.1 +encode/2 and decode/2 in module People, which is called like this:

      'People':encode(<Type name>, <Value>)

      or:

      'People':decode(<Type name>, <Value>)

      Assume that there is a network application that receives instances of the ASN.1 defined type Person, modifies, and sends them back again:

      receive
      -   {Port,{data,Bytes}} ->
      -       case 'People':decode('Person',Bytes) of
      -           {ok,P} ->
      -               {ok,Answer} = 'People':encode('Person',mk_answer(P)),
      -               Port ! {self(),{command,Answer}};
      -           {error,Reason} ->
      -               exit({error,Reason})
      +   {Port,{data,Bytes}} ->
      +       case 'People':decode('Person',Bytes) of
      +           {ok,P} ->
      +               {ok,Answer} = 'People':encode('Person',mk_answer(P)),
      +               Port ! {self(),{command,Answer}};
      +           {error,Reason} ->
      +               exit({error,Reason})
              end
           end,

      In this example, a series of bytes is received from an external source and the bytes are then decoded into a valid Erlang term. This was achieved with the call 'People':decode('Person',Bytes), which returned an Erlang value of the ASN.1 type Person. Then an answer was constructed and encoded using 'People':encode('Person',Answer), which takes an instance of a defined ASN.1 -type and transforms it to a binary according to the BER or PER encoding rules.

      The encoder and decoder can also be run from the shell:

      2> Rockstar = {'Person',"Some Name",roving,50}.
      -{'Person',"Some Name",roving,50}
      -3> {ok,Bin} = 'People':encode('Person',Rockstar).
      -{ok,<<243,17,19,9,83,111,109,101,32,78,97,109,101,2,1,2,
      -      2,1,50>>}
      -4> {ok,Person} = 'People':decode('Person',Bin).
      -{ok,{'Person',"Some Name",roving,50}}

      +type and transforms it to a binary according to the BER or PER encoding rules.

      The encoder and decoder can also be run from the shell:

      2> Rockstar = {'Person',"Some Name",roving,50}.
      +{'Person',"Some Name",roving,50}
      +3> {ok,Bin} = 'People':encode('Person',Rockstar).
      +{ok,<<243,17,19,9,83,111,109,101,32,78,97,109,101,2,1,2,
      +      2,1,50>>}
      +4> {ok,Person} = 'People':decode('Person',Bin).
      +{ok,{'Person',"Some Name",roving,50}}

      @@ -139,16 +139,16 @@

      When using the JSON encoding rules, it is possible to call the decode/2 function in the following way with data that has already -been decoded by json:decode/1:

      SomeModule:decode(Type, {json_decoded, Decoded}).

      Example:

      1> asn1ct:compile("People", [jer]).
      +been decoded by json:decode/1:

      SomeModule:decode(Type, {json_decoded, Decoded}).

      Example:

      1> asn1ct:compile("People", [jer]).
       ok
      -2> Rockstar = {'Person',"Vince Eclipse",roving,50}.
      -{'Person',"Vince Eclipse",roving,50}
      -3> {ok,Bin} = 'People':encode('Person', Rockstar).
      -{ok,<<"{\"name\":\"Vince Eclipse\",\"location\":2,\"age\":50}">>}
      -4> 'People':decode('Person', Bin).
      -{ok,{'Person',"Vince Eclipse",roving,50}}
      -5> 'People':decode('Person', {json_decoded,json:decode(Bin)}).
      -{ok,{'Person',"Vince Eclipse",roving,50}}
      +2> Rockstar = {'Person',"Vince Eclipse",roving,50}.
      +{'Person',"Vince Eclipse",roving,50}
      +3> {ok,Bin} = 'People':encode('Person', Rockstar).
      +{ok,<<"{\"name\":\"Vince Eclipse\",\"location\":2,\"age\":50}">>}
      +4> 'People':decode('Person', Bin).
      +{ok,{'Person',"Vince Eclipse",roving,50}}
      +5> 'People':decode('Person', {json_decoded,json:decode(Bin)}).
      +{ok,{'Person',"Vince Eclipse",roving,50}}
       

      @@ -184,16 +184,16 @@ to manually add tags to certain constructs in order for the ASN.1 specification to be valid. Example of an old-style specification:

      Tags DEFINITIONS ::=
       BEGIN
      -  Afters ::= CHOICE { cheese [0] IA5String,
      -                      dessert [1] IA5String }
      +  Afters ::= CHOICE { cheese [0] IA5String,
      +                      dessert [1] IA5String }
       END

      Without the tags (the numbers in square brackets) the ASN.1 compiler refused to compile the file.

      In 1994 the global tagging mode AUTOMATIC TAGS was introduced. By putting AUTOMATIC TAGS in the module header, the ASN.1 compiler automatically adds tags when needed. The following is the same specification in AUTOMATIC TAGS mode:

      Tags DEFINITIONS AUTOMATIC TAGS ::=
       BEGIN
      -  Afters ::= CHOICE { cheese IA5String,
      -                      dessert IA5String }
      +  Afters ::= CHOICE { cheese IA5String,
      +                      dessert IA5String }
       END

      @@ -204,7 +204,7 @@ and how values are assigned in Erlang.

      ASN.1 has both primitive and constructed types:

      Primitive TypesConstructed Types
      BOOLEANSEQUENCE
      INTEGERSET
      REALCHOICE
      NULLSET OF and SEQUENCE OF
      ENUMERATEDANY
      BIT STRINGANY DEFINED BY
      OCTET STRINGEXTERNAL
      Character StringsEMBEDDED PDV
      OBJECT IDENTIFIERCHARACTER STRING
      Object Descriptor
      TIME Types

      Table: Supported ASN.1 Types

      Note

      The values of each ASN.1 type have their own representation in Erlang, as described in the following sections. Users must provide these values for encoding according to the representation, as shown in the following example:

      Operational ::= BOOLEAN --ASN.1 definition

      In Erlang code it can look as follows:

      Val = true,
      -{ok,Bytes} = MyModule:encode('Operational', Val),

      +{ok,Bytes} = MyModule:encode('Operational', Val),

      @@ -221,11 +221,11 @@

      An ASN.1 INTEGER is represented by an integer in Erlang.

      The concept of subtyping can be applied to integers and to other ASN.1 types. The details of subtyping are not explained here; for more information, see X.680. Various syntaxes are allowed when defining a type as an integer:

      T1 ::= INTEGER
      -T2 ::= INTEGER (-2..7)
      -T3 ::= INTEGER (0..MAX)
      -T4 ::= INTEGER (0<..MAX)
      -T5 ::= INTEGER (MIN<..-99)
      -T6 ::= INTEGER {red(0),blue(1),white(2)}

      The Erlang representation of an ASN.1 INTEGER is an integer or an atom if a +T2 ::= INTEGER (-2..7) +T3 ::= INTEGER (0..MAX) +T4 ::= INTEGER (0<..MAX) +T5 ::= INTEGER (MIN<..-99) +T6 ::= INTEGER {red(0),blue(1),white(2)}

      The Erlang representation of an ASN.1 INTEGER is an integer or an atom if a Named Number List (see T6 in the previous list) is specified.

      The following is an example of Erlang code that assigns values for the types in the previous list:

      T1value = 0,
       T2value = 6,
      @@ -274,7 +274,7 @@
       

      The type BIT STRING can be used to model information that is made up of arbitrary length series of bits. It is intended to be used for selection of flags, not for binary files.

      In ASN.1, BIT STRING definitions can look as follows:

      Bits1 ::= BIT STRING
      -Bits2 ::= BIT STRING {foo(0),bar(1),gnu(2),gnome(3),punk(14)}

      The following two notations are available for representation of BIT STRING +Bits2 ::= BIT STRING {foo(0),bar(1),gnu(2),gnome(3),punk(14)}

      The following two notations are available for representation of BIT STRING values in Erlang and as input to the encode functions:

      1. A bitstring. By default, a BIT STRING with no symbolic names is decoded to an Erlang bitstring.
      2. A list of atoms corresponding to atoms in the NamedBitList in the BIT STRING definition. A BIT STRING with symbolic names is always decoded @@ -302,7 +302,7 @@

        OCTET STRING is the simplest of all ASN.1 types. OCTET STRING only moves or transfers, for example, binary files or other unstructured information complying with two rules: the bytes consist of octets and encoding is not required.

        It is possible to have the following ASN.1 type definitions:

        O1 ::= OCTET STRING
        -O2 ::= OCTET STRING (SIZE(28))

        With the following example assignments in Erlang:

        O1Val = <<17,13,19,20,0,0,255,254>>,
        +O2 ::= OCTET STRING (SIZE(28))

        With the following example assignments in Erlang:

        O1Val = <<17,13,19,20,0,0,255,254>>,
         O2Val = <<"must be exactly 28 chars....">>,

        By default, an OCTET STRING is always represented as an Erlang binary. If the specification has been compiled with option legacy_erlang_types, the encode functions accept both lists and binaries, and the decode functions decode an @@ -323,11 +323,11 @@ of view, octets are very similar to character strings and are compiled in the same way.

        When PER is used, there is a significant difference in the encoding scheme for OCTET STRINGs and other strings. The constraints specified for a type -are especially important for PER, because they affect the encoding.

        Examples:

        Digs ::= NumericString (SIZE(1..3))
        -TextFile ::= IA5String (SIZE(0..64000))

        The corresponding Erlang assignments:

        DigsVal1 = "456",
        +are especially important for PER, because they affect the encoding.

        Examples:

        Digs ::= NumericString (SIZE(1..3))
        +TextFile ::= IA5String (SIZE(0..64000))

        The corresponding Erlang assignments:

        DigsVal1 = "456",
         DigsVal2 = "123",
         TextFileVal1 = "abc...xyz...",
        -TextFileVal2 = [88,76,55,44,99,121 .......... a lot of characters here ....]

        The Erlang representation for BMPString and UniversalString is either a list +TextFileVal2 = [88,76,55,44,99,121 .......... a lot of characters here ....]

        The Erlang representation for BMPString and UniversalString is either a list of ASCII values or a list of quadruples. The quadruple representation associates to the Unicode standard representation of characters. The ASCII characters are all represented by quadruples beginning with three zeros like {0,0,0,65} for @@ -336,26 +336,26 @@ in file PrimStrings.asn1:

        PrimStrings DEFINITIONS AUTOMATIC TAGS ::=
         BEGIN
            BMP ::= BMPString
        -END

        Encoding and decoding some strings:

        1> asn1ct:compile('PrimStrings', [ber]).
        +END

        Encoding and decoding some strings:

        1> asn1ct:compile('PrimStrings', [ber]).
         ok
        -2> {ok,Bytes1} = 'PrimStrings':encode('BMP', [{0,0,53,53},{0,0,45,56}]).
        -{ok,<<30,4,53,54,45,56>>}
        -3> 'PrimStrings':decode('BMP', Bytes1).
        -{ok,[{0,0,53,53},{0,0,45,56}]}
        -4> {ok,Bytes2} = 'PrimStrings':encode('BMP', [{0,0,53,53},{0,0,0,65}]).
        -{ok,<<30,4,53,53,0,65>>}
        -5> 'PrimStrings':decode('BMP', Bytes2).
        -{ok,[{0,0,53,53},65]}
        -6> {ok,Bytes3} = 'PrimStrings':encode('BMP', "BMP string").
        -{ok,<<30,20,0,66,0,77,0,80,0,32,0,115,0,116,0,114,0,105,0,110,0,103>>}
        -7> 'PrimStrings':decode('BMP', Bytes3).
        -{ok,"BMP string"}

        Type UTF8String is represented as a UTF-8 encoded binary in Erlang. Such +2> {ok,Bytes1} = 'PrimStrings':encode('BMP', [{0,0,53,53},{0,0,45,56}]). +{ok,<<30,4,53,54,45,56>>} +3> 'PrimStrings':decode('BMP', Bytes1). +{ok,[{0,0,53,53},{0,0,45,56}]} +4> {ok,Bytes2} = 'PrimStrings':encode('BMP', [{0,0,53,53},{0,0,0,65}]). +{ok,<<30,4,53,53,0,65>>} +5> 'PrimStrings':decode('BMP', Bytes2). +{ok,[{0,0,53,53},65]} +6> {ok,Bytes3} = 'PrimStrings':encode('BMP', "BMP string"). +{ok,<<30,20,0,66,0,77,0,80,0,32,0,115,0,116,0,114,0,105,0,110,0,103>>} +7> 'PrimStrings':decode('BMP', Bytes3). +{ok,"BMP string"}

    Type UTF8String is represented as a UTF-8 encoded binary in Erlang. Such binaries can be created directly using the binary syntax or by converting from a list of Unicode code points using function unicode:characters_to_binary/1.

    The following shows examples of how UTF-8 encoded binaries can be created and manipulated:

    1> Gs = "Мой маленький Гном".
    /usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1.epub/OEBPS/asn1_spec.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1.epub/OEBPS/asn1_spec.xhtml	2025-05-10 20:19:02.409129716 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1.epub/OEBPS/asn1_spec.xhtml	2025-05-10 20:19:02.413129752 +0000
    @@ -60,37 +60,37 @@
     exclusive decode is enabled. This function decodes the parts that
     were left undecoded during the exclusive decode.

    Both functions are described in the following.

    If the exclusive decode function has, for example, the name decode_exclusive and an ASN.1 encoded message Bin is to be exclusive decoded, the call is as -follows:

    {ok,ExclMessage} = 'MyModule':decode_exclusive(Bin)

    The result ExclMessage has the same structure as a +follows:

    {ok,ExclMessage} = 'MyModule':decode_exclusive(Bin)

    The result ExclMessage has the same structure as a complete decode would have, except for the parts of the top type that were not decoded. The undecoded parts are on their places in the structure on format {TypeKey,UndecodedValue}.

    Each undecoded part that is to be decoded must be fed into function -decode_part/2 as follows:

    {ok,PartMessage} = 'MyModule':decode_part(TypeKey, UndecodedValue)

    +decode_part/2 as follows:

    {ok,PartMessage} = 'MyModule':decode_part(TypeKey, UndecodedValue)

    Writing an Exclusive Decode Instruction

    -

    This instruction is written in the configuration file in the following format:

    ExclusiveDecodeInstruction = {exclusive_decode,{ModuleName,DecodeInstructions}}.
    +

    This instruction is written in the configuration file in the following format:

    ExclusiveDecodeInstruction = {exclusive_decode,{ModuleName,DecodeInstructions}}.
     
    -ModuleName = atom()
    +ModuleName = atom()
     
    -DecodeInstructions = [DecodeInstruction]+
    +DecodeInstructions = [DecodeInstruction]+
     
    -DecodeInstruction = {ExclusiveDecodeFunctionName,TypeList}
    +DecodeInstruction = {ExclusiveDecodeFunctionName,TypeList}
     
    -ExclusiveDecodeFunctionName = atom()
    +ExclusiveDecodeFunctionName = atom()
     
    -TypeList = [TopType,ElementList]
    +TypeList = [TopType,ElementList]
     
    -ElementList = [Element]+
    +ElementList = [Element]+
     
    -Element = {Name,parts} |
    -          {Name,undecoded} |
    -          {Name,ElementList}
    +Element = {Name,parts} |
    +          {Name,undecoded} |
    +          {Name,ElementList}
     
    -TopType = atom()
    +TopType = atom()
     
    -Name = atom()

    The instruction must be a valid Erlang term terminated by a dot.

    In TypeList the path from the top type to each undecoded subcomponent is +Name = atom()

    The instruction must be a valid Erlang term terminated by a dot.

    In TypeList the path from the top type to each undecoded subcomponent is described. TopType is the name of a top-level type in the ASN.1 specification. The action for each component in ElementList is described by one of:

    • {Name,parts}
    • {Name,undecoded}
    • {Name,ElementList}

    The use and effect of the actions are as follows:

    • {Name,undecoded} - Leaves the element undecoded. The type of Name can be any ASN.1 type. The value of element Name is returned as a tuple (as @@ -156,78 +156,78 @@ ['Button',[{number,undecoded}]]}]}}.

    The following figure shows the bytes of a Window:status message. The components buttonList and actions are excluded from decode. Only state and enabled are decoded when decode__Window_exclusive is called.

    Bytes of a Window:status Message

    Here follows an example of how the module. Note that option no_ok_wrapper is -used to make the example more concise.

    1> asn1ct:compile('GUI', [ber,asn1config,no_ok_wrapper]).
    +used to make the example more concise.

    1> asn1ct:compile('GUI', [ber,asn1config,no_ok_wrapper]).
     ok
    -2> rr('GUI').
    -['Action','Button','Status']
    -3> ButtonMsg = #'Button'{number=123,on=true}.
    -#'Button'{number = 123,on = true}
    -4> ButtonBytes = 'GUI':encode('Button', ButtonMsg).
    +2> rr('GUI').
    +['Action','Button','Status']
    +3> ButtonMsg = #'Button'{number=123,on=true}.
    +#'Button'{number = 123,on = true}
    +4> ButtonBytes = 'GUI':encode('Button', ButtonMsg).
     <<48,6,128,1,123,129,1,255>>
    -5> ExclusiveMsgButton = 'GUI':decode_Button_exclusive(ButtonBytes).
    -#'Button'{number = {'Button_number',<<128,1,123>>},
    -          on = true}
    -6> {UndecKey,UndecBytes} = ExclusiveMsgButton#'Button'.number.
    -{'Button_number',<<128,1,123>>}
    -7> 'GUI':decode_part(UndecKey, UndecBytes).
    +5> ExclusiveMsgButton = 'GUI':decode_Button_exclusive(ButtonBytes).
    +#'Button'{number = {'Button_number',<<128,1,123>>},
    +          on = true}
    +6> {UndecKey,UndecBytes} = ExclusiveMsgButton#'Button'.number.
    +{'Button_number',<<128,1,123>>}
    +7> 'GUI':decode_part(UndecKey, UndecBytes).
     123
     8> WindowMsg =
    -{status,{'Status',35,
    -   [{'Button',3,true},
    -    {'Button',4,false},
    -    {'Button',5,true},
    -    {'Button',6,true},
    -    {'Button',7,false}],
    +{status,{'Status',35,
    +   [{'Button',3,true},
    +    {'Button',4,false},
    +    {'Button',5,true},
    +    {'Button',6,true},
    +    {'Button',7,false}],
        false,
    -   {possibleActions,[{'Action',16,{'Button',17,true}}]}}}.
    -{status,#'Status'{state = 35,
    -        buttonList = [#'Button'{number = 3,on = true},
    -                      #'Button'{number = 4,on = false},
    -                      #'Button'{number = 5,on = true},
    -                      #'Button'{number = 6,on = true},
    -                      #'Button'{number = 7,on = false}],
    +   {possibleActions,[{'Action',16,{'Button',17,true}}]}}}.
    +{status,#'Status'{state = 35,
    +        buttonList = [#'Button'{number = 3,on = true},
    +                      #'Button'{number = 4,on = false},
    +                      #'Button'{number = 5,on = true},
    +                      #'Button'{number = 6,on = true},
    +                      #'Button'{number = 7,on = false}],
             enabled = false,
    -        actions = {possibleActions,[#'Action'{number = 16,
    -                                              handle = #'Button'{number = 17,on = true}}]}}}
    -9> WindowBytes = 'GUI':encode('Window', WindowMsg).
    +        actions = {possibleActions,[#'Action'{number = 16,
    +                                              handle = #'Button'{number = 17,on = true}}]}}}
    +9> WindowBytes = 'GUI':encode('Window', WindowMsg).
     <<161,65,128,1,35,161,40,48,6,128,1,3,129,1,255,48,6,128,
       1,4,129,1,0,48,6,128,1,5,129,...>>
    -10> {status,#'Status'{buttonList={UndecWindowKey,UndecWindowParts}}} =
    -'GUI':decode_Window_exclusive(WindowBytes).
    -{status,#'Status'{state = 35,
    -                  buttonList = {'Status_buttonList',[<<48,6,128,1,3,129,1,
    +10> {status,#'Status'{buttonList={UndecWindowKey,UndecWindowParts}}} =
    +'GUI':decode_Window_exclusive(WindowBytes).
    +{status,#'Status'{state = 35,
    +                  buttonList = {'Status_buttonList',[<<48,6,128,1,3,129,1,
                                                            255>>,
                                                          <<48,6,128,1,4,129,1,0>>,
                                                          <<48,6,128,1,5,129,1,255>>,
                                                          <<48,6,128,1,6,129,1,255>>,
    -                                                     <<48,6,128,1,7,129,1,0>>]},
    +                                                     <<48,6,128,1,7,129,1,0>>]},
                       enabled = false,
    -                  actions = {'Status_actions',<<163,15,160,13,48,11,128,
    +                  actions = {'Status_actions',<<163,15,160,13,48,11,128,
                                                     1,16,161,6,128,1,17,129,
    -                                                1,255>>}}}
    -11> 'GUI':decode_part(UndecWindowKey, UndecWindowParts).
    -[#'Button'{number = 3,on = true},
    - #'Button'{number = 4,on = false},
    - #'Button'{number = 5,on = true},
    - #'Button'{number = 6,on = true},
    - #'Button'{number = 7,on = false}]
    -12> 'GUI':decode_part(UndecWindowKey, hd(UndecWindowParts)).
    -#'Button'{number = 3,on = true}
    -13> {status,#'Status'{actions={ChoiceKey,ChoiceUndec}}} = v(10).
    -{status,#'Status'{state = 35,
    -                  buttonList = {'Status_buttonList',[<<48,6,128,1,3,129,1,
    +                                                1,255>>}}}
    +11> 'GUI':decode_part(UndecWindowKey, UndecWindowParts).
    +[#'Button'{number = 3,on = true},
    + #'Button'{number = 4,on = false},
    + #'Button'{number = 5,on = true},
    + #'Button'{number = 6,on = true},
    + #'Button'{number = 7,on = false}]
    +12> 'GUI':decode_part(UndecWindowKey, hd(UndecWindowParts)).
    +#'Button'{number = 3,on = true}
    +13> {status,#'Status'{actions={ChoiceKey,ChoiceUndec}}} = v(10).
    +{status,#'Status'{state = 35,
    +                  buttonList = {'Status_buttonList',[<<48,6,128,1,3,129,1,
                                                            255>>,
                                                          <<48,6,128,1,4,129,1,0>>,
                                                          <<48,6,128,1,5,129,1,255>>,
                                                          <<48,6,128,1,6,129,1,255>>,
    -                                                     <<48,6,128,1,7,129,1,0>>]},
    +                                                     <<48,6,128,1,7,129,1,0>>]},
                       enabled = false,
    -                  actions = {'Status_actions',<<163,15,160,13,48,11,128,
    +                  actions = {'Status_actions',<<163,15,160,13,48,11,128,
                                                     1,16,161,6,128,1,17,129,
    -                                                1,255>>}}}
    -14> 'GUI':decode_part(ChoiceKey, ChoiceUndec).
    -{possibleActions,[#'Action'{number = 16,
    -                            handle = #'Button'{number = 17,on = true}}]}

    + 1,255>>}}} +14> 'GUI':decode_part(ChoiceKey, ChoiceUndec). +{possibleActions,[#'Action'{number = 16, + handle = #'Button'{number = 17,on = true}}]}

    @@ -264,23 +264,23 @@ Writing a Selective Decode Instruction

    One or more selective decode functions can be described in a configuration file. -Use the following notation:

    SelectiveDecodeInstruction = {selective_decode,{ModuleName,DecodeInstructions}}.
    +Use the following notation:

    SelectiveDecodeInstruction = {selective_decode,{ModuleName,DecodeInstructions}}.
     
    -ModuleName = atom()
    +ModuleName = atom()
     
    -DecodeInstructions = [DecodeInstruction]+
    +DecodeInstructions = [DecodeInstruction]+
     
    -DecodeInstruction = {SelectiveDecodeFunctionName,TypeList}
    +DecodeInstruction = {SelectiveDecodeFunctionName,TypeList}
    /usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1.epub/OEBPS/asn1ct.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1.epub/OEBPS/asn1ct.xhtml	2025-05-10 20:19:02.409129716 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1.epub/OEBPS/asn1ct.xhtml	2025-05-10 20:19:02.413129752 +0000
    @@ -379,9 +379,9 @@
     mostly work for old specifications based on the 1997 standard for ASN.1, but
     not for most modern-style applications. Another limitation is that the test
     functions may not work if options that change code generations strategies such
    -as the options macro_name_prefix and record_name_prefix have been used.

    • test/1 iterates over all types in Module.
    • test/2 tests type Type with a random value.
    • test/3 tests type Type with Value.

    Schematically, the following occurs for each type in the module:

    {ok, Value} = asn1ct:value(Module, Type),
    -{ok, Bytes} = Module:encode(Type, Value),
    -{ok, Value} = Module:decode(Type, Bytes).

    The test functions use the *.asn1db files for all included modules. If they +as the options macro_name_prefix and record_name_prefix have been used.

    • test/1 iterates over all types in Module.
    • test/2 tests type Type with a random value.
    • test/3 tests type Type with Value.

    Schematically, the following occurs for each type in the module:

    {ok, Value} = asn1ct:value(Module, Type),
    +{ok, Bytes} = Module:encode(Type, Value),
    +{ok, Value} = Module:decode(Type, Bytes).

    The test functions use the *.asn1db files for all included modules. If they are located in a different directory than the current working directory, use the include option to add paths. This is only needed when automatically generating values. For static values using Value no options are needed.

    /usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1.epub/OEBPS/content.opf 2025-05-10 20:19:02.409129716 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1.epub/OEBPS/content.opf 2025-05-10 20:19:02.413129752 +0000 @@ -4,10 +4,10 @@ version="3.0"> asn1 - 5.3.4 - urn:uuid:e443518a-b0b7-82d7-088b-558f443b8451 + urn:uuid:92c672ff-5cc8-9415-4ee0-28449678a400 en - 2025-05-10T20:10:59Z + 2041-06-12T09:31:12Z /usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1.epub/OEBPS/notes.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1.epub/OEBPS/notes.xhtml 2025-05-10 20:19:02.409129716 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1.epub/OEBPS/notes.xhtml 2025-05-10 20:19:02.413129752 +0000 @@ -50,7 +50,7 @@ Improvements and New Features -
    • When using the JSON encoding rules, it is now possible to call the decode/2 function in the following way with data that has already been decoded by json:decode/1:

      SomeModule:decode(Type, {json_decoded, Decoded}).

      Own Id: OTP-19547 Aux Id: ERIERL-1206, PR-9611

    +
    • When using the JSON encoding rules, it is now possible to call the decode/2 function in the following way with data that has already been decoded by json:decode/1:

      SomeModule:decode(Type, {json_decoded, Decoded}).

      Own Id: OTP-19547 Aux Id: ERIERL-1206, PR-9611

    /usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1_getting_started.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1_getting_started.html 2025-05-10 20:19:02.509130622 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1_getting_started.html 2025-05-10 20:19:02.525130767 +0000 @@ -143,37 +143,37 @@ the syntax is correct and that the text represents proper ASN.1 code before generating an abstract syntax tree. The code generator then uses the abstract syntax tree to generate code.

    The generated Erlang files are placed in the current directory or in the -directory specified with option {outdir,Dir}.

    The compiler can be called from the Erlang shell like this:

    1> asn1ct:compile("People", [ber]).
    -ok

    Option verbose can be added to get information about the generated files:

    2> asn1ct:compile("People", [ber,verbose]).
    +directory specified with option {outdir,Dir}.

    The compiler can be called from the Erlang shell like this:

    1> asn1ct:compile("People", [ber]).
    +ok

    Option verbose can be added to get information about the generated files:

    2> asn1ct:compile("People", [ber,verbose]).
     Erlang ASN.1 compiling "People.asn"
    ---{generated,"People.asn1db"}--
    ---{generated,"People.hrl"}--
    ---{generated,"People.erl"}--
    +--{generated,"People.asn1db"}--
    +--{generated,"People.hrl"}--
    +--{generated,"People.erl"}--
     ok

    ASN.1 module People is now accepted and the abstract syntax tree is saved in file People.asn1db. The generated Erlang code is compiled using the Erlang compiler and loaded into the Erlang runtime system. There is now an API for -encode/2 and decode/2 in module People, which is called like this:

    'People':encode(<Type name>, <Value>)

    or:

    'People':decode(<Type name>, <Value>)

    Assume that there is a network application that receives instances of the ASN.1 +encode/2 and decode/2 in module People, which is called like this:

    'People':encode(<Type name>, <Value>)

    or:

    'People':decode(<Type name>, <Value>)

    Assume that there is a network application that receives instances of the ASN.1 defined type Person, modifies, and sends them back again:

    receive
    -   {Port,{data,Bytes}} ->
    -       case 'People':decode('Person',Bytes) of
    -           {ok,P} ->
    -               {ok,Answer} = 'People':encode('Person',mk_answer(P)),
    -               Port ! {self(),{command,Answer}};
    -           {error,Reason} ->
    -               exit({error,Reason})
    +   {Port,{data,Bytes}} ->
    +       case 'People':decode('Person',Bytes) of
    +           {ok,P} ->
    +               {ok,Answer} = 'People':encode('Person',mk_answer(P)),
    +               Port ! {self(),{command,Answer}};
    +           {error,Reason} ->
    +               exit({error,Reason})
            end
         end,

    In this example, a series of bytes is received from an external source and the bytes are then decoded into a valid Erlang term. This was achieved with the call 'People':decode('Person',Bytes), which returned an Erlang value of the ASN.1 type Person. Then an answer was constructed and encoded using 'People':encode('Person',Answer), which takes an instance of a defined ASN.1 -type and transforms it to a binary according to the BER or PER encoding rules.

    The encoder and decoder can also be run from the shell:

    2> Rockstar = {'Person',"Some Name",roving,50}.
    -{'Person',"Some Name",roving,50}
    -3> {ok,Bin} = 'People':encode('Person',Rockstar).
    -{ok,<<243,17,19,9,83,111,109,101,32,78,97,109,101,2,1,2,
    -      2,1,50>>}
    -4> {ok,Person} = 'People':decode('Person',Bin).
    -{ok,{'Person',"Some Name",roving,50}}

    +type and transforms it to a binary according to the BER or PER encoding rules.

    The encoder and decoder can also be run from the shell:

    2> Rockstar = {'Person',"Some Name",roving,50}.
    +{'Person',"Some Name",roving,50}
    +3> {ok,Bin} = 'People':encode('Person',Rockstar).
    +{ok,<<243,17,19,9,83,111,109,101,32,78,97,109,101,2,1,2,
    +      2,1,50>>}
    +4> {ok,Person} = 'People':decode('Person',Bin).
    +{ok,{'Person',"Some Name",roving,50}}

    @@ -244,16 +244,16 @@

    When using the JSON encoding rules, it is possible to call the decode/2 function in the following way with data that has already -been decoded by json:decode/1:

    SomeModule:decode(Type, {json_decoded, Decoded}).

    Example:

    1> asn1ct:compile("People", [jer]).
    +been decoded by json:decode/1:

    SomeModule:decode(Type, {json_decoded, Decoded}).

    Example:

    1> asn1ct:compile("People", [jer]).
     ok
    -2> Rockstar = {'Person',"Vince Eclipse",roving,50}.
    -{'Person',"Vince Eclipse",roving,50}
    -3> {ok,Bin} = 'People':encode('Person', Rockstar).
    -{ok,<<"{\"name\":\"Vince Eclipse\",\"location\":2,\"age\":50}">>}
    -4> 'People':decode('Person', Bin).
    -{ok,{'Person',"Vince Eclipse",roving,50}}
    -5> 'People':decode('Person', {json_decoded,json:decode(Bin)}).
    -{ok,{'Person',"Vince Eclipse",roving,50}}
    +2> Rockstar = {'Person',"Vince Eclipse",roving,50}.
    +{'Person',"Vince Eclipse",roving,50}
    +3> {ok,Bin} = 'People':encode('Person', Rockstar).
    +{ok,<<"{\"name\":\"Vince Eclipse\",\"location\":2,\"age\":50}">>}
    +4> 'People':decode('Person', Bin).
    +{ok,{'Person',"Vince Eclipse",roving,50}}
    +5> 'People':decode('Person', {json_decoded,json:decode(Bin)}).
    +{ok,{'Person',"Vince Eclipse",roving,50}}
     

    @@ -289,16 +289,16 @@ to manually add tags to certain constructs in order for the ASN.1 specification to be valid. Example of an old-style specification:

    Tags DEFINITIONS ::=
     BEGIN
    -  Afters ::= CHOICE { cheese [0] IA5String,
    -                      dessert [1] IA5String }
    +  Afters ::= CHOICE { cheese [0] IA5String,
    +                      dessert [1] IA5String }
     END

    Without the tags (the numbers in square brackets) the ASN.1 compiler refused to compile the file.

    In 1994 the global tagging mode AUTOMATIC TAGS was introduced. By putting AUTOMATIC TAGS in the module header, the ASN.1 compiler automatically adds tags when needed. The following is the same specification in AUTOMATIC TAGS mode:

    Tags DEFINITIONS AUTOMATIC TAGS ::=
     BEGIN
    -  Afters ::= CHOICE { cheese IA5String,
    -                      dessert IA5String }
    +  Afters ::= CHOICE { cheese IA5String,
    +                      dessert IA5String }
     END

    @@ -309,7 +309,7 @@ and how values are assigned in Erlang.

    ASN.1 has both primitive and constructed types:

    Primitive TypesConstructed Types
    BOOLEANSEQUENCE
    INTEGERSET
    REALCHOICE
    NULLSET OF and SEQUENCE OF
    ENUMERATEDANY
    BIT STRINGANY DEFINED BY
    OCTET STRINGEXTERNAL
    Character StringsEMBEDDED PDV
    OBJECT IDENTIFIERCHARACTER STRING
    Object Descriptor
    TIME Types

    Table: Supported ASN.1 Types

    Note

    The values of each ASN.1 type have their own representation in Erlang, as described in the following sections. Users must provide these values for encoding according to the representation, as shown in the following example:

    Operational ::= BOOLEAN --ASN.1 definition

    In Erlang code it can look as follows:

    Val = true,
    -{ok,Bytes} = MyModule:encode(&#href_anchor"p">, Val),

    +{ok,Bytes} = MyModule:encode(&#href_anchor"p">, Val),

    @@ -326,11 +326,11 @@

    An ASN.1 INTEGER is represented by an integer in Erlang.

    The concept of subtyping can be applied to integers and to other ASN.1 types. The details of subtyping are not explained here; for more information, see X.680. Various syntaxes are allowed when defining a type as an integer:

    T1 ::= INTEGER
    -T2 ::= INTEGER (-2..7)
    -T3 ::= INTEGER (0..MAX)
    -T4 ::= INTEGER (0<..MAX)
    -T5 ::= INTEGER (MIN<..-99)
    -T6 ::= INTEGER {red(0),blue(1),white(2)}

    The Erlang representation of an ASN.1 INTEGER is an integer or an atom if a +T2 ::= INTEGER (-2..7) +T3 ::= INTEGER (0..MAX) +T4 ::= INTEGER (0<..MAX) +T5 ::= INTEGER (MIN<..-99) +T6 ::= INTEGER {red(0),blue(1),white(2)}

    The Erlang representation of an ASN.1 INTEGER is an integer or an atom if a Named Number List (see T6 in the previous list) is specified.

    The following is an example of Erlang code that assigns values for the types in the previous list:

    T1value = 0,
     T2value = 6,
    @@ -379,7 +379,7 @@
     

    The type BIT STRING can be used to model information that is made up of arbitrary length series of bits. It is intended to be used for selection of flags, not for binary files.

    In ASN.1, BIT STRING definitions can look as follows:

    Bits1 ::= BIT STRING
    -Bits2 ::= BIT STRING {foo(0),bar(1),gnu(2),gnome(3),punk(14)}

    The following two notations are available for representation of BIT STRING +Bits2 ::= BIT STRING {foo(0),bar(1),gnu(2),gnome(3),punk(14)}

    The following two notations are available for representation of BIT STRING values in Erlang and as input to the encode functions:

    1. A bitstring. By default, a BIT STRING with no symbolic names is decoded to an Erlang bitstring.
    2. A list of atoms corresponding to atoms in the NamedBitList in the BIT STRING definition. A BIT STRING with symbolic names is always decoded @@ -407,7 +407,7 @@

      OCTET STRING is the simplest of all ASN.1 types. OCTET STRING only moves or transfers, for example, binary files or other unstructured information complying with two rules: the bytes consist of octets and encoding is not required.

      It is possible to have the following ASN.1 type definitions:

      O1 ::= OCTET STRING
      -O2 ::= OCTET STRING (SIZE(28))

      With the following example assignments in Erlang:

      O1Val = <<17,13,19,20,0,0,255,254>>,
      +O2 ::= OCTET STRING (SIZE(28))

      With the following example assignments in Erlang:

      O1Val = <<17,13,19,20,0,0,255,254>>,
       O2Val = <<"must be exactly 28 chars....">>,

      By default, an OCTET STRING is always represented as an Erlang binary. If the specification has been compiled with option legacy_erlang_types, the encode functions accept both lists and binaries, and the decode functions decode an @@ -428,11 +428,11 @@ of view, octets are very similar to character strings and are compiled in the same way.

      When PER is used, there is a significant difference in the encoding scheme for OCTET STRINGs and other strings. The constraints specified for a type -are especially important for PER, because they affect the encoding.

      Examples:

      Digs ::= NumericString (SIZE(1..3))
      -TextFile ::= IA5String (SIZE(0..64000))

      The corresponding Erlang assignments:

      DigsVal1 = "456",
      +are especially important for PER, because they affect the encoding.

      Examples:

      Digs ::= NumericString (SIZE(1..3))
      +TextFile ::= IA5String (SIZE(0..64000))

      The corresponding Erlang assignments:

      DigsVal1 = "456",
       DigsVal2 = "123",
       TextFileVal1 = "abc...xyz...",
      -TextFileVal2 = [88,76,55,44,99,121 .......... a lot of characters here ....]

      The Erlang representation for BMPString and UniversalString is either a list +TextFileVal2 = [88,76,55,44,99,121 .......... a lot of characters here ....]

      The Erlang representation for BMPString and UniversalString is either a list of ASCII values or a list of quadruples. The quadruple representation associates to the Unicode standard representation of characters. The ASCII characters are all represented by quadruples beginning with three zeros like {0,0,0,65} for @@ -441,26 +441,26 @@ in file PrimStrings.asn1:

      PrimStrings DEFINITIONS AUTOMATIC TAGS ::=
       BEGIN
          BMP ::= BMPString
      -END

      Encoding and decoding some strings:

      1> asn1ct:compile('PrimStrings', [ber]).
      +END

      Encoding and decoding some strings:

      1> asn1ct:compile('PrimStrings', [ber]).
       ok
      -2> {ok,Bytes1} = 'PrimStrings':encode('BMP', [{0,0,53,53},{0,0,45,56}]).
      -{ok,<<30,4,53,54,45,56>>}
      -3> 'PrimStrings':decode('BMP', Bytes1).
      -{ok,[{0,0,53,53},{0,0,45,56}]}
      -4> {ok,Bytes2} = 'PrimStrings':encode('BMP', [{0,0,53,53},{0,0,0,65}]).
      -{ok,<<30,4,53,53,0,65>>}
      -5> 'PrimStrings':decode('BMP', Bytes2).
      -{ok,[{0,0,53,53},65]}
      -6> {ok,Bytes3} = 'PrimStrings':encode('BMP', "BMP string").
      -{ok,<<30,20,0,66,0,77,0,80,0,32,0,115,0,116,0,114,0,105,0,110,0,103>>}
      -7> 'PrimStrings':decode('BMP', Bytes3).
      -{ok,"BMP string"}

      Type UTF8String is represented as a UTF-8 encoded binary in Erlang. Such +2> {ok,Bytes1} = 'PrimStrings':encode('BMP', [{0,0,53,53},{0,0,45,56}]). +{ok,<<30,4,53,54,45,56>>} +3> 'PrimStrings':decode('BMP', Bytes1). +{ok,[{0,0,53,53},{0,0,45,56}]} +4> {ok,Bytes2} = 'PrimStrings':encode('BMP', [{0,0,53,53},{0,0,0,65}]). +{ok,<<30,4,53,53,0,65>>} +5> 'PrimStrings':decode('BMP', Bytes2). +{ok,[{0,0,53,53},65]} +6> {ok,Bytes3} = 'PrimStrings':encode('BMP', "BMP string"). +{ok,<<30,20,0,66,0,77,0,80,0,32,0,115,0,116,0,114,0,105,0,110,0,103>>} +7> 'PrimStrings':decode('BMP', Bytes3). +{ok,"BMP string"}

    Type UTF8String is represented as a UTF-8 encoded binary in Erlang. Such binaries can be created directly using the binary syntax or by converting from a list of Unicode code points using function unicode:characters_to_binary/1.

    The following shows examples of how UTF-8 encoded binaries can be created and manipulated:

    1> Gs = "Мой маленький Гном".
    /usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1_introduction.html differs (HTML document, UTF-8 Unicode text)
    --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1_introduction.html	2025-05-10 20:19:02.545130948 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1_introduction.html	2025-05-10 20:19:02.545130948 +0000
    @@ -203,7 +203,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1_overview.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1_overview.html 2025-05-10 20:19:02.565131130 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1_overview.html 2025-05-10 20:19:02.569131166 +0000 @@ -190,7 +190,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1_spec.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1_spec.html 2025-05-10 20:19:02.593131384 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1_spec.html 2025-05-10 20:19:02.601131456 +0000 @@ -165,37 +165,37 @@ exclusive decode is enabled. This function decodes the parts that were left undecoded during the exclusive decode.

    Both functions are described in the following.

    If the exclusive decode function has, for example, the name decode_exclusive and an ASN.1 encoded message Bin is to be exclusive decoded, the call is as -follows:

    {ok,ExclMessage} = 'MyModule':decode_exclusive(Bin)

    The result ExclMessage has the same structure as a +follows:

    {ok,ExclMessage} = 'MyModule':decode_exclusive(Bin)

    The result ExclMessage has the same structure as a complete decode would have, except for the parts of the top type that were not decoded. The undecoded parts are on their places in the structure on format {TypeKey,UndecodedValue}.

    Each undecoded part that is to be decoded must be fed into function -decode_part/2 as follows:

    {ok,PartMessage} = &#href_anchor"p">:decode_part(TypeKey, UndecodedValue)

    +decode_part/2 as follows:

    {ok,PartMessage} = &#href_anchor"p">:decode_part(TypeKey, UndecodedValue)

    Writing an Exclusive Decode Instruction

    -

    This instruction is written in the configuration file in the following format:

    ExclusiveDecodeInstruction = {exclusive_decode,{ModuleName,DecodeInstructions}}.
    +

    This instruction is written in the configuration file in the following format:

    ExclusiveDecodeInstruction = {exclusive_decode,{ModuleName,DecodeInstructions}}.
     
    -ModuleName = atom()
    +ModuleName = atom()
     
    -DecodeInstructions = [DecodeInstruction]+
    +DecodeInstructions = [DecodeInstruction]+
     
    -DecodeInstruction = {ExclusiveDecodeFunctionName,TypeList}
    +DecodeInstruction = {ExclusiveDecodeFunctionName,TypeList}
     
    -ExclusiveDecodeFunctionName = atom()
    +ExclusiveDecodeFunctionName = atom()
     
    -TypeList = [TopType,ElementList]
    +TypeList = [TopType,ElementList]
     
    -ElementList = [Element]+
    +ElementList = [Element]+
     
    -Element = {Name,parts} |
    -          {Name,undecoded} |
    -          {Name,ElementList}
    +Element = {Name,parts} |
    +          {Name,undecoded} |
    +          {Name,ElementList}
     
    -TopType = atom()
    +TopType = atom()
     
    -Name = atom()

    The instruction must be a valid Erlang term terminated by a dot.

    In TypeList the path from the top type to each undecoded subcomponent is +Name = atom()

    The instruction must be a valid Erlang term terminated by a dot.

    In TypeList the path from the top type to each undecoded subcomponent is described. TopType is the name of a top-level type in the ASN.1 specification. The action for each component in ElementList is described by one of:

    • {Name,parts}
    • {Name,undecoded}
    • {Name,ElementList}

    The use and effect of the actions are as follows:

    • {Name,undecoded} - Leaves the element undecoded. The type of Name can be any ASN.1 type. The value of element Name is returned as a tuple (as @@ -261,78 +261,78 @@ ['Button',[{number,undecoded}]]}]}}.

    The following figure shows the bytes of a Window:status message. The components buttonList and actions are excluded from decode. Only state and enabled are decoded when decode__Window_exclusive is called.

    Bytes of a Window:status Message

    Here follows an example of how the module. Note that option no_ok_wrapper is -used to make the example more concise.

    1> asn1ct:compile('GUI', [ber,asn1config,no_ok_wrapper]).
    +used to make the example more concise.

    1> asn1ct:compile('GUI', [ber,asn1config,no_ok_wrapper]).
     ok
    -2> rr('GUI').
    -['Action','Button','Status']
    -3> ButtonMsg = #'Button'{number=123,on=true}.
    -#'Button'{number = 123,on = true}
    -4> ButtonBytes = 'GUI':encode('Button', ButtonMsg).
    +2> rr('GUI').
    +['Action','Button','Status']
    +3> ButtonMsg = #'Button'{number=123,on=true}.
    +#'Button'{number = 123,on = true}
    +4> ButtonBytes = 'GUI':encode('Button', ButtonMsg).
     <<48,6,128,1,123,129,1,255>>
    -5> ExclusiveMsgButton = 'GUI':decode_Button_exclusive(ButtonBytes).
    -#'Button'{number = {'Button_number',<<128,1,123>>},
    -          on = true}
    -6> {UndecKey,UndecBytes} = ExclusiveMsgButton#'Button'.number.
    -{'Button_number',<<128,1,123>>}
    -7> 'GUI':decode_part(UndecKey, UndecBytes).
    +5> ExclusiveMsgButton = 'GUI':decode_Button_exclusive(ButtonBytes).
    +#'Button'{number = {'Button_number',<<128,1,123>>},
    +          on = true}
    +6> {UndecKey,UndecBytes} = ExclusiveMsgButton#'Button'.number.
    +{'Button_number',<<128,1,123>>}
    +7> 'GUI':decode_part(UndecKey, UndecBytes).
     123
     8> WindowMsg =
    -{status,{'Status',35,
    -   [{'Button',3,true},
    -    {'Button',4,false},
    -    {'Button',5,true},
    -    {'Button',6,true},
    -    {'Button',7,false}],
    +{status,{'Status',35,
    +   [{'Button',3,true},
    +    {'Button',4,false},
    +    {'Button',5,true},
    +    {'Button',6,true},
    +    {'Button',7,false}],
        false,
    -   {possibleActions,[{'Action',16,{'Button',17,true}}]}}}.
    -{status,#'Status'{state = 35,
    -        buttonList = [#'Button'{number = 3,on = true},
    -                      #'Button'{number = 4,on = false},
    -                      #'Button'{number = 5,on = true},
    -                      #'Button'{number = 6,on = true},
    -                      #'Button'{number = 7,on = false}],
    +   {possibleActions,[{'Action',16,{'Button',17,true}}]}}}.
    +{status,#'Status'{state = 35,
    +        buttonList = [#'Button'{number = 3,on = true},
    +                      #'Button'{number = 4,on = false},
    +                      #'Button'{number = 5,on = true},
    +                      #'Button'{number = 6,on = true},
    +                      #'Button'{number = 7,on = false}],
             enabled = false,
    -        actions = {possibleActions,[#'Action'{number = 16,
    -                                              handle = #'Button'{number = 17,on = true}}]}}}
    -9> WindowBytes = 'GUI':encode('Window', WindowMsg).
    +        actions = {possibleActions,[#'Action'{number = 16,
    +                                              handle = #'Button'{number = 17,on = true}}]}}}
    +9> WindowBytes = 'GUI':encode('Window', WindowMsg).
     <<161,65,128,1,35,161,40,48,6,128,1,3,129,1,255,48,6,128,
       1,4,129,1,0,48,6,128,1,5,129,...>>
    -10> {status,#'Status'{buttonList={UndecWindowKey,UndecWindowParts}}} =
    -'GUI':decode_Window_exclusive(WindowBytes).
    -{status,#'Status'{state = 35,
    -                  buttonList = {'Status_buttonList',[<<48,6,128,1,3,129,1,
    +10> {status,#'Status'{buttonList={UndecWindowKey,UndecWindowParts}}} =
    +'GUI':decode_Window_exclusive(WindowBytes).
    +{status,#'Status'{state = 35,
    +                  buttonList = {'Status_buttonList',[<<48,6,128,1,3,129,1,
                                                            255>>,
                                                          <<48,6,128,1,4,129,1,0>>,
                                                          <<48,6,128,1,5,129,1,255>>,
                                                          <<48,6,128,1,6,129,1,255>>,
    -                                                     <<48,6,128,1,7,129,1,0>>]},
    +                                                     <<48,6,128,1,7,129,1,0>>]},
                       enabled = false,
    -                  actions = {'Status_actions',<<163,15,160,13,48,11,128,
    +                  actions = {'Status_actions',<<163,15,160,13,48,11,128,
                                                     1,16,161,6,128,1,17,129,
    -                                                1,255>>}}}
    -11> 'GUI':decode_part(UndecWindowKey, UndecWindowParts).
    -[#'Button'{number = 3,on = true},
    - #'Button'{number = 4,on = false},
    - #'Button'{number = 5,on = true},
    - #'Button'{number = 6,on = true},
    - #'Button'{number = 7,on = false}]
    -12> 'GUI':decode_part(UndecWindowKey, hd(UndecWindowParts)).
    -#'Button'{number = 3,on = true}
    -13> {status,#'Status'{actions={ChoiceKey,ChoiceUndec}}} = v(10).
    -{status,#'Status'{state = 35,
    -                  buttonList = {'Status_buttonList',[<<48,6,128,1,3,129,1,
    +                                                1,255>>}}}
    +11> 'GUI':decode_part(UndecWindowKey, UndecWindowParts).
    +[#'Button'{number = 3,on = true},
    + #'Button'{number = 4,on = false},
    + #'Button'{number = 5,on = true},
    + #'Button'{number = 6,on = true},
    + #'Button'{number = 7,on = false}]
    +12> 'GUI':decode_part(UndecWindowKey, hd(UndecWindowParts)).
    +#'Button'{number = 3,on = true}
    +13> {status,#'Status'{actions={ChoiceKey,ChoiceUndec}}} = v(10).
    +{status,#'Status'{state = 35,
    +                  buttonList = {'Status_buttonList',[<<48,6,128,1,3,129,1,
                                                            255>>,
                                                          <<48,6,128,1,4,129,1,0>>,
                                                          <<48,6,128,1,5,129,1,255>>,
                                                          <<48,6,128,1,6,129,1,255>>,
    -                                                     <<48,6,128,1,7,129,1,0>>]},
    +                                                     <<48,6,128,1,7,129,1,0>>]},
                       enabled = false,
    -                  actions = {'Status_actions',<<163,15,160,13,48,11,128,
    +                  actions = {'Status_actions',<<163,15,160,13,48,11,128,
                                                     1,16,161,6,128,1,17,129,
    -                                                1,255>>}}}
    -14> 'GUI':decode_part(ChoiceKey, ChoiceUndec).
    -{possibleActions,[#'Action'{number = 16,
    -                            handle = #'Button'{number = 17,on = true}}]}

    + 1,255>>}}} +14> 'GUI':decode_part(ChoiceKey, ChoiceUndec). +{possibleActions,[#'Action'{number = 16, + handle = #'Button'{number = 17,on = true}}]}

    @@ -369,23 +369,23 @@ Writing a Selective Decode Instruction

    One or more selective decode functions can be described in a configuration file. -Use the following notation:

    SelectiveDecodeInstruction = {selective_decode,{ModuleName,DecodeInstructions}}.
    +Use the following notation:

    SelectiveDecodeInstruction = {selective_decode,{ModuleName,DecodeInstructions}}.
     
    -ModuleName = atom()
    +ModuleName = atom()
     
    -DecodeInstructions = [DecodeInstruction]+
    +DecodeInstructions = [DecodeInstruction]+
     
    -DecodeInstruction = {SelectiveDecodeFunctionName,TypeList}
    +DecodeInstruction = {SelectiveDecodeFunctionName,TypeList}
    /usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1ct.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1ct.html	2025-05-10 20:19:02.629131710 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/asn1ct.html	2025-05-10 20:19:02.633131746 +0000
    @@ -495,9 +495,9 @@
     mostly work for old specifications based on the 1997 standard for ASN.1, but
     not for most modern-style applications. Another limitation is that the test
     functions may not work if options that change code generations strategies such
    -as the options macro_name_prefix and record_name_prefix have been used.

    • test/1 iterates over all types in Module.
    • test/2 tests type Type with a random value.
    • test/3 tests type Type with Value.

    Schematically, the following occurs for each type in the module:

    {ok, Value} = asn1ct:value(Module, Type),
    -{ok, Bytes} = Module:encode(Type, Value),
    -{ok, Value} = Module:decode(Type, Bytes).

    The test functions use the *.asn1db files for all included modules. If they +as the options macro_name_prefix and record_name_prefix have been used.

    • test/1 iterates over all types in Module.
    • test/2 tests type Type with a random value.
    • test/3 tests type Type with Value.

    Schematically, the following occurs for each type in the module:

    {ok, Value} = asn1ct:value(Module, Type),
    +{ok, Bytes} = Module:encode(Type, Value),
    +{ok, Value} = Module:decode(Type, Bytes).

    The test functions use the *.asn1db files for all included modules. If they are located in a different directory than the current working directory, use the include option to add paths. This is only needed when automatically generating values. For static values using Value no options are needed.

    @@ -564,7 +564,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/notes.html 2025-05-10 20:19:02.665132036 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/notes.html 2025-05-10 20:19:02.677132145 +0000 @@ -155,7 +155,7 @@ Improvements and New Features -
    • When using the JSON encoding rules, it is now possible to call the decode/2 function in the following way with data that has already been decoded by json:decode/1:

      SomeModule:decode(Type, {json_decoded, Decoded}).

      Own Id: OTP-19547 Aux Id: ERIERL-1206, PR-9611

    +
    • When using the JSON encoding rules, it is now possible to call the decode/2 function in the following way with data that has already been decoded by json:decode/1:

      SomeModule:decode(Type, {json_decoded, Decoded}).

      Own Id: OTP-19547 Aux Id: ERIERL-1206, PR-9611

    @@ -1599,7 +1599,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/search.html 2025-05-10 20:19:02.697132327 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.4/doc/html/search.html 2025-05-10 20:19:02.697132327 +0000 @@ -145,7 +145,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/404.html 2025-05-10 20:19:02.713132471 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/404.html 2025-05-10 20:19:02.713132471 +0000 @@ -147,7 +147,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/api-reference.html 2025-05-10 20:19:02.733132653 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/api-reference.html 2025-05-10 20:19:02.737132689 +0000 @@ -315,7 +315,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/basics_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/basics_chapter.html 2025-05-10 20:19:02.757132871 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/basics_chapter.html 2025-05-10 20:19:02.761132907 +0000 @@ -215,15 +215,15 @@ the reason for termination is. If you use Erlang pattern matching effectively, you can take advantage of this property. The result is concise and readable test case functions that look much more like scripts than actual programs. A simple -example:

    session(_Config) ->
    -    {started,ServerId} = my_server:start(),
    -    {clients,[]} = my_server:get_clients(ServerId),
    -    MyId = self(),
    -    connected = my_server:connect(ServerId, MyId),
    -    {clients,[MyId]} = my_server:get_clients(ServerId),
    -    disconnected = my_server:disconnect(ServerId, MyId),
    -    {clients,[]} = my_server:get_clients(ServerId),
    -    stopped = my_server:stop(ServerId).

    As a test suite runs, all information (including output to stdout) is recorded +example:

    session(_Config) ->
    +    {started,ServerId} = my_server:start(),
    +    {clients,[]} = my_server:get_clients(ServerId),
    +    MyId = self(),
    +    connected = my_server:connect(ServerId, MyId),
    +    {clients,[MyId]} = my_server:get_clients(ServerId),
    +    disconnected = my_server:disconnect(ServerId, MyId),
    +    {clients,[]} = my_server:get_clients(ServerId),
    +    stopped = my_server:stop(ServerId).

    As a test suite runs, all information (including output to stdout) is recorded in many different log files. A minimum of information is displayed in the user console (only start and stop information, plus a note for each failed test case).

    The result from each test case is recorded in a dedicated HTML log file, created @@ -303,7 +303,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/basics_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/basics_chapter.xhtml 2025-05-10 20:19:02.793133197 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/basics_chapter.xhtml 2025-05-10 20:19:02.805133305 +0000 @@ -110,15 +110,15 @@ the reason for termination is. If you use Erlang pattern matching effectively, you can take advantage of this property. The result is concise and readable test case functions that look much more like scripts than actual programs. A simple -example:

    session(_Config) ->
    -    {started,ServerId} = my_server:start(),
    -    {clients,[]} = my_server:get_clients(ServerId),
    -    MyId = self(),
    -    connected = my_server:connect(ServerId, MyId),
    -    {clients,[MyId]} = my_server:get_clients(ServerId),
    -    disconnected = my_server:disconnect(ServerId, MyId),
    -    {clients,[]} = my_server:get_clients(ServerId),
    -    stopped = my_server:stop(ServerId).

    As a test suite runs, all information (including output to stdout) is recorded +example:

    session(_Config) ->
    +    {started,ServerId} = my_server:start(),
    +    {clients,[]} = my_server:get_clients(ServerId),
    +    MyId = self(),
    +    connected = my_server:connect(ServerId, MyId),
    +    {clients,[MyId]} = my_server:get_clients(ServerId),
    +    disconnected = my_server:disconnect(ServerId, MyId),
    +    {clients,[]} = my_server:get_clients(ServerId),
    +    stopped = my_server:stop(ServerId).

    As a test suite runs, all information (including output to stdout) is recorded in many different log files. A minimum of information is displayed in the user console (only start and stop information, plus a note for each failed test case).

    The result from each test case is recorded in a dedicated HTML log file, created /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/config_file_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/config_file_chapter.xhtml 2025-05-10 20:19:02.793133197 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/config_file_chapter.xhtml 2025-05-10 20:19:02.805133305 +0000 @@ -37,8 +37,8 @@ Syntax

    -

    A configuration file can contain any number of elements of the type:

    {CfgVarName,Value}.

    where

    CfgVarName = atom()
    -Value = term() | [{CfgVarName,Value}]

    +

    A configuration file can contain any number of elements of the type:

    {CfgVarName,Value}.

    where

    CfgVarName = atom()
    +Value = term() | [{CfgVarName,Value}]

    @@ -65,13 +65,13 @@ any number of alias names, but each name must be unique within the same test suite. The two main uses for alias names follows:

    • To identify connections (described later).
    • To help adapt configuration data to a test suite (or test case) and improve readability.

    To read the value of a configuration variable, use function -get_config/1,2,3.

    Example:

    suite() ->
    -    [{require, domain, 'CONN_SPEC_DNS_SUFFIX'}].
    +get_config/1,2,3.

    Example:

    suite() ->
    +    [{require, domain, 'CONN_SPEC_DNS_SUFFIX'}].
     
     ...
     
    -testcase(Config) ->
    -    Domain = ct:get_config(domain),
    +testcase(Config) ->
    +    Domain = ct:get_config(domain),
         ...

    @@ -156,11 +156,11 @@ </ftp_host> <lm_directory>"/test/loadmodules"</lm_directory> </config>

    Once read, this file produces the same configuration variables as the following -text file:

    {ftp_host, [{ftp,"targethost"},
    -            {username,"tester"},
    -            {password,"letmein"}]}.
    +text file:

    {ftp_host, [{ftp,"targethost"},
    +            {username,"tester"},
    +            {password,"letmein"}]}.
     
    -{lm_directory, "/test/loadmodules"}.

    +{lm_directory, "/test/loadmodules"}.

    @@ -179,55 +179,55 @@ data being reloaded during test execution. The input argument is the same as for function check_parameter/1.

    The return value is to be either of the following:

    • {ok, Config} - if the configuration variables are read successfully.
    • {error, {Error, ErrorDetails}} - if the callback module fails to proceed with the specified configuration parameters.

    Config is the proper Erlang key-value list, with possible key-value sublists -as values, like the earlier configuration file example:

    [{ftp_host, [{ftp, "targethost"}, {username, "tester"}, {password, "letmein"}]},
    - {lm_directory, "/test/loadmodules"}]

    +as values, like the earlier configuration file example:

    [{ftp_host, [{ftp, "targethost"}, {username, "tester"}, {password, "letmein"}]},
    + {lm_directory, "/test/loadmodules"}]

    Examples of Configuration Data Handling

    A configuration file for using the FTP client to access files on a remote host -can look as follows:

    {ftp_host, [{ftp,"targethost"},
    -            {username,"tester"},
    -            {password,"letmein"}]}.
    +can look as follows:

    {ftp_host, [{ftp,"targethost"},
    +            {username,"tester"},
    +            {password,"letmein"}]}.
     
    -{lm_directory, "/test/loadmodules"}.

    The XML version shown earlier can also be used, but it is to be explicitly +{lm_directory, "/test/loadmodules"}.

    The XML version shown earlier can also be used, but it is to be explicitly specified that the ct_config_xml callback module is to be used by Common Test.

    The following is an example of how to assert that the configuration data is -available and can be used for an FTP session:

    init_per_testcase(ftptest, Config) ->
    -    {ok,_} = ct_ftp:open(ftp),
    +available and can be used for an FTP session:

    init_per_testcase(ftptest, Config) ->
    +    {ok,_} = ct_ftp:open(ftp),
         Config.
     
    -end_per_testcase(ftptest, _Config) ->
    -    ct_ftp:close(ftp).
    +end_per_testcase(ftptest, _Config) ->
    +    ct_ftp:close(ftp).
     
    -ftptest() ->
    -    [{require,ftp,ftp_host},
    -     {require,lm_directory}].
    -
    -ftptest(Config) ->
    -    Remote = filename:join(ct:get_config(lm_directory), "loadmodX"),
    -    Local = filename:join(proplists:get_value(priv_dir,Config), "loadmodule"),
    -    ok = ct_ftp:recv(ftp, Remote, Local),
    +ftptest() ->
    +    [{require,ftp,ftp_host},
    +     {require,lm_directory}].
    +
    +ftptest(Config) ->
    +    Remote = filename:join(ct:get_config(lm_directory), "loadmodX"),
    +    Local = filename:join(proplists:get_value(priv_dir,Config), "loadmodule"),
    +    ok = ct_ftp:recv(ftp, Remote, Local),
         ...

    The following is an example of how the functions in the previous example can be -rewritten if it is necessary to open multiple connections to the FTP server:

    init_per_testcase(ftptest, Config) ->
    -    {ok,Handle1} = ct_ftp:open(ftp_host),
    -    {ok,Handle2} = ct_ftp:open(ftp_host),
    -    [{ftp_handles,[Handle1,Handle2]} | Config].
    -
    -end_per_testcase(ftptest, Config) ->
    -    lists:foreach(fun(Handle) -> ct_ftp:close(Handle) end,
    -                  proplists:get_value(ftp_handles,Config)).
    -
    -ftptest() ->
    -    [{require,ftp_host},
    -     {require,lm_directory}].
    -
    -ftptest(Config) ->
    -    Remote = filename:join(ct:get_config(lm_directory), "loadmodX"),
    -    Local = filename:join(proplists:get_value(priv_dir,Config), "loadmodule"),
    -    [Handle | MoreHandles] = proplists:get_value(ftp_handles,Config),
    -    ok = ct_ftp:recv(Handle, Remote, Local),
    +rewritten if it is necessary to open multiple connections to the FTP server:

    init_per_testcase(ftptest, Config) ->
    +    {ok,Handle1} = ct_ftp:open(ftp_host),
    +    {ok,Handle2} = ct_ftp:open(ftp_host),
    +    [{ftp_handles,[Handle1,Handle2]} | Config].
    +
    +end_per_testcase(ftptest, Config) ->
    +    lists:foreach(fun(Handle) -> ct_ftp:close(Handle) end,
    +                  proplists:get_value(ftp_handles,Config)).
    +
    +ftptest() ->
    +    [{require,ftp_host},
    +     {require,lm_directory}].
    +
    +ftptest(Config) ->
    +    Remote = filename:join(ct:get_config(lm_directory), "loadmodX"),
    +    Local = filename:join(proplists:get_value(priv_dir,Config), "loadmodule"),
    +    [Handle | MoreHandles] = proplists:get_value(ftp_handles,Config),
    +    ok = ct_ftp:recv(Handle, Remote, Local),
         ...

    @@ -235,86 +235,86 @@ Example of User-Specific Configuration Handler

    A simple configuration handling driver, asking an external server for -configuration data, can be implemented as follows:

    -module(config_driver).
    --export([read_config/1, check_parameter/1]).
    +configuration data, can be implemented as follows:

    -module(config_driver).
    +-export([read_config/1, check_parameter/1]).
     
    -read_config(ServerName)->
    -    ServerModule = list_to_atom(ServerName),
    -    ServerModule:start(),
    -    ServerModule:get_config().
    -
    -check_parameter(ServerName)->
    -    ServerModule = list_to_atom(ServerName),
    -    case code:is_loaded(ServerModule) of
    -        {file, _}->
    -            {ok, {config, ServerName}};
    +read_config(ServerName)->
    +    ServerModule = list_to_atom(ServerName),
    +    ServerModule:start(),
    +    ServerModule:get_config().
    +
    +check_parameter(ServerName)->
    +    ServerModule = list_to_atom(ServerName),
    +    case code:is_loaded(ServerModule) of
    +        {file, _}->
    +            {ok, {config, ServerName}};
             false->
    -            case code:load_file(ServerModule) of
    -                {module, ServerModule}->
    -                    {ok, {config, ServerName}};
    -                {error, nofile}->
    -                    {error, {wrong_config, "File not found: " ++ ServerName ++ ".beam"}}
    +            case code:load_file(ServerModule) of
    +                {module, ServerModule}->
    +                    {ok, {config, ServerName}};
    +                {error, nofile}->
    +                    {error, {wrong_config, "File not found: " ++ ServerName ++ ".beam"}}
                 end
         end.

    The configuration string for this driver can be config_server, if the config_server.erl module that follows is compiled and exists in the code path -during test execution:

    -module(config_server).
    --export([start/0, stop/0, init/1, get_config/0, loop/0]).
    +during test execution:

    -module(config_server).
    +-export([start/0, stop/0, init/1, get_config/0, loop/0]).
     
    --define(REGISTERED_NAME, ct_test_config_server).
    +-define(REGISTERED_NAME, ct_test_config_server).
     
    -start()->
    -    case whereis(?REGISTERED_NAME) of
    +start()->
    +    case whereis(?REGISTERED_NAME) of
             undefined->
    -            spawn(?MODULE, init, [?REGISTERED_NAME]),
    -            wait();
    +            spawn(?MODULE, init, [?REGISTERED_NAME]),
    +            wait();
             _Pid->
    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text)
    --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/content.opf	2025-05-10 20:19:02.793133197 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/content.opf	2025-05-10 20:19:02.805133305 +0000
    @@ -4,10 +4,10 @@
              version="3.0">
       
         common_test - 1.27.7
    -    urn:uuid:b9d0f8d8-105b-f121-03fe-b973ce99c147
    +    urn:uuid:1163ba7f-607d-ca12-fb54-2d98aa17227e
         en
     
    -    2025-05-10T20:10:30Z
    +    2041-06-12T09:30:40Z
     
       
       
    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/cover_chapter.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/cover_chapter.xhtml	2025-05-10 20:19:02.793133197 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/cover_chapter.xhtml	2025-05-10 20:19:02.805133305 +0000
    @@ -96,44 +96,44 @@
     

    Here follows the general configuration terms that are allowed in a cover specification file:

    %% List of Nodes on which cover will be active during test.
     %% Nodes = [atom()]
    -{nodes, Nodes}.
    +{nodes, Nodes}.
     
     %% Files with previously exported cover data to include in analysis.
     %% CoverDataFiles = [string()]
    -{import, CoverDataFiles}.
    +{import, CoverDataFiles}.
     
     %% Cover data file to export from this session.
     %% CoverDataFile = string()
    -{export, CoverDataFile}.
    +{export, CoverDataFile}.
     
     %% Cover analysis level.
     %% Level = details | overview
    -{level, Level}.
    +{level, Level}.
     
     %% Directories to include in cover.
     %% Dirs = [string()]
    -{incl_dirs, Dirs}.
    +{incl_dirs, Dirs}.
     
     %% Directories, including subdirectories, to include.
    -{incl_dirs_r, Dirs}.
    +{incl_dirs_r, Dirs}.
     
     %% Specific modules to include in cover.
     %% Mods = [atom()]
    -{incl_mods, Mods}.
    +{incl_mods, Mods}.
     
     %% Directories to exclude in cover.
    -{excl_dirs, Dirs}.
    +{excl_dirs, Dirs}.
     
     %% Directories, including subdirectories, to exclude.
    -{excl_dirs_r, Dirs}.
    +{excl_dirs_r, Dirs}.
     
     %% Specific modules to exclude in cover.
    -{excl_mods, Mods}.
    +{excl_mods, Mods}.
     
     %% Cross cover compilation
     %% Tag = atom(), an identifier for a test run
     %% Mod = [atom()], modules to compile for accumulated analysis
    -{cross,[{Tag,Mods}]}.

    The terms incl_dirs_r and excl_dirs_r tell Common Test to search the +{cross,[{Tag,Mods}]}.

    The terms incl_dirs_r and excl_dirs_r tell Common Test to search the specified directories recursively and include or exclude any module found during the search. The terms incl_dirs and excl_dirs result in a non-recursive search for modules (that is, only modules found in the specified directories are @@ -148,7 +148,7 @@

    When using a cover specification in the testing of an OTP application itself, there is a special incl_app directive that includes the applications modules for -the cover compilation.

    {incl_app, AppName, Cover :: overview | details}.

    Note

    If you desire to also use some other general cover configuration together with +the cover compilation.

    {incl_app, AppName, Cover :: overview | details}.

    Note

    If you desire to also use some other general cover configuration together with this option you should insert the AppName in between the option and its value creating a three tuple.

    @@ -175,7 +175,7 @@ {cross,[{s1,[m1]}]}.

    Then m1 is cover compiled in test run s2, but not shown in the coverage log. Instead, if ct_cover:cross_cover_analyse/2 is called after both s1 and s2 test runs are completed, the accumulated result for m1 is available in the -cross cover log for test run s1.

    The call to the analyze function must be as follows:

    ct_cover:cross_cover_analyse(Level, [{s1,S1LogDir},{s2,S2LogDir}]).

    Here, S1LogDir and S2LogDir are the directories named <TestName>.logs for +cross cover log for test run s1.

    The call to the analyze function must be as follows:

    ct_cover:cross_cover_analyse(Level, [{s1,S1LogDir},{s2,S2LogDir}]).

    Here, S1LogDir and S2LogDir are the directories named <TestName>.logs for each test respectively.

    Notice the tags s1 and s2, which are used in the cover specification file and in the call to ct_cover:cross_cover_analyse/2. The purpose of these is only to map the modules specified in the cover specification to the log /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct.xhtml 2025-05-10 20:19:02.793133197 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct.xhtml 2025-05-10 20:19:02.805133305 +0000 @@ -1857,17 +1857,17 @@

    Reads configuration data values.

    Returns the matching values or configuration elements, given a configuration variable key or its associated name (if one has been specified with -ct:require/2 or a require statement).

    Example:

    Given the following configuration file:

    {unix,[{telnet,IpAddr},
    -       {user,[{username,Username},
    -              {password,Password}]}]}.

    Then:

    ct:get_config(unix,Default) -> [{telnet,IpAddr},
    - {user, [{username,Username}, {password,Password}]}]
    -ct:get_config({unix,telnet},Default) -> IpAddr
    -ct:get_config({unix,user,username},Default) -> Username
    -ct:get_config({unix,ftp},Default) -> Default
    -ct:get_config(unknownkey,Default) -> Default

    If a configuration variable key has been associated with a name (by +ct:require/2 or a require statement).

    Example:

    Given the following configuration file:

    {unix,[{telnet,IpAddr},
    +       {user,[{username,Username},
    +              {password,Password}]}]}.

    Then:

    ct:get_config(unix,Default) -> [{telnet,IpAddr},
    + {user, [{username,Username}, {password,Password}]}]
    +ct:get_config({unix,telnet},Default) -> IpAddr
    +ct:get_config({unix,user,username},Default) -> Username
    +ct:get_config({unix,ftp},Default) -> Default
    +ct:get_config(unknownkey,Default) -> Default

    If a configuration variable key has been associated with a name (by ct:require/2 or a require statement), the name can be used -instead of the key to read the value:

    ct:require(myuser,{unix,user}) -> ok.
    -ct:get_config(myuser,Default) -> [{username,Username}, {password,Password}]

    If a configuration variable is defined in multiple files, use option all to +instead of the key to read the value:

    ct:require(myuser,{unix,user}) -> ok.
    +ct:get_config(myuser,Default) -> [{username,Username}, {password,Password}]

    If a configuration variable is defined in multiple files, use option all to access all possible values. The values are returned in a list. The order of the elements corresponds to the order that the configuration files were specified at startup.

    If configuration elements (key-value tuples) are to be returned as result @@ -1905,7 +1905,7 @@

    Gets a reference to the Common Test event manager. The reference can be used -to, for example, add a user-specific event handler while tests are running.

    Example:

    gen_event:add_handler(ct:get_event_mgr_ref(), my_ev_h, [])
    +to, for example, add a user-specific event handler while tests are running.

    Example:

    gen_event:add_handler(ct:get_event_mgr_ref(), my_ev_h, [])
    @@ -2194,7 +2194,7 @@ -

    Installs configuration files and event handlers.

    Run this function once before the first test.

    Example:

    install([{config,["config_node.ctc","config_user.ctc"]}])

    This function is automatically run by program ct_run.

    +

    Installs configuration files and event handlers.

    Run this function once before the first test.

    Example:

    install([{config,["config_node.ctc","config_user.ctc"]}])

    This function is automatically run by program ct_run.

    @@ -3031,7 +3031,7 @@

    Checks if the required configuration is available. Arbitrarily deep tuples can be specified as Required. Only the last element of the tuple can be a list of -SubKeys.

    Example 1. Require the variable myvar:

    ok = ct:require(myvar).

    In this case the configuration file must at least contain:

    {myvar,Value}.

    Example 2. Require key myvar with subkeys sub1 and sub2:

    ok = ct:require({myvar,[sub1,sub2]}).

    In this case the configuration file must at least contain:

    {myvar,[{sub1,Value},{sub2,Value}]}.

    Example 3. Require key myvar with subkey sub1 with subsub1:

    ok = ct:require({myvar,sub1,sub2}).

    In this case the configuration file must at least contain:

    {myvar,[{sub1,[{sub2,Value}]}]}.

    See also ct:get_config/1, +SubKeys.

    Example 1. Require the variable myvar:

    ok = ct:require(myvar).

    In this case the configuration file must at least contain:

    {myvar,Value}.

    Example 2. Require key myvar with subkeys sub1 and sub2:

    ok = ct:require({myvar,[sub1,sub2]}).

    In this case the configuration file must at least contain:

    {myvar,[{sub1,Value},{sub2,Value}]}.

    Example 3. Require key myvar with subkey sub1 with subsub1:

    ok = ct:require({myvar,sub1,sub2}).

    In this case the configuration file must at least contain:

    {myvar,[{sub1,[{sub2,Value}]}]}.

    See also ct:get_config/1, ct:get_config/2, ct:get_config/3, ct:require/2.

    @@ -3073,8 +3073,8 @@ that the value of the element can be read with ct:get_config/1,2 provided Name is used instead of the whole Required term.

    Example:

    Require one node with a Telnet connection and an FTP connection. Name the node -a:

    ok = ct:require(a,{machine,node}).

    All references to this node can then use the node name. For example, a file over -FTP is fetched like follows:

    ok = ct:ftp_get(a,RemoteFile,LocalFile).

    For this to work, the configuration file must at least contain:

    {machine,[{node,[{telnet,IpAddr},{ftp,IpAddr}]}]}.

    Note

    The behavior of this function changed radically in Common Test 1.6.2. To +a:

    ok = ct:require(a,{machine,node}).

    All references to this node can then use the node name. For example, a file over +FTP is fetched like follows:

    ok = ct:ftp_get(a,RemoteFile,LocalFile).

    For this to work, the configuration file must at least contain:

    {machine,[{node,[{telnet,IpAddr},{ftp,IpAddr}]}]}.

    Note

    The behavior of this function changed radically in Common Test 1.6.2. To keep some backwards compatibility, it is still possible to do: ct:require(a,{node,[telnet,ftp]}). This associates the name a with the top-level node entry. For this to work, the configuration file must at least @@ -3449,12 +3449,12 @@ the Erlang shell. The interactive mode can also be started from the OS command line with ct_run -shell [-config File...].

    If any functions (for example, Telnet or FTP) using "required configuration data" are to be called from the Erlang shell, configuration data must first be -required with ct:require/2.

    Example:

    > ct:require(unix_telnet, unix).
    +required with ct:require/2.

    Example:

    > ct:require(unix_telnet, unix).
     ok
    -> ct_telnet:open(unix_telnet).
    -{ok,<0.105.0>}
    -> ct_telnet:cmd(unix_telnet, "ls .").
    -{ok,["ls","file1  ...",...]}
    +>
    ct_telnet:open(unix_telnet). +{ok,<0.105.0>} +> ct_telnet:cmd(unix_telnet, "ls ."). +{ok,["ls","file1 ...",...]}
    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_ftp.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_ftp.xhtml 2025-05-10 20:19:02.793133197 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_ftp.xhtml 2025-05-10 20:19:02.805133305 +0000 @@ -468,10 +468,10 @@

    Opens an FTP connection and sends a file to the remote host.

    LocalFile and RemoteFile must be absolute paths.

    If the target host is a "special" node, the FTP address must be specified in the -configuration file as follows:

    {node,[{ftp,IpAddr}]}.

    If the target host is something else, for example, a UNIX host, the -configuration file must also include the username and password (both strings):

    {unix,[{ftp,IpAddr},
    -       {username,Username},
    -       {password,Password}]}.

    See also ct:require/2.

    +configuration file as follows:

    {node,[{ftp,IpAddr}]}.

    If the target host is something else, for example, a UNIX host, the +configuration file must also include the username and password (both strings):

    {unix,[{ftp,IpAddr},
    +       {username,Username},
    +       {password,Password}]}.

    See also ct:require/2.

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_hooks_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_hooks_chapter.xhtml 2025-05-10 20:19:02.793133197 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_hooks_chapter.xhtml 2025-05-10 20:19:02.805133305 +0000 @@ -148,12 +148,12 @@ always a combination of a result for the suite/group/test and an updated CTHState.

    To let the test suite continue on executing, return the configuration list that you want the test to use as the result.

    All pre hooks, except pre_end_per_testcase/4, can skip or fail the test by -returning a tuple with skip or fail, and a reason as the result.

    Example:

    pre_init_per_suite(SuiteName, Config, CTHState) ->
    -  case db:connect() of
    -    {error,_Reason} ->
    -      {{fail, "Could not connect to DB"}, CTHState};
    -    {ok, Handle} ->
    -      {[{db_handle, Handle} | Config], CTHState#state{ handle = Handle }}
    +returning a tuple with skip or fail, and a reason as the result.

    Example:

    pre_init_per_suite(SuiteName, Config, CTHState) ->
    +  case db:connect() of
    +    {error,_Reason} ->
    +      {{fail, "Could not connect to DB"}, CTHState};
    +    {ok, Handle} ->
    +      {[{db_handle, Handle} | Config], CTHState#state{ handle = Handle }}
       end.

    Note

    If you use multiple CTHs, the first part of the return tuple is used as input for the next CTH. So in the previous example the next CTH can get {fail,Reason} as the second parameter. If you have many CTHs interacting, do @@ -175,18 +175,18 @@ affect the outcome of the test, return the Return data as it is given to the CTH. You can also modify the test result. By returning the Config list with element tc_status removed, you can recover from a test failure. As in all the -pre hooks, it is also possible to fail/skip the test case in the post hook.

    Example:

    post_end_per_testcase(_Suite, _TC, Config, {'EXIT',{_,_}}, CTHState) ->
    -  case db:check_consistency() of
    +pre hooks, it is also possible to fail/skip the test case in the post hook.

    Example:

    post_end_per_testcase(_Suite, _TC, Config, {'EXIT',{_,_}}, CTHState) ->
    +  case db:check_consistency() of
         true ->
           %% DB is good, pass the test.
    -      {proplists:delete(tc_status, Config), CTHState};
    +      {proplists:delete(tc_status, Config), CTHState};
         false ->
           %% DB is not good, mark as skipped instead of failing
    -      {{skip, "DB is inconsistent!"}, CTHState}
    +      {{skip, "DB is inconsistent!"}, CTHState}
       end;
    -post_end_per_testcase(_Suite, _TC, Config, Return, CTHState) ->
    +post_end_per_testcase(_Suite, _TC, Config, Return, CTHState) ->
       %% Do nothing if tc does not crash.
    -  {Return, CTHState}.

    Note

    Do recover from a testcase failure using CTHs only a last resort. If used + {Return, CTHState}.

    Note

    Do recover from a testcase failure using CTHs only a last resort. If used wrongly, it can be very difficult to determine which tests that pass or fail in a test run.

    @@ -235,80 +235,80 @@ %%% ct_run -suite example_SUITE -pa . -ct_hooks example_cth %%% %%% Note `-pa .`: the hook beam file must be in the code path when installing. --module(example_cth). +-module(example_cth). %% Mandatory Callbacks --export([init/2]). +-export([init/2]). %% Optional Callbacks --export([id/1]). +-export([id/1]). --export([pre_init_per_suite/3]). --export([post_end_per_suite/4]). +-export([pre_init_per_suite/3]). +-export([post_end_per_suite/4]). --export([pre_init_per_testcase/4]). --export([post_end_per_testcase/5]). +-export([pre_init_per_testcase/4]). +-export([post_end_per_testcase/5]). --export([on_tc_skip/4]). +-export([on_tc_skip/4]). --export([terminate/1]). +-export([terminate/1]). %% This hook state is threaded through all the callbacks. --record(state, {filename, total, suite_total, ts, tcs, data, skipped}). +-record(state, {filename, total, suite_total, ts, tcs, data, skipped}). %% This example hook prints its results to a file, see terminate/1. --record(test_run, {total, skipped, suites}). +-record(test_run, {total, skipped, suites}). %% Return a unique id for this CTH. %% Using the filename means the hook can be used with different %% log files to separate timing data within the same test run. %% See Installing a CTH for more information. -id(Opts) -> +id(Opts) -> %% the path is relative to the test run directory - proplists:get_value(filename, Opts, "example_cth.log"). + proplists:get_value(filename, Opts, "example_cth.log"). %% Always called before any other callback function. Use this to initiate %% any common state. -init(Id, _Opts) -> - {ok, #state{filename = Id, total = 0, data = []}}. +init(Id, _Opts) -> + {ok, #state{filename = Id, total = 0, data = []}}. %% Called before init_per_suite is called. -pre_init_per_suite(_Suite,Config,State) -> - {Config, State#state{suite_total = 0, tcs = []}}. +pre_init_per_suite(_Suite,Config,State) -> + {Config, State#state{suite_total = 0, tcs = []}}. %% Called after end_per_suite. -post_end_per_suite(Suite,_Config,Return,State) -> - Data = {suites, Suite, State#state.suite_total, - lists:reverse(State#state.tcs)}, - {Return, State#state{data = [Data | State#state.data], - total = State#state.total + State#state.suite_total}}. +post_end_per_suite(Suite,_Config,Return,State) -> + Data = {suites, Suite, State#state.suite_total, + lists:reverse(State#state.tcs)}, + {Return, State#state{data = [Data | State#state.data], + total = State#state.total + State#state.suite_total}}. %% Called before each init_per_testcase. -pre_init_per_testcase(_Suite,_TC,Config,State) -> - Now = erlang:monotonic_time(microsecond), - {Config, State#state{ts = Now, suite_total = State#state.suite_total + 1}}. +pre_init_per_testcase(_Suite,_TC,Config,State) -> + Now = erlang:monotonic_time(microsecond), + {Config, State#state{ts = Now, suite_total = State#state.suite_total + 1}}. %% Called after each end_per_testcase. -post_end_per_testcase(Suite,TC,_Config,Return,State) -> - Now = erlang:monotonic_time(microsecond), - TCInfo = {testcase, Suite, TC, Return, Now - State#state.ts}, - {Return, State#state{ts = undefined, tcs = [TCInfo | State#state.tcs]}}. +post_end_per_testcase(Suite,TC,_Config,Return,State) -> + Now = erlang:monotonic_time(microsecond), + TCInfo = {testcase, Suite, TC, Return, Now - State#state.ts}, + {Return, State#state{ts = undefined, tcs = [TCInfo | State#state.tcs]}}. %% Called when a test case is skipped by either user action %% or due to an init function failing. -on_tc_skip(_Suite, _TC, _Reason, State) -> - State#state{skipped = State#state.skipped + 1}. +on_tc_skip(_Suite, _TC, _Reason, State) -> + State#state{skipped = State#state.skipped + 1}. %% Called when the scope of the CTH is done. -terminate(State) -> +terminate(State) -> %% use append to avoid data loss if the path is reused - {ok, File} = file:open(State#state.filename, [write, append]), - io:format(File, "~p.~n", [results(State)]), - file:close(File), + {ok, File} = file:open(State#state.filename, [write, append]), + io:format(File, "~p.~n", [results(State)]), + file:close(File), ok. -results(State) -> - #state{skipped = Skipped, data = Data, total = Total} = State, - #test_run{total = Total, skipped = Skipped, suites = lists:reverse(Data)}.

    +results(State) -> + #state{skipped = Skipped, data = Data, total = Total} = State, + #test_run{total = Total, skipped = Skipped, suites = lists:reverse(Data)}.

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_master.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_master.xhtml 2025-05-10 20:19:02.793133197 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_master.xhtml 2025-05-10 20:19:02.805133305 +0000 @@ -327,7 +327,7 @@

    Gets a reference to the Common Test master event manager. The reference can be -used to, for example, add a user-specific event handler while tests are running.

    Example:

    gen_event:add_handler(ct_master:get_event_mgr_ref(), my_ev_h, [])
    +used to, for example, add a user-specific event handler while tests are running.

    Example:

    gen_event:add_handler(ct_master:get_event_mgr_ref(), my_ev_h, [])
    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_master_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_master_chapter.xhtml 2025-05-10 20:19:02.793133197 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_master_chapter.xhtml 2025-05-10 20:19:02.805133305 +0000 @@ -51,7 +51,7 @@ of test specifications. If it is a list, the specifications are handled (and the corresponding tests executed) in sequence. An element in a TestSpecs list can also be list of test specifications. The specifications in such a list are -merged into one combined specification before test execution.

    Example:

    ct_master:run(["ts1","ts2",["ts3","ts4"]])

    Here, the tests specified by "ts1" run first, then the tests specified by "ts2", +merged into one combined specification before test execution.

    Example:

    ct_master:run(["ts1","ts2",["ts3","ts4"]])

    Here, the tests specified by "ts1" run first, then the tests specified by "ts2", and finally the tests specified by both "ts3" and "ts4".

    The InclNodes argument to run/3 is a list of node names. Function run/3 runs the tests in TestSpecs just like run/1, but also takes any test in TestSpecs, which is not explicitly tagged with a particular node name, and @@ -91,32 +91,32 @@ install an event handler).

    Consider the example in section Test Specifications in section Running Tests and Analysing Results, now extended with node information and -intended to be executed by Common Test Master:

    {define, 'Top', "/home/test"}.
    -{define, 'T1', "'Top'/t1"}.
    -{define, 'T2', "'Top'/t2"}.
    -{define, 'T3', "'Top'/t3"}.
    -{define, 'CfgFile', "config.cfg"}.
    -{define, 'Node', ct_node}.
    -
    -{node, node1, 'Node@host_x'}.
    -{node, node2, 'Node@host_y'}.
    -
    -{logdir, master, "'Top'/master_logs"}.
    -{logdir, "'Top'/logs"}.
    -
    -{config, node1, "'T1'/'CfgFile'"}.
    -{config, node2, "'T2'/'CfgFile'"}.
    -{config, "'T3'/'CfgFile'"}.
    -
    -{suites, node1, 'T1', all}.
    -{skip_suites, node1, 'T1', [t1B_SUITE,t1D_SUITE], "Not implemented"}.
    -{skip_cases, node1, 'T1', t1A_SUITE, [test3,test4], "Irrelevant"}.
    -{skip_cases, node1, 'T1', t1C_SUITE, [test1], "Ignore"}.
    +intended to be executed by Common Test Master:

    {define, 'Top', "/home/test"}.
    +{define, 'T1', "'Top'/t1"}.
    +{define, 'T2', "'Top'/t2"}.
    +{define, 'T3', "'Top'/t3"}.
    +{define, 'CfgFile', "config.cfg"}.
    +{define, 'Node', ct_node}.
    +
    +{node, node1, 'Node@host_x'}.
    +{node, node2, 'Node@host_y'}.
    +
    +{logdir, master, "'Top'/master_logs"}.
    +{logdir, "'Top'/logs"}.
    +
    +{config, node1, "'T1'/'CfgFile'"}.
    +{config, node2, "'T2'/'CfgFile'"}.
    +{config, "'T3'/'CfgFile'"}.
    +
    +{suites, node1, 'T1', all}.
    +{skip_suites, node1, 'T1', [t1B_SUITE,t1D_SUITE], "Not implemented"}.
    +{skip_cases, node1, 'T1', t1A_SUITE, [test3,test4], "Irrelevant"}.
    +{skip_cases, node1, 'T1', t1C_SUITE, [test1], "Ignore"}.
     
    -{suites, node2, 'T2', [t2B_SUITE,t2C_SUITE]}.
    -{cases, node2, 'T2', t2A_SUITE, [test4,test1,test7]}.
    +{suites, node2, 'T2', [t2B_SUITE,t2C_SUITE]}.
    +{cases, node2, 'T2', t2A_SUITE, [test4,test1,test7]}.
     
    -{skip_suites, 'T3', all, "Not implemented"}.

    This example specifies the same tests as the original example. But now if +{skip_suites, 'T3', all, "Not implemented"}.

    This example specifies the same tests as the original example. But now if started with a call to ct_master:run(TestSpecName), test t1 is executed on node ct_node@host_x (node1), test t2 on ct_node@host_y (node2) and test t3 on both node1 and node2. Configuration file t1 is only read on @@ -139,13 +139,13 @@ Automatic Startup of Test Target Nodes

    Initial actions can be started and performed automatically on test target nodes -using test specification term init.

    Two subterms are supported, node_start and eval.

    Example:

    {node, node1, node1@host1}.
    -{node, node2, node1@host2}.
    -{node, node3, node2@host2}.
    -{node, node4, node1@host3}.
    -{init, node1, [{node_start, [{callback_module, my_slave_callback}]}]}.
    -{init, [node2, node3], {node_start, [{username, "ct_user"}, {password, "ct_password"}]}}.
    -{init, node4, {eval, {module, function, []}}}.

    This test specification declares that node1@host1 is to be started using the +using test specification term init.

    Two subterms are supported, node_start and eval.

    Example:

    {node, node1, node1@host1}.
    +{node, node2, node1@host2}.
    +{node, node3, node2@host2}.
    +{node, node4, node1@host3}.
    +{init, node1, [{node_start, [{callback_module, my_slave_callback}]}]}.
    +{init, [node2, node3], {node_start, [{username, "ct_user"}, {password, "ct_password"}]}}.
    +{init, node4, {eval, {module, function, []}}}.

    This test specification declares that node1@host1 is to be started using the user callback function callback_module:my_slave_callback/0, and nodes node1@host2 and node2@host2 are to be started with the default callback module ct_slave. The specified username and password are used to log on to /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_netconfc.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_netconfc.xhtml 2025-05-10 20:19:02.793133197 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_netconfc.xhtml 2025-05-10 20:19:02.801133269 +0000 @@ -32,7 +32,7 @@ to the server.

    Alternately, open/1,2 can be used to establish a single session on a dedicated connection. (Or, equivalently, only_open/1,2 followed by hello/1-3.)

    Connect/session options can be specified in a configuration file with entries -like the following.

    {server_id(), [option()]}.

    The server_id/0 or an associated ct:target_name/0 can then be passed to +like the following.

    {server_id(), [option()]}.

    The server_id/0 or an associated ct:target_name/0 can then be passed to the aforementioned functions to use the referenced configuration.

    Signaling

    Protocol operations in the NETCONF protocol are realized as remote procedure calls (RPCs) from client to server and a corresponding reply from server to client. RPCs are sent using like-named functions (eg. @@ -45,8 +45,8 @@ in most cases since a non-response by the server or a missing message-id causes the call to hang indefinitely.

    Logging

    The NETCONF server uses error_logger for logging of NETCONF traffic. A special purpose error handler is implemented in ct_conn_log_h. To use this error -handler, add the cth_conn_log hook in the test suite, for example:

    suite() ->
    -    [{ct_hooks, [{cth_conn_log, [{ct:conn_log_mod(), ct:conn_log_options()}]}]}].

    conn_log_mod() is the name of the Common Test module implementing the +handler, add the cth_conn_log hook in the test suite, for example:

    suite() ->
    +    [{ct_hooks, [{cth_conn_log, [{ct:conn_log_mod(), ct:conn_log_options()}]}]}].

    conn_log_mod() is the name of the Common Test module implementing the connection protocol, for example, ct_netconfc.

    Hook option log_type specifies the type of logging:

    • raw - The sent and received NETCONF data is logged to a separate text file "as is" without any formatting. A link to the file is added to the test case HTML log.

    • pretty - The sent and received NETCONF data is logged to a separate text @@ -57,17 +57,17 @@ option hosts and list the names of the servers/connections to be used in the suite. The connections must be named for this to work, that is, they must be opened with open/2.

      Option hosts has no effect if log_type is set to html or silent.

      The hook options can also be specified in a configuration file with -configuration variable ct_conn_log:

      {ct_conn_log,[{ct:conn_log_mod(), ct:conn_log_options()}]}.

      For example:

      {ct_conn_log,[{ct_netconfc,[{log_type,pretty},
      -                            {hosts,[ct:key_or_name()]}]}]}

      Note

      Hook options specified in a configuration file overwrite the hard-coded hook +configuration variable ct_conn_log:

      {ct_conn_log,[{ct:conn_log_mod(), ct:conn_log_options()}]}.

      For example:

      {ct_conn_log,[{ct_netconfc,[{log_type,pretty},
      +                            {hosts,[ct:key_or_name()]}]}]}

      Note

      Hook options specified in a configuration file overwrite the hard-coded hook options in the test suite.

      Logging Example 1:

      The following ct_hooks statement causes pretty printing of NETCONF traffic to separate logs for the connections named nc_server1 and nc_server2. Any other -connections are logged to default NETCONF log.

      suite() ->
      -   [{ct_hooks, [{cth_conn_log, [{ct_netconfc,[{log_type,pretty}},
      -                                              {hosts,[nc_server1,nc_server2]}]}
      -                               ]}]}].

      Connections must be opened as follows:

      open(nc_server1,[...]),
      -open(nc_server2,[...]).

      Logging Example 2:

      The following configuration file causes raw logging of all NETCONF traffic in to -one single text file:

      {ct_conn_log,[{ct_netconfc,[{log_type,raw}]}]}.

      The ct_hooks statement must look as follows:

      suite() ->
      -    [{ct_hooks, [{cth_conn_log, []}]}].

      The same ct_hooks statement without the configuration file would cause HTML +connections are logged to default NETCONF log.

      suite() ->
      +   [{ct_hooks, [{cth_conn_log, [{ct_netconfc,[{log_type,pretty}},
      +                                              {hosts,[nc_server1,nc_server2]}]}
      +                               ]}]}].

      Connections must be opened as follows:

      open(nc_server1,[...]),
      +open(nc_server2,[...]).

      Logging Example 2:

      The following configuration file causes raw logging of all NETCONF traffic in to +one single text file:

      {ct_conn_log,[{ct_netconfc,[{log_type,raw}]}]}.

      The ct_hooks statement must look as follows:

      suite() ->
      +    [{ct_hooks, [{cth_conn_log, []}]}].

      The same ct_hooks statement without the configuration file would cause HTML logging of all NETCONF connections in to the test case HTML log.

      @@ -2052,8 +2052,8 @@

      Edits configuration data.

      By default only the running target is available, unless the server includes :candidate or :startup in its list of capabilities.

      OptParams can be used for specifying optional parameters (default-operation, test-option, or error-option) to be added to the edit-config request. The -value must be a list containing valid simple XML, for example:

      [{'default-operation', ["none"]},
      - {'error-option', ["rollback-on-error"]}]

      If OptParams is not given, the default value [] is used.

      +value must be a list containing valid simple XML, for example:

      [{'default-operation', ["none"]},
      + {'error-option', ["rollback-on-error"]}]

      If OptParams is not given, the default value [] is used.

      /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_property_test.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_property_test.xhtml 2025-05-10 20:19:02.793133197 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_property_test.xhtml 2025-05-10 20:19:02.801133269 +0000 @@ -30,30 +30,30 @@ directory has a subdirectory property_test, where everything needed for the property tests are collected. The usual Erlang application directory structure is assumed.

      A typical Common Test test suite using ct_property_test is organized as -follows:

      -module(my_prop_test_SUITE).
      --compile(export_all).
      +follows:

      -module(my_prop_test_SUITE).
      +-compile(export_all).
       
      --include_lib("common_test/include/ct.hrl").
      +-include_lib("common_test/include/ct.hrl").
       
      -all() -> [prop_ftp_case].
      +all() -> [prop_ftp_case].
       
      -init_per_suite(Config) ->
      -    ct_property_test:init_per_suite(Config).
      +init_per_suite(Config) ->
      +    ct_property_test:init_per_suite(Config).
       
       %%%---- test case
      -prop_ftp_case(Config) ->
      -    ct_property_test:quickcheck(
      -      ftp_simple_client_server:prop_ftp(),
      +prop_ftp_case(Config) ->
      +    ct_property_test:quickcheck(
      +      ftp_simple_client_server:prop_ftp(),
             Config
      -     ).

      and the the property test module (in this example + ).

      and the the property test module (in this example ftp_simple_client_server.erl) as almost a usual property testing module (More -examples are in the User's Guide):

      -module(ftp_simple_client_server).
      --export([prop_ftp/0...]).
      +examples are in the User's Guide):

      -module(ftp_simple_client_server).
      +-export([prop_ftp/0...]).
       
      --include_lib("common_test/include/ct_property_test.hrl").
      +-include_lib("common_test/include/ct_property_test.hrl").
       
      -prop_ftp() ->
      -    ?FORALL( ....
      +
      prop_ftp() -> + ?FORALL( ....
      @@ -755,7 +755,7 @@ 'EQC', 'PROPER' or 'TRIQ' set, depending on which tool that is first found. This could make parts of the Erlang property tests code to be included or excluded with the macro directives -ifdef(Macro). or -ifndef(Macro)..

      The file(s) in the property_test subdirectory could, or should, include the -ct_property_test include file:

      -include_lib("common_test/include/ct_property_test.hrl").

      This included file will:

      • Include the correct tool's include file
      • Set the macro 'MOD_eqc' to the correct module name for the selected tool. +ct_property_test include file:

        -include_lib("common_test/include/ct_property_test.hrl").

        This included file will:

        • Include the correct tool's include file
        • Set the macro 'MOD_eqc' to the correct module name for the selected tool. That is, the macro 'MOD_eqc' is set to either eqc, proper or triq.
        @@ -866,8 +866,8 @@

        Presents the result of stateful (statem) property testing using the aggregate function in PropEr, QuickCheck or other similar property testing tool.

        It is assumed to be called inside the property called by quickcheck/2:

        ...
        -RunResult = run_parallel_commands(?MODULE, Cmds),
        -ct_property_test:present_result(?MODULE, Cmds, RunResult, Config)
        +RunResult = run_parallel_commands(?MODULE, Cmds),
        +ct_property_test:present_result(?MODULE, Cmds, RunResult, Config)
         ...

        See the User's Guide for an example of the usage and of the default printout.

        The StatisticsSpec is a list of the tuples:

        • {Title::string(), CollectFun::fun/1}
        • {Title::string(), FrequencyFun::/0, CollectFun::fun/1}

        Each tuple will produce one table in the order of their places in the list.

        • Title will be the title of one result table

        • CollectFun is called with one argument: the Cmds. It should return a list of the values to be counted. The following pre-defined functions exist:

          • ct_property_test:cmnd_names/1 returns a list of commands (function calls) @@ -877,15 +877,15 @@ about sequential and parallel parts from Tool:parallel_commands/1,2
        • FrequencyFun/0 returns a fun/1 which is supposed to take a list of items as input, and return an iolist which will be printed as the table. Per default, the number of each item is counted and the percentage is printed for each. The -list [a,b,a,a,c] could for example return

          ["a 60%\n","b 20%\n","c 20%\n"]

          which will be printed by the print_fun. The default print_fun will print +list [a,b,a,a,c] could for example return

          ["a 60%\n","b 20%\n","c 20%\n"]

          which will be printed by the print_fun. The default print_fun will print it as:

          a 60%
           b 20%
          -c 20%

        The default StatisticsSpec is:

        • For sequential commands:

          [{"Function calls", fun cmnd_names/1},
          - {"Length of command sequences", fun print_frequency_ranges/0,
          -                                                  fun num_calls/1}]
        • For parallel commands:

          [{"Distribution sequential/parallel", fun sequential_parallel/1},
          - {"Function calls", fun cmnd_names/1},
          - {"Length of command sequences", fun print_frequency_ranges/0,
          -                                                  fun num_calls/1}]
        +c 20%

    The default StatisticsSpec is:

    • For sequential commands:

      [{"Function calls", fun cmnd_names/1},
      + {"Length of command sequences", fun print_frequency_ranges/0,
      +                                                  fun num_calls/1}]
    • For parallel commands:

      [{"Distribution sequential/parallel", fun sequential_parallel/1},
      + {"Function calls", fun cmnd_names/1},
      + {"Length of command sequences", fun print_frequency_ranges/0,
      +                                                  fun num_calls/1}]
    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_property_test_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_property_test_chapter.xhtml 2025-05-10 20:19:02.789133161 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_property_test_chapter.xhtml 2025-05-10 20:19:02.801133269 +0000 @@ -42,51 +42,51 @@ Introductory Example

    Assume that we want to test the lists:sort/1 function.

    We need a property to test the function. In normal way, we create -property_test/ct_prop.erl module in the test directory in our application:

    -module(ct_prop).
    --export([prop_sort/0]).
    +property_test/ct_prop.erl module in the test directory in our application:

    -module(ct_prop).
    +-export([prop_sort/0]).
     
     %%% This will include the .hrl file for the installed testing tool:
    --include_lib("common_test/include/ct_property_test.hrl").
    +-include_lib("common_test/include/ct_property_test.hrl").
     
     %%% The property we want to check:
     %%%   For all possibly unsorted lists,
     %%%   the result of lists:sort/1 is sorted.
    -prop_sort() ->
    -    ?FORALL(UnSorted, list(),
    -            is_sorted(lists:sort(UnSorted))
    -           ).
    +prop_sort() ->
    +    ?FORALL(UnSorted, list(),
    +            is_sorted(lists:sort(UnSorted))
    +           ).
     
     %%% Function to check that a list is sorted:
    -is_sorted([]) ->
    +is_sorted([]) ->
         true;
    -is_sorted([_]) ->
    +is_sorted([_]) ->
         true;
    -is_sorted([H1,H2|SortedTail]) when H1 =< H2 ->
    -    is_sorted([H2|SortedTail]);
    -is_sorted(_) ->
    -    false.

    We also need a CommonTest test suite:

    -module(ct_property_test_SUITE).
    --compile(export_all). % Only in tests!
    +is_sorted([H1,H2|SortedTail]) when H1 =< H2 ->
    +    is_sorted([H2|SortedTail]);
    +is_sorted(_) ->
    +    false.

    We also need a CommonTest test suite:

    -module(ct_property_test_SUITE).
    +-compile(export_all). % Only in tests!
     
    --include_lib("common_test/include/ct.hrl").
    +-include_lib("common_test/include/ct.hrl").
     
    -all() -> [prop_sort
    -         ].
    +all() -> [prop_sort
    +         ].
     
     %%% First prepare Config and compile the property tests for the found tool:
    -init_per_suite(Config) ->
    -    ct_property_test:init_per_suite(Config).
    +init_per_suite(Config) ->
    +    ct_property_test:init_per_suite(Config).
     
    -end_per_suite(Config) ->
    +end_per_suite(Config) ->
         Config.
     
     %%%================================================================
     %%% Test suites
     %%%
    -prop_sort(Config) ->
    -    ct_property_test:quickcheck(
    -      ct_prop:prop_sort(),
    +prop_sort(Config) ->
    +    ct_property_test:quickcheck(
    +      ct_prop:prop_sort(),
           Config
    -     ).

    We run it as usual, for example with ct_run in the OS shell:

    ..../test$ ct_run -suite ct_property_test_SUITE
    +     ).

    We run it as usual, for example with ct_run in the OS shell:

    ..../test$ ct_run -suite ct_property_test_SUITE
     .....
     Common Test: Running make in test directories...
     
    @@ -116,13 +116,13 @@
       A stateful testing example
     
     

    Assume a test that generates some parallel stateful commands, and runs 300 -tests:

    prop_parallel(Config) ->
    -    numtests(300,
    -             ?FORALL(Cmds, parallel_commands(?MODULE),
    +tests:

    prop_parallel(Config) ->
    +    numtests(300,
    +             ?FORALL(Cmds, parallel_commands(?MODULE),
                          begin
    -                         RunResult = run_parallel_commands(?MODULE, Cmds),
    -                         ct_property_test:present_result(?MODULE, Cmds, RunResult, Config)
    -                     end)).

    The ct_property_test:present_result/4 is a help function for printing some + RunResult = run_parallel_commands(?MODULE, Cmds), + ct_property_test:present_result(?MODULE, Cmds, RunResult, Config) + end)).

    The ct_property_test:present_result/4 is a help function for printing some statistics in the CommonTest log file.

    Our example test could for example be a simple test of an ftp server, where we perform get, put and delete requests, some of them in parallel. Per default, the result has three sections:

    *** User 2019-12-11 13:28:17.504 ***
    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_run_cmd.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_run_cmd.xhtml	2025-05-10 20:19:02.789133161 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_run_cmd.xhtml	2025-05-10 20:19:02.801133269 +0000
    @@ -146,10 +146,10 @@
       Run Common Test in Interactive Mode
     
     
     ct_run -shell
    -  [-config ConfigFile1 ConfigFile2 ... ConfigFileN]
    -  [-userconfig CallbackModule1 ConfigString1 and CallbackModule2
    -   ConfigString2 and .. and CallbackModuleN ConfigStringN]
    -  [-decrypt_key Key] | [-decrypt_file KeyFile]

    + [-config ConfigFile1 ConfigFile2 ... ConfigFileN] + [-userconfig CallbackModule1 ConfigString1 and CallbackModule2 + ConfigString2 and .. and CallbackModuleN ConfigStringN] + [-decrypt_key Key] | [-decrypt_file KeyFile]

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_snmp.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_snmp.xhtml 2025-05-10 20:19:02.789133161 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_snmp.xhtml 2025-05-10 20:19:02.801133269 +0000 @@ -45,15 +45,15 @@ Optional.

  • {agent_target_param_def, [term()] | {data_dir_file, rel_path()}} - Optional.

  • Parameter MgrAgentConfName in the functions is to be a name you allocate in your test suite using a require statement. Example (where -MgrAgentConfName = snmp_mgr_agent):

    suite() -> [{require, snmp_mgr_agent, snmp}].

    or

    ct:require(snmp_mgr_agent, snmp).

    Notice that USM users are needed for SNMPv3 configuration and are not to be +MgrAgentConfName = snmp_mgr_agent):

    suite() -> [{require, snmp_mgr_agent, snmp}].

    or

    ct:require(snmp_mgr_agent, snmp).

    Notice that USM users are needed for SNMPv3 configuration and are not to be confused with users.

    SNMP traps, inform, and report messages are handled by the user callback module. For details, see the SNMP application.

    It is recommended to use the .hrl files created by the Erlang/OTP MIB compiler to define the Object Identifiers (OIDs). For example, to get the Erlang node -name from erlNodeTable in the OTP-MIB:

    Oid = ?erlNodeEntry ++ [?erlNodeName, 1]

    Furthermore, values can be set for SNMP application configuration parameters, +name from erlNodeTable in the OTP-MIB:

    Oid = ?erlNodeEntry ++ [?erlNodeName, 1]

    Furthermore, values can be set for SNMP application configuration parameters, config, server, net_if, and so on (for a list of valid parameters and types, see the User's Guide for the SNMP application). -This is done by defining a configuration data variable on the following form:

    {snmp_app, [{manager, [snmp_app_manager_params()]},
    -            {agent, [snmp_app_agent_params()]}]}.

    A name for the data must be allocated in the suite using require (see the +This is done by defining a configuration data variable on the following form:

    {snmp_app, [{manager, [snmp_app_manager_params()]},
    +            {agent, [snmp_app_agent_params()]}]}.

    A name for the data must be allocated in the suite using require (see the example above). Pass this name as argument SnmpAppConfName to ct_snmp:start/3. ct_snmp specifies default values for some SNMP application configuration parameters (such as {verbosity,trace} for /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_ssh.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_ssh.xhtml 2025-05-10 20:19:02.789133161 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_ssh.xhtml 2025-05-10 20:19:02.801133269 +0000 @@ -28,14 +28,14 @@ that have been started on existing SSH connections (that is, when the original connection type is ssh). Whenever the connection type is sftp, use the SSH connection reference only.

    The following options are valid for specifying an SSH/SFTP connection (that is, -can be used as configuration elements):

    [{ConnType, Addr},
    - {port, Port},
    - {user, UserName}
    - {password, Pwd}
    - {user_dir, String}
    - {public_key_alg, PubKeyAlg}
    - {connect_timeout, Timeout}
    - {key_cb, KeyCallbackMod}]

    ConnType = ssh | sftp.

    For other types, see ssh.

    All time-out parameters in ct_ssh functions are values in milliseconds.

    +can be used as configuration elements):

    [{ConnType, Addr},
    + {port, Port},
    + {user, UserName}
    + {password, Pwd}
    + {user_dir, String}
    + {public_key_alg, PubKeyAlg}
    + {connect_timeout, Timeout}
    + {key_cb, KeyCallbackMod}]

    ConnType = ssh | sftp.

    For other types, see ssh.

    All time-out parameters in ct_ssh functions are values in milliseconds.

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_telnet.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_telnet.xhtml 2025-05-10 20:19:02.789133161 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/ct_telnet.xhtml 2025-05-10 20:19:02.801133269 +0000 @@ -31,14 +31,14 @@ true
  • Polling limit (max number of times to poll to get a remaining string terminated) = 0
  • Polling interval (sleep time between polls) = 1 second
  • The TCP_NODELAY option for the telnet socket is disabled (set to false) per default
  • These parameters can be modified by the user with the following configuration -term:

    {telnet_settings, [{connect_timeout,Millisec},
    -                   {command_timeout,Millisec},
    -                   {reconnection_attempts,N},
    -                   {reconnection_interval,Millisec},
    -                   {keep_alive,Bool},
    -                   {poll_limit,N},
    -                   {poll_interval,Millisec},
    -                   {tcp_nodelay,Bool}]}.

    Millisec = integer(), N = integer()

    Enter the telnet_settings term in a configuration file included in the test +term:

    {telnet_settings, [{connect_timeout,Millisec},
    +                   {command_timeout,Millisec},
    +                   {reconnection_attempts,N},
    +                   {reconnection_interval,Millisec},
    +                   {keep_alive,Bool},
    +                   {poll_limit,N},
    +                   {poll_interval,Millisec},
    +                   {tcp_nodelay,Bool}]}.

    Millisec = integer(), N = integer()

    Enter the telnet_settings term in a configuration file included in the test and ct_telnet retrieves the information automatically.

    keep_alive can be specified per connection, if necessary. For details, see unix_telnet.

    @@ -53,8 +53,8 @@ such as expect/3. However, ct_telnet can be configured to use a special purpose event handler, implemented in ct_conn_log_h, for logging all Telnet traffic. To use this handler, install a Common Test hook named -cth_conn_log. Example (using the test suite information function):

    suite() ->
    -    [{ct_hooks, [{cth_conn_log, [{conn_mod(),hook_options()}]}]}].

    conn_mod() is the name of the Common Test module implementing the connection +cth_conn_log. Example (using the test suite information function):

    suite() ->
    +    [{ct_hooks, [{cth_conn_log, [{conn_mod(),hook_options()}]}]}].

    conn_mod() is the name of the Common Test module implementing the connection protocol, that is, ct_telnet.

    The cth_conn_log hook performs unformatted logging of Telnet data to a separate text file. All Telnet communication is captured and printed, including any data sent from the server. The link to this text file is located at the top @@ -71,15 +71,15 @@ disabled, which results with no prefix data. If the value is set to full prefix contains timestamp and additonal information. If the value is set to short prefix includes only human readable timestamp.

    All cth_conn_log hook options described can also be specified in a -configuration file with configuration variable ct_conn_log.

    Example:

    {ct_conn_log, [{ct_telnet,[{log_type,raw},
    -                           {hosts,[key_or_name()]}]}]}

    Note

    Hook options specified in a configuration file overwrite any hard-coded hook +configuration file with configuration variable ct_conn_log.

    Example:

    {ct_conn_log, [{ct_telnet,[{log_type,raw},
    +                           {hosts,[key_or_name()]}]}]}

    Note

    Hook options specified in a configuration file overwrite any hard-coded hook options in the test suite.

    Logging Example:

    The following ct_hooks statement causes printing of Telnet traffic to separate logs for the connections server1 and server2. Traffic for any other -connections is logged in the default Telnet log.

    suite() ->
    -    [{ct_hooks,
    -      [{cth_conn_log, [{ct_telnet,[{hosts,[server1,server2]}]}]}]}].

    As previously explained, this specification can also be provided by an entry -like the following in a configuration file:

    {ct_conn_log, [{ct_telnet,[{hosts,[server1,server2]}]}]}.

    In this case the ct_hooks statement in the test suite can look as follows:

    suite() ->
    -    [{ct_hooks, [{cth_conn_log, []}]}].

    +connections is logged in the default Telnet log.

    suite() ->
    +    [{ct_hooks,
    +      [{cth_conn_log, [{ct_telnet,[{hosts,[server1,server2]}]}]}]}].

    As previously explained, this specification can also be provided by an entry +like the following in a configuration file:

    {ct_conn_log, [{ct_telnet,[{hosts,[server1,server2]}]}]}.

    In this case the ct_hooks statement in the test suite can look as follows:

    suite() ->
    +    [{ct_hooks, [{cth_conn_log, []}]}].

    @@ -772,9 +772,9 @@ instead of only one Match. Also HaltReason is returned.

  • sequence - All patterns must be matched in a sequence. A match is not concluded until all patterns are matched. This option can be interrupted by one or more HaltPatterns. MatchList is always returned, that is, a list of -Match instead of only one Match. Also HaltReason is returned.

  • Example 1:

    expect(Connection,[{abc,"ABC"},{xyz,"XYZ"}],[sequence,{halt,[{nnn,"NNN"}]}])

    First this tries to match "ABC", and then "XYZ", but if "NNN" appears, the +Match instead of only one Match. Also HaltReason is returned.

    Example 1:

    expect(Connection,[{abc,"ABC"},{xyz,"XYZ"}],[sequence,{halt,[{nnn,"NNN"}]}])

    First this tries to match "ABC", and then "XYZ", but if "NNN" appears, the function returns {error,{nnn,["NNN"]}}. If both "ABC" and "XYZ" are -matched, the function returns {ok,[AbcMatch,XyzMatch]}.

    Example 2:

    expect(Connection,[{abc,"ABC"},{xyz,"XYZ"}],[{repeat,2},{halt,[{nnn,"NNN"}]}])

    This tries to match "ABC" or "XYZ" twice. If "NNN" appears, the function +matched, the function returns {ok,[AbcMatch,XyzMatch]}.

    Example 2:

    expect(Connection,[{abc,"ABC"},{xyz,"XYZ"}],[{repeat,2},{halt,[{nnn,"NNN"}]}])

    This tries to match "ABC" or "XYZ" twice. If "NNN" appears, the function returns HaltReason = {nnn,["NNN"]}.

    Options repeat and sequence can be combined to match a sequence multiple times.

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/dependencies_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/dependencies_chapter.xhtml 2025-05-10 20:19:02.789133161 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/dependencies_chapter.xhtml 2025-05-10 20:19:02.801133269 +0000 @@ -56,65 +56,65 @@ start and stop functionality separately.) The configuration can also be implemented as a common function, maybe grouped with the start function. Finally, the testing of connecting and disconnecting a client can be grouped -into one test case. The resulting suite can look as follows:

    -module(my_server_SUITE).
    --compile(export_all).
    --include_lib("ct.hrl").
    +into one test case. The resulting suite can look as follows:

    -module(my_server_SUITE).
    +-compile(export_all).
    +-include_lib("ct.hrl").
     
     %%% init and end functions...
     
    -suite() -> [{require,my_server_cfg}].
    +suite() -> [{require,my_server_cfg}].
     
    -init_per_testcase(start_and_stop, Config) ->
    +init_per_testcase(start_and_stop, Config) ->
         Config;
     
    -init_per_testcase(config, Config) ->
    -    [{server_pid,start_server()} | Config];
    +init_per_testcase(config, Config) ->
    +    [{server_pid,start_server()} | Config];
     
    -init_per_testcase(_, Config) ->
    -    ServerPid = start_server(),
    -    configure_server(),
    -    [{server_pid,ServerPid} | Config].
    +init_per_testcase(_, Config) ->
    +    ServerPid = start_server(),
    +    configure_server(),
    +    [{server_pid,ServerPid} | Config].
     
    -end_per_testcase(start_and_stop, _) ->
    +end_per_testcase(start_and_stop, _) ->
         ok;
     
    -end_per_testcase(_, Config) ->
    -    ServerPid = proplists:get_value(server_pid, Config),
    -    stop_server(ServerPid).
    +end_per_testcase(_, Config) ->
    +    ServerPid = proplists:get_value(server_pid, Config),
    +    stop_server(ServerPid).
     
     %%% test cases...
     
    -all() -> [start_and_stop, config, connect_and_disconnect].
    +all() -> [start_and_stop, config, connect_and_disconnect].
     
     %% test that starting and stopping works
    -start_and_stop(_) ->
    -    ServerPid = start_server(),
    -    stop_server(ServerPid).
    +start_and_stop(_) ->
    +    ServerPid = start_server(),
    +    stop_server(ServerPid).
     
     %% configuration test
    -config(Config) ->
    -    ServerPid = proplists:get_value(server_pid, Config),
    -    configure_server(ServerPid).
    +config(Config) ->
    +    ServerPid = proplists:get_value(server_pid, Config),
    +    configure_server(ServerPid).
     
     %% test connecting and disconnecting client
    -connect_and_disconnect(Config) ->
    -    ServerPid = proplists:get_value(server_pid, Config),
    -    {ok,SessionId} = my_server:connect(ServerPid),
    -    ok = my_server:disconnect(ServerPid, SessionId).
    +connect_and_disconnect(Config) ->
    +    ServerPid = proplists:get_value(server_pid, Config),
    +    {ok,SessionId} = my_server:connect(ServerPid),
    +    ok = my_server:disconnect(ServerPid, SessionId).
     
     %%% common functions...
     
    -start_server() ->
    -    {ok,ServerPid} = my_server:start(),
    +start_server() ->
    +    {ok,ServerPid} = my_server:start(),
         ServerPid.
     
    -stop_server(ServerPid) ->
    -    ok = my_server:stop(),
    +stop_server(ServerPid) ->
    +    ok = my_server:stop(),
         ok.
     
    -configure_server(ServerPid) ->
    -    ServerCfgData = ct:get_config(my_server_cfg),
    -    ok = my_server:configure(ServerPid, ServerCfgData),
    +configure_server(ServerPid) ->
    +    ServerCfgData = ct:get_config(my_server_cfg),
    +    ok = my_server:configure(ServerPid, ServerCfgData),
         ok.

    @@ -142,40 +142,40 @@ data is to be saved by finction end_per_suite and read by function init_per_suite in the suite that follows. When passing data between suites, Saver carries the name -of the test suite.

    Example:

    -module(server_b_SUITE).
    --compile(export_all).
    --include_lib("ct.hrl").
    +of the test suite.

    Example:

    -module(server_b_SUITE).
    +-compile(export_all).
    +-include_lib("ct.hrl").
     
     %%% init and end functions...
     
    -init_per_suite(Config) ->
    +init_per_suite(Config) ->
         %% read config saved by previous test suite
    -    {server_a_SUITE,OldConfig} = proplists:get_value(saved_config, Config),
    +    {server_a_SUITE,OldConfig} = proplists:get_value(saved_config, Config),
         %% extract server identity (comes from server_a_SUITE)
    -    ServerId = proplists:get_value(server_id, OldConfig),
    -    SessionId = connect_to_server(ServerId),
    -    [{ids,{ServerId,SessionId}} | Config].
    +    ServerId = proplists:get_value(server_id, OldConfig),
    +    SessionId = connect_to_server(ServerId),
    +    [{ids,{ServerId,SessionId}} | Config].
     
    -end_per_suite(Config) ->
    +end_per_suite(Config) ->
         %% save config for server_c_SUITE (session_id and server_id)
    -    {save_config,Config}
    +    {save_config,Config}
     
     %%% test cases...
     
    -all() -> [allocate, deallocate].
    +all() -> [allocate, deallocate].
     
    -allocate(Config) ->
    -    {ServerId,SessionId} = proplists:get_value(ids, Config),
    -    {ok,Handle} = allocate_resource(ServerId, SessionId),
    +allocate(Config) ->
    +    {ServerId,SessionId} = proplists:get_value(ids, Config),
    +    {ok,Handle} = allocate_resource(ServerId, SessionId),
         %% save handle for deallocation test
    -    NewConfig = [{handle,Handle}],
    -    {save_config,NewConfig}.
    +    NewConfig = [{handle,Handle}],
    +    {save_config,NewConfig}.
     
    -deallocate(Config) ->
    -    {ServerId,SessionId} = proplists:get_value(ids, Config),
    -    {allocate,OldConfig} = proplists:get_value(saved_config, Config),
    -    Handle = proplists:get_value(handle, OldConfig),
    -    ok = deallocate_resource(ServerId, SessionId, Handle).

    To save Config data from a test case that is to be skipped, return tuple +deallocate(Config) -> + {ServerId,SessionId} = proplists:get_value(ids, Config), + {allocate,OldConfig} = proplists:get_value(saved_config, Config), + Handle = proplists:get_value(handle, OldConfig), + ok = deallocate_resource(ServerId, SessionId, Handle).

    To save Config data from a test case that is to be skipped, return tuple {skip_and_save,Reason,ConfigList}.

    The result is that the test case is skipped with Reason printed to the log file (as described earlier) and ConfigList is saved for the next test case. ConfigList can be read using proplists:get_value(saved_config, Config), as @@ -195,22 +195,22 @@ property. Test case groups are defined through function groups/0 in the test suite (for details, see section Test Case Groups.

    For example, to ensure that if allocate in server_b_SUITE crashes, -deallocate is skipped, the following sequence can be defined:

    groups() -> [{alloc_and_dealloc, [sequence], [alloc,dealloc]}].

    Assume that the suite contains the test case get_resource_status that is -independent of the other two cases, then function all can look as follows:

    all() -> [{group,alloc_and_dealloc}, get_resource_status].

    If alloc succeeds, dealloc is also executed. If alloc fails however, +deallocate is skipped, the following sequence can be defined:

    groups() -> [{alloc_and_dealloc, [sequence], [alloc,dealloc]}].

    Assume that the suite contains the test case get_resource_status that is +independent of the other two cases, then function all can look as follows:

    all() -> [{group,alloc_and_dealloc}, get_resource_status].

    If alloc succeeds, dealloc is also executed. If alloc fails however, dealloc is not executed but marked as SKIPPED in the HTML log. get_resource_status runs no matter what happens to the alloc_and_dealloc cases.

    Test cases in a sequence are executed in order until all succeed or one fails. If one fails, all following cases in the sequence are skipped. The cases in the sequence that have succeeded up to that point are reported as successful in the -log. Any number of sequences can be specified.

    Example:

    groups() -> [{scenarioA, [sequence], [testA1, testA2]},
    -             {scenarioB, [sequence], [testB1, testB2, testB3]}].
    +log. Any number of sequences can be specified.

    Example:

    groups() -> [{scenarioA, [sequence], [testA1, testA2]},
    +             {scenarioB, [sequence], [testB1, testB2, testB3]}].
     
    -all() -> [test1,
    +all() -> [test1,
               test2,
    -          {group,scenarioA},
    +          {group,scenarioA},
               test3,
    -          {group,scenarioB},
    -          test4].

    A sequence group can have subgroups. Such subgroups can have any property, that + {group,scenarioB}, + test4].

    A sequence group can have subgroups. Such subgroups can have any property, that is, they are not required to also be sequences. If you want the status of the subgroup to affect the sequence on the level above, return {return_group_result,Status} from /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/event_handler_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/event_handler_chapter.xhtml 2025-05-10 20:19:02.789133161 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/event_handler_chapter.xhtml 2025-05-10 20:19:02.801133269 +0000 @@ -63,12 +63,12 @@ ct_run -event_handler_init instead of -event_handler.

    Note

    All event handler modules must have gen_event behavior. These modules must be precompiled and their locations must be added explicitly to the Erlang code server search path (as in the previous example).

    An event_handler tuple in argument Opts has the following definition (see -ct:run_test/1):

    {event_handler,EventHandlers}
    +ct:run_test/1):

    {event_handler,EventHandlers}
     
    -EventHandlers = EH | [EH]
    -EH = atom() | {atom(),InitArgs} | {[atom()],InitArgs}
    -InitArgs = [term()]

    In the following example, two event handlers for the my_SUITE test are -installed:

    1> ct:run_test([{suite,"test/my_SUITE"},{event_handler,[my_evh1,{my_evh2,[node()]}]}]).

    Event handler my_evh1 is started with [] as argument to the init function. +EventHandlers = EH | [EH] +EH = atom() | {atom(),InitArgs} | {[atom()],InitArgs} +InitArgs = [term()]

    In the following example, two event handlers for the my_SUITE test are +installed:

    1> ct:run_test([{suite,"test/my_SUITE"},{event_handler,[my_evh1,{my_evh2,[node()]}]}]).

    Event handler my_evh1 is started with [] as argument to the init function. Event handler my_evh2 is started with the name of the current node in the init argument list.

    Event handlers can also be plugged in using one of the following test specification terms:

    • {event_handler, EventHandlers}
    • {event_handler, EventHandlers, InitArgs}
    • {event_handler, NodeRefs, EventHandlers}
    • {event_handler, NodeRefs, EventHandlers, InitArgs}

    EventHandlers is a list of module names. Before a test session starts, the /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/example_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/example_chapter.xhtml 2025-05-10 20:19:02.789133161 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/example_chapter.xhtml 2025-05-10 20:19:02.801133269 +0000 @@ -26,19 +26,19 @@ Test Suite Example

    -

    The following example test suite shows some tests of a database server:

    -module(db_data_type_SUITE).
    +

    The following example test suite shows some tests of a database server:

    -module(db_data_type_SUITE).
     
    --include_lib("common_test/include/ct.hrl").
    +-include_lib("common_test/include/ct.hrl").
     
     %% Test server callbacks
    --export([suite/0, all/0,
    +-export([suite/0, all/0,
              init_per_suite/1, end_per_suite/1,
    -         init_per_testcase/2, end_per_testcase/2]).
    +         init_per_testcase/2, end_per_testcase/2]).
     
     %% Test cases
    --export([string/1, integer/1]).
    +-export([string/1, integer/1]).
     
    --define(CONNECT_STR, "DSN=sqlserver;UID=alladin;PWD=sesame").
    +-define(CONNECT_STR, "DSN=sqlserver;UID=alladin;PWD=sesame").
     
     %%--------------------------------------------------------------------
     %% COMMON TEST CALLBACK FUNCTIONS
    @@ -53,8 +53,8 @@
     %% Description: Returns list of tuples to set default properties
     %%              for the suite.
     %%--------------------------------------------------------------------
    -suite() ->
    -    [{timetrap,{minutes,1}}].
    +suite() ->
    +    [{timetrap,{minutes,1}}].
     
     %%--------------------------------------------------------------------
     %% Function: init_per_suite(Config0) -> Config1
    @@ -64,10 +64,10 @@
     %%
     %% Description: Initialization before the suite.
     %%--------------------------------------------------------------------
    -init_per_suite(Config) ->
    -    {ok, Ref} = db:connect(?CONNECT_STR, []),
    -    TableName = db_lib:unique_table_name(),
    -    [{con_ref, Ref },{table_name, TableName}| Config].
    +init_per_suite(Config) ->
    +    {ok, Ref} = db:connect(?CONNECT_STR, []),
    +    TableName = db_lib:unique_table_name(),
    +    [{con_ref, Ref },{table_name, TableName}| Config].
     
     %%--------------------------------------------------------------------
     %% Function: end_per_suite(Config) -> term()
    @@ -77,9 +77,9 @@
     %%
     %% Description: Cleanup after the suite.
     %%--------------------------------------------------------------------
    -end_per_suite(Config) ->
    -    Ref = proplists:get_value(con_ref, Config),
    -    db:disconnect(Ref),
    +end_per_suite(Config) ->
    +    Ref = proplists:get_value(con_ref, Config),
    +    db:disconnect(Ref),
         ok.
     
     %%--------------------------------------------------------------------
    @@ -92,10 +92,10 @@
     %%
     %% Description: Initialization before each test case.
     %%--------------------------------------------------------------------
    -init_per_testcase(Case, Config) ->
    -    Ref = proplists:get_value(con_ref, Config),
    -    TableName = proplists:get_value(table_name, Config),
    -    ok = db:create_table(Ref, TableName, table_type(Case)),
    +init_per_testcase(Case, Config) ->
    +    Ref = proplists:get_value(con_ref, Config),
    +    TableName = proplists:get_value(table_name, Config),
    +    ok = db:create_table(Ref, TableName, table_type(Case)),
         Config.
     
     %%--------------------------------------------------------------------
    @@ -108,10 +108,10 @@
     %%
     %% Description: Cleanup after each test case.
     %%--------------------------------------------------------------------
    -end_per_testcase(_Case, Config) ->
    -    Ref = proplists:get_value(con_ref, Config),
    -    TableName = proplists:get_value(table_name, Config),
    -    ok = db:delete_table(Ref, TableName),
    +end_per_testcase(_Case, Config) ->
    +    Ref = proplists:get_value(con_ref, Config),
    +    TableName = proplists:get_value(table_name, Config),
    +    ok = db:delete_table(Ref, TableName),
         ok.
     
     %%--------------------------------------------------------------------
    @@ -126,28 +126,28 @@
     %% Description: Returns the list of groups and test cases that
     %%              are to be executed.
     %%--------------------------------------------------------------------
    -all() ->
    -    [string, integer].
    +all() ->
    +    [string, integer].
     
     
     %%--------------------------------------------------------------------
     %% TEST CASES
     %%--------------------------------------------------------------------
     
    -string(Config) ->
    -    insert_and_lookup(dummy_key, "Dummy string", Config).
    +string(Config) ->
    +    insert_and_lookup(dummy_key, "Dummy string", Config).
     
    -integer(Config) ->
    -    insert_and_lookup(dummy_key, 42, Config).
    +integer(Config) ->
    +    insert_and_lookup(dummy_key, 42, Config).
     
     
    -insert_and_lookup(Key, Value, Config) ->
    -    Ref = proplists:get_value(con_ref, Config),
    -    TableName = proplists:get_value(table_name, Config),
    -    ok = db:insert(Ref, TableName, Key, Value),
    -    [Value] = db:lookup(Ref, TableName, Key),
    -    ok = db:delete(Ref, TableName, Key),
    -    [] = db:lookup(Ref, TableName, Key),
    +insert_and_lookup(Key, Value, Config) ->
    +    Ref = proplists:get_value(con_ref, Config),
    +    TableName = proplists:get_value(table_name, Config),
    +    ok = db:insert(Ref, TableName, Key, Value),
    +    [Value] = db:lookup(Ref, TableName, Key),
    +    ok = db:delete(Ref, TableName, Key),
    +    [] = db:lookup(Ref, TableName, Key),
         ok.

    @@ -165,12 +165,12 @@ %%% %%% Created : %%%------------------------------------------------------------------- --module(example_SUITE). +-module(example_SUITE). %% Note: This directive should only be used in test suites. --compile(export_all). +-compile(export_all). --include_lib("common_test/include/ct.hrl"). +-include_lib("common_test/include/ct.hrl"). %%-------------------------------------------------------------------- %% COMMON TEST CALLBACK FUNCTIONS @@ -188,8 +188,8 @@ %% Note: The suite/0 function is only meant to be used to return %% default data values, not perform any other operations. %%-------------------------------------------------------------------- -suite() -> - [{timetrap,{minutes,10}}]. +suite() -> + [{timetrap,{minutes,10}}]. %%-------------------------------------------------------------------- %% Function: init_per_suite(Config0) -> @@ -205,7 +205,7 @@ %% Note: This function is free to add any key/value pairs to the Config %% variable, but should NOT alter/remove any existing entries. %%-------------------------------------------------------------------- -init_per_suite(Config) -> +init_per_suite(Config) -> Config. %%-------------------------------------------------------------------- @@ -216,7 +216,7 @@ %% %% Description: Cleanup after the suite. %%-------------------------------------------------------------------- -end_per_suite(_Config) -> +end_per_suite(_Config) -> ok. %%-------------------------------------------------------------------- @@ -232,7 +232,7 @@ %% %% Description: Initialization before each test case group. %%-------------------------------------------------------------------- -init_per_group(_GroupName, Config) -> +init_per_group(_GroupName, Config) -> Config. %%-------------------------------------------------------------------- @@ -246,7 +246,7 @@ %% %% Description: Cleanup after each test case group. %%-------------------------------------------------------------------- -end_per_group(_GroupName, _Config) -> +end_per_group(_GroupName, _Config) -> ok. /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/getting_started_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/getting_started_chapter.xhtml 2025-05-10 20:19:02.789133161 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/getting_started_chapter.xhtml 2025-05-10 20:19:02.801133269 +0000 @@ -64,14 +64,14 @@ the test suite module implements callback functions (mandatory or optional) for various purposes, for example:

    • Init/end configuration function for the test suite
    • Init/end configuration function for a test case
    • Init/end configuration function for a test case group
    • Test cases

    The configuration functions are optional. The following example is a test suite without configuration functions, including one simple test case, to check that -module mymod exists (that is, can be successfully loaded by the code server):

    -module(my1st_SUITE).
    --compile(export_all).
    +module mymod exists (that is, can be successfully loaded by the code server):

    -module(my1st_SUITE).
    +-compile(export_all).
     
    -all() ->
    -    [mod_exists].
    +all() ->
    +    [mod_exists].
     
    -mod_exists(_) ->
    -    {module,mymod} = code:load_file(mymod).

    If the operation fails, a bad match error occurs that terminates the test case.

    +mod_exists(_) -> + {module,mymod} = code:load_file(mymod).

    If the operation fails, a bad match error occurs that terminates the test case.

    @@ -84,33 +84,33 @@ through configuration functions on "lower level"). The data flow looks as follows:

    Configuration Data Flow in a Suite

    The following example shows a test suite that uses configuration functions to open and close a log file for the test cases (an operation that is unnecessary -and irrelevant to perform by each test case):

    -module(check_log_SUITE).
    --export([all/0, init_per_suite/1, end_per_suite/1]).
    --export([check_restart_result/1, check_no_errors/1]).
    +and irrelevant to perform by each test case):

    -module(check_log_SUITE).
    +-export([all/0, init_per_suite/1, end_per_suite/1]).
    +-export([check_restart_result/1, check_no_errors/1]).
     
    --define(value(Key,Config), proplists:get_value(Key,Config)).
    +-define(value(Key,Config), proplists:get_value(Key,Config)).
     
    -all() -> [check_restart_result, check_no_errors].
    +all() -> [check_restart_result, check_no_errors].
     
    -init_per_suite(InitConfigData) ->
    -    [{logref,open_log()} | InitConfigData].
    +init_per_suite(InitConfigData) ->
    +    [{logref,open_log()} | InitConfigData].
     
    -end_per_suite(ConfigData) ->
    -    close_log(?value(logref, ConfigData)).
    +end_per_suite(ConfigData) ->
    +    close_log(?value(logref, ConfigData)).
     
    -check_restart_result(ConfigData) ->
    -    TestData = read_log(restart, ?value(logref, ConfigData)),
    -    {match,_Line} = search_for("restart successful", TestData).
    +check_restart_result(ConfigData) ->
    +    TestData = read_log(restart, ?value(logref, ConfigData)),
    +    {match,_Line} = search_for("restart successful", TestData).
     
    -check_no_errors(ConfigData) ->
    -    TestData = read_log(all, ?value(logref, ConfigData)),
    -    case search_for("error", TestData) of
    -        {match,Line} -> ct:fail({error_found_in_log,Line});
    +check_no_errors(ConfigData) ->
    +    TestData = read_log(all, ?value(logref, ConfigData)),
    +    case search_for("error", TestData) of
    +        {match,Line} -> ct:fail({error_found_in_log,Line});
             nomatch -> ok
         end.

    The test cases verify, by parsing a log file, that our SUT has performed a successful restart and that no unexpected errors are printed.

    To execute the test cases in the recent test suite, type the following on the UNIX/Linux command line (assuming that the suite module is in the current -working directory):

    $ ct_run -dir .

    or:

    $ ct_run -suite check_log_SUITE

    To use the Erlang shell to run our test, you can evaluate the following call:

    1> ct:run_test([{dir, "."}]).

    or:

    1> ct:run_test([{suite, "check_log_SUITE"}]).

    The result from running the test is printed in log files in HTML format (stored +working directory):

    $ ct_run -dir .

    or:

    $ ct_run -suite check_log_SUITE

    To use the Erlang shell to run our test, you can evaluate the following call:

    1> ct:run_test([{dir, "."}]).

    or:

    1> ct:run_test([{suite, "check_log_SUITE"}]).

    The result from running the test is printed in log files in HTML format (stored in unique log directories on a different level). The following illustration shows the log file structure:

    HTML Log File Structure

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/run_test_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/run_test_chapter.xhtml 2025-05-10 20:19:02.785133124 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/run_test_chapter.xhtml 2025-05-10 20:19:02.797133233 +0000 @@ -174,7 +174,7 @@

    With the ct_run flag, or ct:run_test/1 option group, one or more test case groups can be specified, optionally in combination with specific test cases. The -syntax for specifying groups on the command line is as follows:

    $ ct_run -group <group_names_or_paths> [-case <cases>]

    The syntax in the Erlang shell is as follows:

    1> ct:run_test([{group,GroupsNamesOrPaths}, {case,Cases}]).

    Parameter group_names_or_paths specifies one or more group names and/or one or +syntax for specifying groups on the command line is as follows:

    $ ct_run -group <group_names_or_paths> [-case <cases>]

    The syntax in the Erlang shell is as follows:

    1> ct:run_test([{group,GroupsNamesOrPaths}, {case,Cases}]).

    Parameter group_names_or_paths specifies one or more group names and/or one or more group paths. At startup, Common Test searches for matching groups in the group definitions tree (that is, the list returned from Suite:groups/0; for details, see section Test Case Groups.

    Given a group name, say g, Common Test searches for all paths leading to @@ -206,30 +206,30 @@ paths if an incomplete group path is specified.

    Note

    Group names and group paths can be combined with parameter group_names_or_paths. Each element is treated as an individual specification in combination with parameter cases. The following examples illustrates -this.

    Examples:

    -module(x_SUITE).
    +this.

    Examples:

    -module(x_SUITE).
     ...
     %% The group definitions:
    -groups() ->
    -  [{top1,[],[tc11,tc12,
    -             {sub11,[],[tc12,tc13]},
    -             {sub12,[],[tc14,tc15,
    -       		 {sub121,[],[tc12,tc16]}]}]},
    -
    -   {top2,[],[{group,sub21},{group,sub22}]},
    -   {sub21,[],[tc21,{group,sub2X2}]},
    -   {sub22,[],[{group,sub221},tc21,tc22,{group,sub2X2}]},
    -   {sub221,[],[tc21,tc23]},
    -   {sub2X2,[],[tc21,tc24]}].

    The following executes two tests, one for all cases and all subgroups under -top1, and one for all under top2:

    $ ct_run -suite "x_SUITE" -group all
    1> ct:run_test([{suite,"x_SUITE"}, {group,all}]).

    Using -group top1 top2, or {group,[top1,top2]} gives the same result.

    The following executes one test for all cases and subgroups under top1:

    $ ct_run -suite "x_SUITE" -group top1
    1> ct:run_test([{suite,"x_SUITE"}, {group,[top1]}]).

    The following runs a test executing tc12 in top1 and any subgroup under -top1 where it can be found (sub11 and sub121):

    $ ct_run -suite "x_SUITE" -group top1 -case tc12
    1> ct:run_test([{suite,"x_SUITE"}, {group,[top1]}, {testcase,[tc12]}]).

    The following executes tc12 only in group top1:

    $ ct_run -suite "x_SUITE" -group [top1] -case tc12
    1> ct:run_test([{suite,"x_SUITE"}, {group,[[top1]]}, {testcase,[tc12]}]).

    The following searches top1 and all its subgroups for tc16 resulting in that -this test case executes in group sub121:

    $ ct_run -suite "x_SUITE" -group top1 -case tc16
    1> ct:run_test([{suite,"x_SUITE"}, {group,[top1]}, {testcase,[tc16]}]).

    Using the specific path -group [sub121] or {group,[[sub121]]} gives the same +groups() -> + [{top1,[],[tc11,tc12, + {sub11,[],[tc12,tc13]}, + {sub12,[],[tc14,tc15, + {sub121,[],[tc12,tc16]}]}]}, + + {top2,[],[{group,sub21},{group,sub22}]}, + {sub21,[],[tc21,{group,sub2X2}]}, + {sub22,[],[{group,sub221},tc21,tc22,{group,sub2X2}]}, + {sub221,[],[tc21,tc23]}, + {sub2X2,[],[tc21,tc24]}].

    The following executes two tests, one for all cases and all subgroups under +top1, and one for all under top2:

    $ ct_run -suite "x_SUITE" -group all
    1> ct:run_test([{suite,"x_SUITE"}, {group,all}]).

    Using -group top1 top2, or {group,[top1,top2]} gives the same result.

    The following executes one test for all cases and subgroups under top1:

    $ ct_run -suite "x_SUITE" -group top1
    1> ct:run_test([{suite,"x_SUITE"}, {group,[top1]}]).

    The following runs a test executing tc12 in top1 and any subgroup under +top1 where it can be found (sub11 and sub121):

    $ ct_run -suite "x_SUITE" -group top1 -case tc12
    1> ct:run_test([{suite,"x_SUITE"}, {group,[top1]}, {testcase,[tc12]}]).

    The following executes tc12 only in group top1:

    $ ct_run -suite "x_SUITE" -group [top1] -case tc12
    1> ct:run_test([{suite,"x_SUITE"}, {group,[[top1]]}, {testcase,[tc12]}]).

    The following searches top1 and all its subgroups for tc16 resulting in that +this test case executes in group sub121:

    $ ct_run -suite "x_SUITE" -group top1 -case tc16
    1> ct:run_test([{suite,"x_SUITE"}, {group,[top1]}, {testcase,[tc16]}]).

    Using the specific path -group [sub121] or {group,[[sub121]]} gives the same result in this example.

    The following executes two tests, one including all cases and subgroups under -sub12, and one with only the test cases in sub12:

    $ ct_run -suite "x_SUITE" -group sub12 [sub12]
    1> ct:run_test([{suite,"x_SUITE"}, {group,[sub12,[sub12]]}]).

    In the following example, Common Test finds and executes two tests, one for +sub12, and one with only the test cases in sub12:

    $ ct_run -suite "x_SUITE" -group sub12 [sub12]
    1> ct:run_test([{suite,"x_SUITE"}, {group,[sub12,[sub12]]}]).

    In the following example, Common Test finds and executes two tests, one for the path from top2 to sub2X2 through sub21, and one from top2 to -sub2X2 through sub22:

    $ ct_run -suite "x_SUITE" -group sub2X2
    1> ct:run_test([{suite,"x_SUITE"}, {group,[sub2X2]}]).

    In the following example, by specifying the unique path +sub2X2 through sub22:

    $ ct_run -suite "x_SUITE" -group sub2X2
    1> ct:run_test([{suite,"x_SUITE"}, {group,[sub2X2]}]).

    In the following example, by specifying the unique path top2 -> sub21 -> sub2X2, only one test is executed. The second possible path, -from top2 to sub2X2 (from the former example) is discarded:

    $ ct_run -suite "x_SUITE" -group [sub21,sub2X2]
    1> ct:run_test([{suite,"x_SUITE"}, {group,[[sub21,sub2X2]]}]).

    The following executes only the test cases for sub22 and in reverse order -compared to the group definition:

    $ ct_run -suite "x_SUITE" -group [sub22] -case tc22 tc21
    1> ct:run_test([{suite,"x_SUITE"}, {group,[[sub22]]}, {testcase,[tc22,tc21]}]).

    If a test case belonging to a group (according to the group definition) is +from top2 to sub2X2 (from the former example) is discarded:

    $ ct_run -suite "x_SUITE" -group [sub21,sub2X2]
    1> ct:run_test([{suite,"x_SUITE"}, {group,[[sub21,sub2X2]]}]).

    The following executes only the test cases for sub22 and in reverse order +compared to the group definition:

    $ ct_run -suite "x_SUITE" -group [sub22] -case tc22 tc21
    1> ct:run_test([{suite,"x_SUITE"}, {group,[[sub22]]}, {testcase,[tc22,tc21]}]).

    If a test case belonging to a group (according to the group definition) is executed without a group specification, that is, simply by (using the command line):

    $ ct_run -suite "my_SUITE" -case my_tc

    or (using the Erlang shell):

    1> ct:run_test([{suite,"my_SUITE"}, {testcase,my_tc}]).

    then Common Test ignores the group definition and executes the test case in the scope of the test suite only (no group configuration functions are called).

    The group specification feature, as presented in this section, can also be used @@ -257,12 +257,12 @@ configuration data with ct:require/1,2. This is equivalent to a require statement in the Test Suite Information Function or in the -Test Case Information Function.

    Example:

    1> ct:require(unix_telnet, unix).
    +Test Case Information Function.

    Example:

    1> ct:require(unix_telnet, unix).
     ok
    -2> ct_telnet:open(unix_telnet).
    -{ok,<0.105.0>}
    -4> ct_telnet:cmd(unix_telnet, "ls .").
    -{ok,["ls .","file1  ...",...]}

    Everything that Common Test normally prints in the test case logs, are in the +2> ct_telnet:open(unix_telnet). +{ok,<0.105.0>} +4> ct_telnet:cmd(unix_telnet, "ls ."). +{ok,["ls .","file1 ...",...]}

    Everything that Common Test normally prints in the test case logs, are in the interactive mode written to a log named ctlog.html in directory ct_run.<timestamp>. A link to this file is available in the file named last_interactive.html in the directory from which you execute ct_run. @@ -349,8 +349,8 @@ included specification can either be joined with the source specification or used to produce a separate test run (as with start flag/option join_specs above).

    Example:

    %% In specification file "a.spec"
    -{specs, join, ["b.spec", "c.spec"]}.
    -{specs, separate, ["d.spec", "e.spec"]}.
    +{specs, join, ["b.spec", "c.spec"]}.
    +{specs, separate, ["d.spec", "e.spec"]}.
     %% Config and test terms follow
     ...

    In this example, the test terms defined in files "b.spec" and "c.spec" are joined with the terms in source specification "a.spec" (if any). The inclusion @@ -412,154 +412,154 @@ available start flags (as most flags have a corresponding configuration term)

  • Logging (for terms verbosity, stylesheet, basic_html and esc_chars)
  • External Configuration Data (for terms config and userconfig)
  • Event Handling (for the -event_handler term)
  • Common Test Hooks (for term ct_hooks)
  • Configuration terms:

    {merge_tests, Bool}.
    +event_handler term)
  • Common Test Hooks (for term ct_hooks)
  • Configuration terms:

    {merge_tests, Bool}.
     
    -{define, Constant, Value}.
    +{define, Constant, Value}.
     
    -{specs, InclSpecsOption, TestSpecs}.
    +{specs, InclSpecsOption, TestSpecs}.
     
    -{node, NodeAlias, Node}.
    +{node, NodeAlias, Node}.
     
    -{init, InitOptions}.
    -{init, [NodeAlias], InitOptions}.
    +{init, InitOptions}.
    +{init, [NodeAlias], InitOptions}.
     
    -{label, Label}.
    -{label, NodeRefs, Label}.
    +{label, Label}.
    +{label, NodeRefs, Label}.
     
    -{verbosity, VerbosityLevels}.
    -{verbosity, NodeRefs, VerbosityLevels}.
    +{verbosity, VerbosityLevels}.
    +{verbosity, NodeRefs, VerbosityLevels}.
     
    -{stylesheet, CSSFile}.
    -{stylesheet, NodeRefs, CSSFile}.
    +{stylesheet, CSSFile}.
    +{stylesheet, NodeRefs, CSSFile}.
     
    -{silent_connections, ConnTypes}.
    -{silent_connections, NodeRefs, ConnTypes}.
    +{silent_connections, ConnTypes}.
    +{silent_connections, NodeRefs, ConnTypes}.
     
    -{multiply_timetraps, N}.
    -{multiply_timetraps, NodeRefs, N}.
    +{multiply_timetraps, N}.
    +{multiply_timetraps, NodeRefs, N}.
     
    -{scale_timetraps, Bool}.
    -{scale_timetraps, NodeRefs, Bool}.
    +{scale_timetraps, Bool}.
    +{scale_timetraps, NodeRefs, Bool}.
     
    -{cover, CoverSpecFile}.
    -{cover, NodeRefs, CoverSpecFile}.
    +{cover, CoverSpecFile}.
    +{cover, NodeRefs, CoverSpecFile}.
     
    -{cover_stop, Bool}.
    -{cover_stop, NodeRefs, Bool}.
    +{cover_stop, Bool}.
    +{cover_stop, NodeRefs, Bool}.
     
    -{include, IncludeDirs}.
    -{include, NodeRefs, IncludeDirs}.
    +{include, IncludeDirs}.
    +{include, NodeRefs, IncludeDirs}.
     
    -{auto_compile, Bool},
    -{auto_compile, NodeRefs, Bool},
    +{auto_compile, Bool},
    +{auto_compile, NodeRefs, Bool},
     
    -{abort_if_missing_suites, Bool},
    -{abort_if_missing_suites, NodeRefs, Bool},
    +{abort_if_missing_suites, Bool},
    +{abort_if_missing_suites, NodeRefs, Bool},
     
    -{config, ConfigFiles}.
    -{config, ConfigDir, ConfigBaseNames}.
    -{config, NodeRefs, ConfigFiles}.
    -{config, NodeRefs, ConfigDir, ConfigBaseNames}.
    +{config, ConfigFiles}.
    +{config, ConfigDir, ConfigBaseNames}.
    +{config, NodeRefs, ConfigFiles}.
    +{config, NodeRefs, ConfigDir, ConfigBaseNames}.
     
    -{userconfig, {CallbackModule, ConfigStrings}}.
    -{userconfig, NodeRefs, {CallbackModule, ConfigStrings}}.
    +{userconfig, {CallbackModule, ConfigStrings}}.
    +{userconfig, NodeRefs, {CallbackModule, ConfigStrings}}.
     
    -{logdir, LogDir}.
    -{logdir, NodeRefs, LogDir}.
    +{logdir, LogDir}.
    +{logdir, NodeRefs, LogDir}.
     
    -{logopts, LogOpts}.
    -{logopts, NodeRefs, LogOpts}.
    +{logopts, LogOpts}.
    +{logopts, NodeRefs, LogOpts}.
     
    -{create_priv_dir, PrivDirOption}.
    -{create_priv_dir, NodeRefs, PrivDirOption}.
    +{create_priv_dir, PrivDirOption}.
    +{create_priv_dir, NodeRefs, PrivDirOption}.
     
    -{event_handler, EventHandlers}.
    -{event_handler, NodeRefs, EventHandlers}.
    -{event_handler, EventHandlers, InitArgs}.
    -{event_handler, NodeRefs, EventHandlers, InitArgs}.
    +{event_handler, EventHandlers}.
    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/unix_telnet.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/unix_telnet.xhtml	2025-05-10 20:19:02.785133124 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/unix_telnet.xhtml	2025-05-10 20:19:02.797133233 +0000
    @@ -24,14 +24,14 @@
     
           

    Callback module for ct_telnet, for connecting to a Telnet server on a UNIX -host.

    It requires the following entry in the configuration file:

    {unix,[{telnet,HostNameOrIpAddress},
    -       {port,PortNum},                 % optional
    -       {username,UserName},
    -       {password,Password},
    -       {keep_alive,Bool}]}.            % optional

    To communicate through Telnet to the host specified by HostNameOrIpAddress, +host.

    It requires the following entry in the configuration file:

    {unix,[{telnet,HostNameOrIpAddress},
    +       {port,PortNum},                 % optional
    +       {username,UserName},
    +       {password,Password},
    +       {keep_alive,Bool}]}.            % optional

    To communicate through Telnet to the host specified by HostNameOrIpAddress, use the interface functions in ct_telnet, for example, open(Name) and cmd(Name,Cmd).

    Name is the name you allocated to the Unix host in your require statement, -for example:

    suite() -> [{require,Name,{unix,[telnet]}}].

    or

    ct:require(Name,{unix,[telnet]}).

    The "keep alive" activity (that is, that Common Test sends NOP to the server +for example:

    suite() -> [{require,Name,{unix,[telnet]}}].

    or

    ct:require(Name,{unix,[telnet]}).

    The "keep alive" activity (that is, that Common Test sends NOP to the server every 10 seconds if the connection is idle) can be enabled or disabled for one particular connection as described here. It can be disabled for all connections using telnet_settings (see ct_telnet).

    The {port,PortNum} tuple is optional and if omitted, default Telnet port 23 is /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/write_test_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/write_test_chapter.xhtml 2025-05-10 20:19:02.785133124 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test.epub/OEBPS/write_test_chapter.xhtml 2025-05-10 20:19:02.797133233 +0000 @@ -161,29 +161,29 @@ system configuration files, the test case is skipped.

    A required variable can also be given a default value to be used if the variable is not found in any configuration file. To specify a default value, add a tuple on the form {default_config,ConfigVariableName,Value} to the -test case information list (the position in the list is irrelevant).

    Examples:

    testcase1() ->
    -    [{require, ftp},
    -     {default_config, ftp, [{ftp, "my_ftp_host"},
    -                            {username, "aladdin"},
    -                            {password, "sesame"}]}}].
    testcase2() ->
    -    [{require, unix_telnet, unix},
    -     {require, {unix, [telnet, username, password]}},
    -     {default_config, unix, [{telnet, "my_telnet_host"},
    -                             {username, "aladdin"},
    -                             {password, "sesame"}]}}].

    For more information about require, see section +test case information list (the position in the list is irrelevant).

    Examples:

    testcase1() ->
    +    [{require, ftp},
    +     {default_config, ftp, [{ftp, "my_ftp_host"},
    +                            {username, "aladdin"},
    +                            {password, "sesame"}]}}].
    testcase2() ->
    +    [{require, unix_telnet, unix},
    +     {require, {unix, [telnet, username, password]}},
    +     {default_config, unix, [{telnet, "my_telnet_host"},
    +                             {username, "aladdin"},
    +                             {password, "sesame"}]}}].

    For more information about require, see section Requiring and Reading Configuration Data in section External Configuration Data and function ct:require/1/2.

    Note

    Specifying a default value for a required variable can result in a test case always getting executed. This might not be a desired behavior.

    If timetrap or require, or both, is not set specifically for a particular test case, default values specified by function -suite/0 are used.

    Tags other than the earlier mentioned are ignored by the test server.

    An example of a test case information function follows:

    reboot_node() ->
    -    [
    -     {timetrap,{seconds,60}},
    -     {require,interfaces},
    -     {userdata,
    -         [{description,"System Upgrade: RpuAddition Normal RebootNode"},
    -          {fts,"http://someserver.ericsson.se/test_doc4711.pdf"}]}
    -    ].

    +suite/0 are used.

    Tags other than the earlier mentioned are ignored by the test server.

    An example of a test case information function follows:

    reboot_node() ->
    +    [
    +     {timetrap,{seconds,60}},
    +     {require,interfaces},
    +     {userdata,
    +         [{description,"System Upgrade: RpuAddition Normal RebootNode"},
    +          {fts,"http://someserver.ericsson.se/test_doc4711.pdf"}]}
    +    ].

    @@ -197,14 +197,14 @@ Test Case Information Function and Test Case Groups.

    The following options can also be specified with the suite information list:

    An example of the suite information function follows:

    suite() ->
    -    [
    -     {timetrap,{minutes,10}},
    -     {require,global_names},
    -     {userdata,[{info,"This suite tests database transactions."}]},
    -     {silent_connections,[telnet]},
    -     {stylesheet,"db_testing.css"}
    -    ].

    +Silent Connections

    An example of the suite information function follows:

    suite() ->
    +    [
    +     {timetrap,{minutes,10}},
    +     {require,global_names},
    +     {userdata,[{info,"This suite tests database transactions."}]},
    +     {silent_connections,[telnet]},
    +     {stylesheet,"db_testing.css"}
    +    ].

    @@ -226,20 +226,20 @@ TCRepeatProps = [{repeat,N} | {repeat_until_ok,N} | {repeat_until_fail,N}]

    GroupName is the name of the group and must be unique within the test suite module. Groups can be nested, by including a group definition within the GroupsAndTestCases list of another group. Properties is the list of -execution properties for the group. The possible values are as follows:

    Properties = [parallel | sequence | Shuffle | {GroupRepeatType,N}]
    -Shuffle = shuffle | {shuffle,Seed}
    -Seed = {integer(),integer(),integer()}
    +execution properties for the group. The possible values are as follows:

    Properties = [parallel | sequence | Shuffle | {GroupRepeatType,N}]
    +Shuffle = shuffle | {shuffle,Seed}
    +Seed = {integer(),integer(),integer()}
     GroupRepeatType = repeat | repeat_until_all_ok | repeat_until_all_fail |
                       repeat_until_any_ok | repeat_until_any_fail
    -N = integer() | forever

    Explanations:

    • parallel - Common Test executes all test cases in the group in +N = integer() | forever

    Explanations:

    • parallel - Common Test executes all test cases in the group in parallel.

    • sequence - The cases are executed in a sequence as described in section Sequences in section Dependencies Between Test Cases and Suites.

    • shuffle - The cases in the group are executed in random order.

    • repeat, repeat_until_* - Orders Common Test to repeat execution of all the cases in the group a given number of times, or until any, or all, cases -fail or succeed.

    Example:

    groups() -> [{group1, [parallel], [test1a,test1b]},
    -             {group2, [shuffle,sequence], [test2a,test2b,test2c]}].

    To specify in which order groups are to be executed (also with respect to test +fail or succeed.

    Example:

    groups() -> [{group1, [parallel], [test1a,test1b]},
    +             {group2, [shuffle,sequence], [test2a,test2b,test2c]}].

    To specify in which order groups are to be executed (also with respect to test cases that are not part of any group), add tuples on the form -{group,GroupName} to the all/0 list.

    Example:

    all() -> [testcase1, {group,group1}, {testcase,testcase2,[{repeat,10}]}, {group,group2}].

    Execution properties with a group tuple in all/0: +{group,GroupName} to the all/0 list.

    Example:

    all() -> [testcase1, {group,group1}, {testcase,testcase2,[{repeat,10}]}, {group,group2}].

    Execution properties with a group tuple in all/0: {group,GroupName,Properties} can also be specified. These properties override those specified in the group definition (see groups/0 earlier). This way, the same set of tests can be run, but with different properties, without having to @@ -248,33 +248,33 @@ SubGroups is a list of tuples, {GroupName,Properties} or {GroupName,Properties,SubGroups} representing the subgroups. Any subgroups defined in groups/0 for a group, that are not specified in the SubGroups -list, executes with their predefined properties.

    Example:

    groups() -> [{tests1, [], [{tests2, [], [t2a,t2b]},
    -                          {tests3, [], [t31,t3b]}]}].

    To execute group tests1 twice with different properties for tests2 each -time:

    all() ->
    -   [{group, tests1, default, [{tests2, [parallel]}]},
    -    {group, tests1, default, [{tests2, [shuffle,{repeat,10}]}]}].

    This is equivalent to the following specification:

    all() ->
    -   [{group, tests1, default, [{tests2, [parallel]},
    -                              {tests3, default}]},
    -    {group, tests1, default, [{tests2, [shuffle,{repeat,10}]},
    -                              {tests3, default}]}].

    Value default states that the predefined properties are to be used.

    The following example shows how to override properties in a scenario with deeply -nested groups:

    groups() ->
    -   [{tests1, [], [{group, tests2}]},
    -    {tests2, [], [{group, tests3}]},
    -    {tests3, [{repeat,2}], [t3a,t3b,t3c]}].
    +list, executes with their predefined properties.

    Example:

    groups() -> [{tests1, [], [{tests2, [], [t2a,t2b]},
    +                          {tests3, [], [t31,t3b]}]}].

    To execute group tests1 twice with different properties for tests2 each +time:

    all() ->
    +   [{group, tests1, default, [{tests2, [parallel]}]},
    +    {group, tests1, default, [{tests2, [shuffle,{repeat,10}]}]}].

    This is equivalent to the following specification:

    all() ->
    +   [{group, tests1, default, [{tests2, [parallel]},
    +                              {tests3, default}]},
    +    {group, tests1, default, [{tests2, [shuffle,{repeat,10}]},
    +                              {tests3, default}]}].

    Value default states that the predefined properties are to be used.

    The following example shows how to override properties in a scenario with deeply +nested groups:

    groups() ->
    +   [{tests1, [], [{group, tests2}]},
    +    {tests2, [], [{group, tests3}]},
    +    {tests3, [{repeat,2}], [t3a,t3b,t3c]}].
     
    -all() ->
    -   [{group, tests1, default,
    -     [{tests2, default,
    -       [{tests3, [parallel,{repeat,100}]}]}]}].

    For ease of readability, all syntax definitions can be replaced by a function -call whose return value should match the expected syntax case.

    Example:

    all() ->
    -   [{group, tests1, default, test_cases()},
    -    {group, tests1, default, [shuffle_test(),
    -                              {tests3, default}]}].
    -test_cases() ->
    -   [{tests2, [parallel]}, {tests3, default}].
    +all() ->
    +   [{group, tests1, default,
    +     [{tests2, default,
    +       [{tests3, [parallel,{repeat,100}]}]}]}].

    For ease of readability, all syntax definitions can be replaced by a function +call whose return value should match the expected syntax case.

    Example:

    all() ->
    +   [{group, tests1, default, test_cases()},
    +    {group, tests1, default, [shuffle_test(),
    +                              {tests3, default}]}].
    +test_cases() ->
    +   [{tests2, [parallel]}, {tests3, default}].
     
    -shuffle_test() ->
    -   {tests2, [shuffle,{repeat,10}]}.

    The described syntax can also be used in test specifications to change group +shuffle_test() -> + {tests2, [shuffle,{repeat,10}]}.

    The described syntax can also be used in test specifications to change group properties at the time of execution, without having to edit the test suite. For more information, see section Test Specifications in section @@ -300,13 +300,13 @@ bottom of the log for end_per_group/2.

    Test case groups can be nested so sets of groups can be configured with the same init_per_group/2 and end_per_group/2 functions. Nested groups can be defined by including a group definition, or a group name reference, in the test case -list of another group.

    Example:

    groups() -> [{group1, [shuffle], [test1a,
    -                                  {group2, [], [test2a,test2b]},
    -                                  test1b]},
    -             {group3, [], [{group,group4},
    -                           {group,group5}]},
    -             {group4, [parallel], [test4a,test4b]},
    -             {group5, [sequence], [test5a,test5b,test5c]}].

    In the previous example, if all/0 returns group name references in the order +list of another group.

    Example:

    groups() -> [{group1, [shuffle], [test1a,
    +                                  {group2, [], [test2a,test2b]},
    +                                  test1b]},
    +             {group3, [], [{group,group4},
    +                           {group,group5}]},
    +             {group4, [parallel], [test4a,test4b]},
    +             {group5, [sequence], [test5a,test5b,test5c]}].

    In the previous example, if all/0 returns group name references in the order [{group,group1},{group,group3}], the order of the configuration functions and test cases becomes the following (notice that init_per_testcase/2 and end_per_testcase/2: are also always called, but not included in this example @@ -379,25 +379,25 @@ account by Common Test when evaluating if execution of a group is to be repeated or not (unless the basic repeat property is used).

    The value of tc_group_properties is a list of status tuples, each with the key ok, skipped, and failed. The value of a status tuple is a list with names -of test cases that have been executed with the corresponding status as result.

    The following is an example of how to return the status from a group:

    end_per_group(_Group, Config) ->
    -    Status = proplists:get_value(tc_group_result, Config),
    -    case proplists:get_value(failed, Status) of
    -        [] ->                                   % no failed cases
    -            {return_group_result,ok};
    +of test cases that have been executed with the corresponding status as result.

    The following is an example of how to return the status from a group:

    end_per_group(_Group, Config) ->
    +    Status = proplists:get_value(tc_group_result, Config),
    +    case proplists:get_value(failed, Status) of
    +        [] ->                                   % no failed cases
    +            {return_group_result,ok};
             _Failed ->                              % one or more failed
    -            {return_group_result,failed}
    +            {return_group_result,failed}
         end.

    It is also possible, in end_per_group/2, to check the status of a subgroup (maybe to determine what status the current group is to return). This is as /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test_app.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test_app.html 2025-05-10 20:19:03.085135844 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/common_test_app.html 2025-05-10 20:19:03.085135844 +0000 @@ -183,7 +183,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/config_file_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/config_file_chapter.html 2025-05-10 20:19:03.109136062 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/config_file_chapter.html 2025-05-10 20:19:03.117136134 +0000 @@ -142,8 +142,8 @@ Syntax

    -

    A configuration file can contain any number of elements of the type:

    {CfgVarName,Value}.

    where

    CfgVarName = atom()
    -Value = term() | [{CfgVarName,Value}]

    +

    A configuration file can contain any number of elements of the type:

    {CfgVarName,Value}.

    where

    CfgVarName = atom()
    +Value = term() | [{CfgVarName,Value}]

    @@ -170,13 +170,13 @@ any number of alias names, but each name must be unique within the same test suite. The two main uses for alias names follows:

    • To identify connections (described later).
    • To help adapt configuration data to a test suite (or test case) and improve readability.

    To read the value of a configuration variable, use function -get_config/1,2,3.

    Example:

    suite() ->
    -    [{require, domain, 'CONN_SPEC_DNS_SUFFIX'}].
    +get_config/1,2,3.

    Example:

    suite() ->
    +    [{require, domain, 'CONN_SPEC_DNS_SUFFIX'}].
     
     ...
     
    -testcase(Config) ->
    -    Domain = ct:get_config(domain),
    +testcase(Config) ->
    +    Domain = ct:get_config(domain),
         ...

    @@ -261,11 +261,11 @@ </ftp_host> <lm_directory>"/test/loadmodules"</lm_directory> </config>

    Once read, this file produces the same configuration variables as the following -text file:

    {ftp_host, [{ftp,"targethost"},
    -            {username,"tester"},
    -            {password,"letmein"}]}.
    +text file:

    {ftp_host, [{ftp,"targethost"},
    +            {username,"tester"},
    +            {password,"letmein"}]}.
     
    -{lm_directory, "/test/loadmodules"}.

    +{lm_directory, "/test/loadmodules"}.

    @@ -284,55 +284,55 @@ data being reloaded during test execution. The input argument is the same as for function check_parameter/1.

    The return value is to be either of the following:

    • {ok, Config} - if the configuration variables are read successfully.
    • {error, {Error, ErrorDetails}} - if the callback module fails to proceed with the specified configuration parameters.

    Config is the proper Erlang key-value list, with possible key-value sublists -as values, like the earlier configuration file example:

    [{ftp_host, [{ftp, "targethost"}, {username, "tester"}, {password, "letmein"}]},
    - {lm_directory, "/test/loadmodules"}]

    +as values, like the earlier configuration file example:

    [{ftp_host, [{ftp, "targethost"}, {username, "tester"}, {password, "letmein"}]},
    + {lm_directory, "/test/loadmodules"}]

    Examples of Configuration Data Handling

    A configuration file for using the FTP client to access files on a remote host -can look as follows:

    {ftp_host, [{ftp,"targethost"},
    -            {username,"tester"},
    -            {password,"letmein"}]}.
    +can look as follows:

    {ftp_host, [{ftp,"targethost"},
    +            {username,"tester"},
    +            {password,"letmein"}]}.
     
    -{lm_directory, "/test/loadmodules"}.

    The XML version shown earlier can also be used, but it is to be explicitly +{lm_directory, "/test/loadmodules"}.

    The XML version shown earlier can also be used, but it is to be explicitly specified that the ct_config_xml callback module is to be used by Common Test.

    The following is an example of how to assert that the configuration data is -available and can be used for an FTP session:

    init_per_testcase(ftptest, Config) ->
    -    {ok,_} = ct_ftp:open(ftp),
    +available and can be used for an FTP session:

    init_per_testcase(ftptest, Config) ->
    +    {ok,_} = ct_ftp:open(ftp),
         Config.
     
    -end_per_testcase(ftptest, _Config) ->
    -    ct_ftp:close(ftp).
    +end_per_testcase(ftptest, _Config) ->
    +    ct_ftp:close(ftp).
     
    -ftptest() ->
    -    [{require,ftp,ftp_host},
    -     {require,lm_directory}].
    -
    -ftptest(Config) ->
    -    Remote = filename:join(ct:get_config(lm_directory), "loadmodX"),
    -    Local = filename:join(proplists:get_value(priv_dir,Config), "loadmodule"),
    -    ok = ct_ftp:recv(ftp, Remote, Local),
    +ftptest() ->
    +    [{require,ftp,ftp_host},
    +     {require,lm_directory}].
    +
    +ftptest(Config) ->
    +    Remote = filename:join(ct:get_config(lm_directory), "loadmodX"),
    +    Local = filename:join(proplists:get_value(priv_dir,Config), "loadmodule"),
    +    ok = ct_ftp:recv(ftp, Remote, Local),
         ...

    The following is an example of how the functions in the previous example can be -rewritten if it is necessary to open multiple connections to the FTP server:

    init_per_testcase(ftptest, Config) ->
    -    {ok,Handle1} = ct_ftp:open(ftp_host),
    -    {ok,Handle2} = ct_ftp:open(ftp_host),
    -    [{ftp_handles,[Handle1,Handle2]} | Config].
    -
    -end_per_testcase(ftptest, Config) ->
    -    lists:foreach(fun(Handle) -> ct_ftp:close(Handle) end,
    -                  proplists:get_value(ftp_handles,Config)).
    -
    -ftptest() ->
    -    [{require,ftp_host},
    -     {require,lm_directory}].
    -
    -ftptest(Config) ->
    -    Remote = filename:join(ct:get_config(lm_directory), "loadmodX"),
    -    Local = filename:join(proplists:get_value(priv_dir,Config), "loadmodule"),
    -    [Handle | MoreHandles] = proplists:get_value(ftp_handles,Config),
    -    ok = ct_ftp:recv(Handle, Remote, Local),
    +rewritten if it is necessary to open multiple connections to the FTP server:

    init_per_testcase(ftptest, Config) ->
    +    {ok,Handle1} = ct_ftp:open(ftp_host),
    +    {ok,Handle2} = ct_ftp:open(ftp_host),
    +    [{ftp_handles,[Handle1,Handle2]} | Config].
    +
    +end_per_testcase(ftptest, Config) ->
    +    lists:foreach(fun(Handle) -> ct_ftp:close(Handle) end,
    +                  proplists:get_value(ftp_handles,Config)).
    +
    +ftptest() ->
    +    [{require,ftp_host},
    +     {require,lm_directory}].
    +
    +ftptest(Config) ->
    +    Remote = filename:join(ct:get_config(lm_directory), "loadmodX"),
    +    Local = filename:join(proplists:get_value(priv_dir,Config), "loadmodule"),
    +    [Handle | MoreHandles] = proplists:get_value(ftp_handles,Config),
    +    ok = ct_ftp:recv(Handle, Remote, Local),
         ...

    @@ -340,86 +340,86 @@ Example of User-Specific Configuration Handler

    A simple configuration handling driver, asking an external server for -configuration data, can be implemented as follows:

    -module(config_driver).
    --export([read_config/1, check_parameter/1]).
    +configuration data, can be implemented as follows:

    -module(config_driver).
    +-export([read_config/1, check_parameter/1]).
     
    -read_config(ServerName)->
    -    ServerModule = list_to_atom(ServerName),
    -    ServerModule:start(),
    -    ServerModule:get_config().
    -
    -check_parameter(ServerName)->
    -    ServerModule = list_to_atom(ServerName),
    -    case code:is_loaded(ServerModule) of
    -        {file, _}->
    -            {ok, {config, ServerName}};
    +read_config(ServerName)->
    +    ServerModule = list_to_atom(ServerName),
    +    ServerModule:start(),
    +    ServerModule:get_config().
    +
    +check_parameter(ServerName)->
    +    ServerModule = list_to_atom(ServerName),
    +    case code:is_loaded(ServerModule) of
    +        {file, _}->
    +            {ok, {config, ServerName}};
             false->
    -            case code:load_file(ServerModule) of
    -                {module, ServerModule}->
    -                    {ok, {config, ServerName}};
    -                {error, nofile}->
    -                    {error, {wrong_config, "File not found: " ++ ServerName ++ ".beam"}}
    +            case code:load_file(ServerModule) of
    +                {module, ServerModule}->
    +                    {ok, {config, ServerName}};
    +                {error, nofile}->
    +                    {error, {wrong_config, "File not found: " ++ ServerName ++ ".beam"}}
                 end
         end.

    The configuration string for this driver can be config_server, if the config_server.erl module that follows is compiled and exists in the code path -during test execution:

    -module(config_server).
    --export([start/0, stop/0, init/1, get_config/0, loop/0]).
    +during test execution:

    -module(config_server).
    +-export([start/0, stop/0, init/1, get_config/0, loop/0]).
     
    --define(REGISTERED_NAME, ct_test_config_server).
    +-define(REGISTERED_NAME, ct_test_config_server).
     
    -start()->
    -    case whereis(?REGISTERED_NAME) of
    +start()->
    +    case whereis(?REGISTERED_NAME) of
             undefined->
    -            spawn(?MODULE, init, [?REGISTERED_NAME]),
    -            wait();
    +            spawn(?MODULE, init, [?REGISTERED_NAME]),
    +            wait();
             _Pid->
    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/cover_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/cover_chapter.html	2025-05-10 20:19:03.141136352 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/cover_chapter.html	2025-05-10 20:19:03.141136352 +0000
    @@ -201,44 +201,44 @@
     

    Here follows the general configuration terms that are allowed in a cover specification file:

    %% List of Nodes on which cover will be active during test.
     %% Nodes = [atom()]
    -{nodes, Nodes}.
    +{nodes, Nodes}.
     
     %% Files with previously exported cover data to include in analysis.
     %% CoverDataFiles = [string()]
    -{import, CoverDataFiles}.
    +{import, CoverDataFiles}.
     
     %% Cover data file to export from this session.
     %% CoverDataFile = string()
    -{export, CoverDataFile}.
    +{export, CoverDataFile}.
     
     %% Cover analysis level.
     %% Level = details | overview
    -{level, Level}.
    +{level, Level}.
     
     %% Directories to include in cover.
     %% Dirs = [string()]
    -{incl_dirs, Dirs}.
    +{incl_dirs, Dirs}.
     
     %% Directories, including subdirectories, to include.
    -{incl_dirs_r, Dirs}.
    +{incl_dirs_r, Dirs}.
     
     %% Specific modules to include in cover.
     %% Mods = [atom()]
    -{incl_mods, Mods}.
    +{incl_mods, Mods}.
     
     %% Directories to exclude in cover.
    -{excl_dirs, Dirs}.
    +{excl_dirs, Dirs}.
     
     %% Directories, including subdirectories, to exclude.
    -{excl_dirs_r, Dirs}.
    +{excl_dirs_r, Dirs}.
     
     %% Specific modules to exclude in cover.
    -{excl_mods, Mods}.
    +{excl_mods, Mods}.
     
     %% Cross cover compilation
     %% Tag = atom(), an identifier for a test run
     %% Mod = [atom()], modules to compile for accumulated analysis
    -{cross,[{Tag,Mods}]}.

    The terms incl_dirs_r and excl_dirs_r tell Common Test to search the +{cross,[{Tag,Mods}]}.

    The terms incl_dirs_r and excl_dirs_r tell Common Test to search the specified directories recursively and include or exclude any module found during the search. The terms incl_dirs and excl_dirs result in a non-recursive search for modules (that is, only modules found in the specified directories are @@ -253,7 +253,7 @@

    When using a cover specification in the testing of an OTP application itself, there is a special incl_app directive that includes the applications modules for -the cover compilation.

    {incl_app, AppName, Cover :: overview | details}.

    Note

    If you desire to also use some other general cover configuration together with +the cover compilation.

    {incl_app, AppName, Cover :: overview | details}.

    Note

    If you desire to also use some other general cover configuration together with this option you should insert the AppName in between the option and its value creating a three tuple.

    @@ -280,7 +280,7 @@ {cross,[{s1,[m1]}]}.

    Then m1 is cover compiled in test run s2, but not shown in the coverage log. Instead, if ct_cover:cross_cover_analyse/2 is called after both s1 and s2 test runs are completed, the accumulated result for m1 is available in the -cross cover log for test run s1.

    The call to the analyze function must be as follows:

    ct_cover:cross_cover_analyse(Level, [{s1,S1LogDir},{s2,S2LogDir}]).

    Here, S1LogDir and S2LogDir are the directories named <TestName>.logs for +cross cover log for test run s1.

    The call to the analyze function must be as follows:

    ct_cover:cross_cover_analyse(Level, [{s1,S1LogDir},{s2,S2LogDir}]).

    Here, S1LogDir and S2LogDir are the directories named <TestName>.logs for each test respectively.

    Notice the tags s1 and s2, which are used in the cover specification file and in the call to ct_cover:cross_cover_analyse/2. The purpose of these is only to map the modules specified in the cover specification to the log @@ -353,7 +353,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct.html 2025-05-10 20:19:03.197136859 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct.html 2025-05-10 20:19:03.221137077 +0000 @@ -1978,17 +1978,17 @@

    Reads configuration data values.

    Returns the matching values or configuration elements, given a configuration variable key or its associated name (if one has been specified with -ct:require/2 or a require statement).

    Example:

    Given the following configuration file:

    {unix,[{telnet,IpAddr},
    -       {user,[{username,Username},
    -              {password,Password}]}]}.

    Then:

    ct:get_config(unix,Default) -> [{telnet,IpAddr},
    - {user, [{username,Username}, {password,Password}]}]
    -ct:get_config({unix,telnet},Default) -> IpAddr
    -ct:get_config({unix,user,username},Default) -> Username
    -ct:get_config({unix,ftp},Default) -> Default
    -ct:get_config(unknownkey,Default) -> Default

    If a configuration variable key has been associated with a name (by +ct:require/2 or a require statement).

    Example:

    Given the following configuration file:

    {unix,[{telnet,IpAddr},
    +       {user,[{username,Username},
    +              {password,Password}]}]}.

    Then:

    ct:get_config(unix,Default) -> [{telnet,IpAddr},
    + {user, [{username,Username}, {password,Password}]}]
    +ct:get_config({unix,telnet},Default) -> IpAddr
    +ct:get_config({unix,user,username},Default) -> Username
    +ct:get_config({unix,ftp},Default) -> Default
    +ct:get_config(unknownkey,Default) -> Default

    If a configuration variable key has been associated with a name (by ct:require/2 or a require statement), the name can be used -instead of the key to read the value:

    ct:require(myuser,{unix,user}) -> ok.
    -ct:get_config(myuser,Default) -> [{username,Username}, {password,Password}]

    If a configuration variable is defined in multiple files, use option all to +instead of the key to read the value:

    ct:require(myuser,{unix,user}) -> ok.
    +ct:get_config(myuser,Default) -> [{username,Username}, {password,Password}]

    If a configuration variable is defined in multiple files, use option all to access all possible values. The values are returned in a list. The order of the elements corresponds to the order that the configuration files were specified at startup.

    If configuration elements (key-value tuples) are to be returned as result @@ -2026,7 +2026,7 @@

    Gets a reference to the Common Test event manager. The reference can be used -to, for example, add a user-specific event handler while tests are running.

    Example:

    gen_event:add_handler(ct:get_event_mgr_ref(), my_ev_h, [])
    +to, for example, add a user-specific event handler while tests are running.

    Example:

    gen_event:add_handler(ct:get_event_mgr_ref(), my_ev_h, [])
    @@ -2315,7 +2315,7 @@ -

    Installs configuration files and event handlers.

    Run this function once before the first test.

    Example:

    install([{config,["config_node.ctc","config_user.ctc"]}])

    This function is automatically run by program ct_run.

    +

    Installs configuration files and event handlers.

    Run this function once before the first test.

    Example:

    install([{config,["config_node.ctc","config_user.ctc"]}])

    This function is automatically run by program ct_run.

    @@ -3152,7 +3152,7 @@

    Checks if the required configuration is available. Arbitrarily deep tuples can be specified as Required. Only the last element of the tuple can be a list of -SubKeys.

    Example 1. Require the variable myvar:

    ok = ct:require(myvar).

    In this case the configuration file must at least contain:

    {myvar,Value}.

    Example 2. Require key myvar with subkeys sub1 and sub2:

    ok = ct:require({myvar,[sub1,sub2]}).

    In this case the configuration file must at least contain:

    {myvar,[{sub1,Value},{sub2,Value}]}.

    Example 3. Require key myvar with subkey sub1 with subsub1:

    ok = ct:require({myvar,sub1,sub2}).

    In this case the configuration file must at least contain:

    {myvar,[{sub1,[{sub2,Value}]}]}.

    See also ct:get_config/1, +SubKeys.

    Example 1. Require the variable myvar:

    ok = ct:require(myvar).

    In this case the configuration file must at least contain:

    {myvar,Value}.

    Example 2. Require key myvar with subkeys sub1 and sub2:

    ok = ct:require({myvar,[sub1,sub2]}).

    In this case the configuration file must at least contain:

    {myvar,[{sub1,Value},{sub2,Value}]}.

    Example 3. Require key myvar with subkey sub1 with subsub1:

    ok = ct:require({myvar,sub1,sub2}).

    In this case the configuration file must at least contain:

    {myvar,[{sub1,[{sub2,Value}]}]}.

    See also ct:get_config/1, ct:get_config/2, ct:get_config/3, ct:require/2.

    @@ -3194,8 +3194,8 @@ that the value of the element can be read with ct:get_config/1,2 provided Name is used instead of the whole Required term.

    Example:

    Require one node with a Telnet connection and an FTP connection. Name the node -a:

    ok = ct:require(a,{machine,node}).

    All references to this node can then use the node name. For example, a file over -FTP is fetched like follows:

    ok = ct:ftp_get(a,RemoteFile,LocalFile).

    For this to work, the configuration file must at least contain:

    {machine,[{node,[{telnet,IpAddr},{ftp,IpAddr}]}]}.

    Note

    The behavior of this function changed radically in Common Test 1.6.2. To +a:

    ok = ct:require(a,{machine,node}).

    All references to this node can then use the node name. For example, a file over +FTP is fetched like follows:

    ok = ct:ftp_get(a,RemoteFile,LocalFile).

    For this to work, the configuration file must at least contain:

    {machine,[{node,[{telnet,IpAddr},{ftp,IpAddr}]}]}.

    Note

    The behavior of this function changed radically in Common Test 1.6.2. To keep some backwards compatibility, it is still possible to do: ct:require(a,{node,[telnet,ftp]}). This associates the name a with the top-level node entry. For this to work, the configuration file must at least @@ -3570,12 +3570,12 @@ the Erlang shell. The interactive mode can also be started from the OS command line with ct_run -shell [-config File...].

    If any functions (for example, Telnet or FTP) using "required configuration data" are to be called from the Erlang shell, configuration data must first be -required with ct:require/2.

    Example:

    > ct:require(unix_telnet, unix).
    +required with ct:require/2.

    Example:

    > ct:require(unix_telnet, unix).
     ok
    -> ct_telnet:open(unix_telnet).
    -{ok,<0.105.0>}
    -> ct_telnet:cmd(unix_telnet, "ls .").
    -{ok,["ls","file1  ...",...]}
    +>
    ct_telnet:open(unix_telnet). +{ok,<0.105.0>} +> ct_telnet:cmd(unix_telnet, "ls ."). +{ok,["ls","file1 ...",...]}
    @@ -3869,7 +3869,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_cover.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_cover.html 2025-05-10 20:19:03.245137295 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_cover.html 2025-05-10 20:19:03.249137331 +0000 @@ -317,7 +317,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_ftp.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_ftp.html 2025-05-10 20:19:03.273137549 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_ftp.html 2025-05-10 20:19:03.277137585 +0000 @@ -589,10 +589,10 @@

    Opens an FTP connection and sends a file to the remote host.

    LocalFile and RemoteFile must be absolute paths.

    If the target host is a "special" node, the FTP address must be specified in the -configuration file as follows:

    {node,[{ftp,IpAddr}]}.

    If the target host is something else, for example, a UNIX host, the -configuration file must also include the username and password (both strings):

    {unix,[{ftp,IpAddr},
    -       {username,Username},
    -       {password,Password}]}.

    See also ct:require/2.

    +configuration file as follows:

    {node,[{ftp,IpAddr}]}.

    If the target host is something else, for example, a UNIX host, the +configuration file must also include the username and password (both strings):

    {unix,[{ftp,IpAddr},
    +       {username,Username},
    +       {password,Password}]}.

    See also ct:require/2.

    @@ -774,7 +774,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_hooks.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_hooks.html 2025-05-10 20:19:03.309137875 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_hooks.html 2025-05-10 20:19:03.321137983 +0000 @@ -1401,7 +1401,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_hooks_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_hooks_chapter.html 2025-05-10 20:19:03.349138237 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_hooks_chapter.html 2025-05-10 20:19:03.353138273 +0000 @@ -253,12 +253,12 @@ always a combination of a result for the suite/group/test and an updated CTHState.

    To let the test suite continue on executing, return the configuration list that you want the test to use as the result.

    All pre hooks, except pre_end_per_testcase/4, can skip or fail the test by -returning a tuple with skip or fail, and a reason as the result.

    Example:

    pre_init_per_suite(SuiteName, Config, CTHState) ->
    -  case db:connect() of
    -    {error,_Reason} ->
    -      {{fail, "Could not connect to DB"}, CTHState};
    -    {ok, Handle} ->
    -      {[{db_handle, Handle} | Config], CTHState#state{ handle = Handle }}
    +returning a tuple with skip or fail, and a reason as the result.

    Example:

    pre_init_per_suite(SuiteName, Config, CTHState) ->
    +  case db:connect() of
    +    {error,_Reason} ->
    +      {{fail, "Could not connect to DB"}, CTHState};
    +    {ok, Handle} ->
    +      {[{db_handle, Handle} | Config], CTHState#state{ handle = Handle }}
       end.

    Note

    If you use multiple CTHs, the first part of the return tuple is used as input for the next CTH. So in the previous example the next CTH can get {fail,Reason} as the second parameter. If you have many CTHs interacting, do @@ -280,18 +280,18 @@ affect the outcome of the test, return the Return data as it is given to the CTH. You can also modify the test result. By returning the Config list with element tc_status removed, you can recover from a test failure. As in all the -pre hooks, it is also possible to fail/skip the test case in the post hook.

    Example:

    post_end_per_testcase(_Suite, _TC, Config, {'EXIT',{_,_}}, CTHState) ->
    -  case db:check_consistency() of
    +pre hooks, it is also possible to fail/skip the test case in the post hook.

    Example:

    post_end_per_testcase(_Suite, _TC, Config, {'EXIT',{_,_}}, CTHState) ->
    +  case db:check_consistency() of
         true ->
           %% DB is good, pass the test.
    -      {proplists:delete(tc_status, Config), CTHState};
    +      {proplists:delete(tc_status, Config), CTHState};
         false ->
           %% DB is not good, mark as skipped instead of failing
    -      {{skip, "DB is inconsistent!"}, CTHState}
    +      {{skip, "DB is inconsistent!"}, CTHState}
       end;
    -post_end_per_testcase(_Suite, _TC, Config, Return, CTHState) ->
    +post_end_per_testcase(_Suite, _TC, Config, Return, CTHState) ->
       %% Do nothing if tc does not crash.
    -  {Return, CTHState}.

    Note

    Do recover from a testcase failure using CTHs only a last resort. If used + {Return, CTHState}.

    Note

    Do recover from a testcase failure using CTHs only a last resort. If used wrongly, it can be very difficult to determine which tests that pass or fail in a test run.

    @@ -340,80 +340,80 @@ %%% ct_run -suite example_SUITE -pa . -ct_hooks example_cth %%% %%% Note `-pa .`: the hook beam file must be in the code path when installing. --module(example_cth). +-module(example_cth). %% Mandatory Callbacks --export([init/2]). +-export([init/2]). %% Optional Callbacks --export([id/1]). +-export([id/1]). --export([pre_init_per_suite/3]). --export([post_end_per_suite/4]). +-export([pre_init_per_suite/3]). +-export([post_end_per_suite/4]). --export([pre_init_per_testcase/4]). --export([post_end_per_testcase/5]). +-export([pre_init_per_testcase/4]). +-export([post_end_per_testcase/5]). --export([on_tc_skip/4]). +-export([on_tc_skip/4]). --export([terminate/1]). +-export([terminate/1]). %% This hook state is threaded through all the callbacks. --record(state, {filename, total, suite_total, ts, tcs, data, skipped}). +-record(state, {filename, total, suite_total, ts, tcs, data, skipped}). %% This example hook prints its results to a file, see terminate/1. --record(test_run, {total, skipped, suites}). +-record(test_run, {total, skipped, suites}). %% Return a unique id for this CTH. %% Using the filename means the hook can be used with different %% log files to separate timing data within the same test run. %% See Installing a CTH for more information. -id(Opts) -> +id(Opts) -> %% the path is relative to the test run directory - proplists:get_value(filename, Opts, "example_cth.log"). + proplists:get_value(filename, Opts, "example_cth.log"). %% Always called before any other callback function. Use this to initiate %% any common state. -init(Id, _Opts) -> - {ok, #state{filename = Id, total = 0, data = []}}. +init(Id, _Opts) -> + {ok, #state{filename = Id, total = 0, data = []}}. %% Called before init_per_suite is called. -pre_init_per_suite(_Suite,Config,State) -> - {Config, State#state{suite_total = 0, tcs = []}}. +pre_init_per_suite(_Suite,Config,State) -> + {Config, State#state{suite_total = 0, tcs = []}}. %% Called after end_per_suite. -post_end_per_suite(Suite,_Config,Return,State) -> - Data = {suites, Suite, State#state.suite_total, - lists:reverse(State#state.tcs)}, - {Return, State#state{data = [Data | State#state.data], - total = State#state.total + State#state.suite_total}}. +post_end_per_suite(Suite,_Config,Return,State) -> + Data = {suites, Suite, State#state.suite_total, + lists:reverse(State#state.tcs)}, + {Return, State#state{data = [Data | State#state.data], + total = State#state.total + State#state.suite_total}}. %% Called before each init_per_testcase. -pre_init_per_testcase(_Suite,_TC,Config,State) -> - Now = erlang:monotonic_time(microsecond), - {Config, State#state{ts = Now, suite_total = State#state.suite_total + 1}}. +pre_init_per_testcase(_Suite,_TC,Config,State) -> + Now = erlang:monotonic_time(microsecond), + {Config, State#state{ts = Now, suite_total = State#state.suite_total + 1}}. %% Called after each end_per_testcase. -post_end_per_testcase(Suite,TC,_Config,Return,State) -> - Now = erlang:monotonic_time(microsecond), - TCInfo = {testcase, Suite, TC, Return, Now - State#state.ts}, - {Return, State#state{ts = undefined, tcs = [TCInfo | State#state.tcs]}}. +post_end_per_testcase(Suite,TC,_Config,Return,State) -> + Now = erlang:monotonic_time(microsecond), + TCInfo = {testcase, Suite, TC, Return, Now - State#state.ts}, + {Return, State#state{ts = undefined, tcs = [TCInfo | State#state.tcs]}}. %% Called when a test case is skipped by either user action %% or due to an init function failing. -on_tc_skip(_Suite, _TC, _Reason, State) -> - State#state{skipped = State#state.skipped + 1}. +on_tc_skip(_Suite, _TC, _Reason, State) -> + State#state{skipped = State#state.skipped + 1}. %% Called when the scope of the CTH is done. -terminate(State) -> +terminate(State) -> %% use append to avoid data loss if the path is reused - {ok, File} = file:open(State#state.filename, [write, append]), - io:format(File, "~p.~n", [results(State)]), - file:close(File), + {ok, File} = file:open(State#state.filename, [write, append]), + io:format(File, "~p.~n", [results(State)]), + file:close(File), ok. -results(State) -> - #state{skipped = Skipped, data = Data, total = Total} = State, - #test_run{total = Total, skipped = Skipped, suites = lists:reverse(Data)}.

    +results(State) -> + #state{skipped = Skipped, data = Data, total = Total} = State, + #test_run{total = Total, skipped = Skipped, suites = lists:reverse(Data)}.

    @@ -493,7 +493,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_master.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_master.html 2025-05-10 20:19:03.381138527 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_master.html 2025-05-10 20:19:03.385138564 +0000 @@ -448,7 +448,7 @@

    Gets a reference to the Common Test master event manager. The reference can be -used to, for example, add a user-specific event handler while tests are running.

    Example:

    gen_event:add_handler(ct_master:get_event_mgr_ref(), my_ev_h, [])
    +used to, for example, add a user-specific event handler while tests are running.

    Example:

    gen_event:add_handler(ct_master:get_event_mgr_ref(), my_ev_h, [])
    @@ -798,7 +798,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_master_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_master_chapter.html 2025-05-10 20:19:03.409138781 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_master_chapter.html 2025-05-10 20:19:03.413138818 +0000 @@ -156,7 +156,7 @@ of test specifications. If it is a list, the specifications are handled (and the corresponding tests executed) in sequence. An element in a TestSpecs list can also be list of test specifications. The specifications in such a list are -merged into one combined specification before test execution.

    Example:

    ct_master:run(["ts1","ts2",["ts3","ts4"]])

    Here, the tests specified by "ts1" run first, then the tests specified by "ts2", +merged into one combined specification before test execution.

    Example:

    ct_master:run(["ts1","ts2",["ts3","ts4"]])

    Here, the tests specified by "ts1" run first, then the tests specified by "ts2", and finally the tests specified by both "ts3" and "ts4".

    The InclNodes argument to run/3 is a list of node names. Function run/3 runs the tests in TestSpecs just like run/1, but also takes any test in TestSpecs, which is not explicitly tagged with a particular node name, and @@ -196,32 +196,32 @@ install an event handler).

    Consider the example in section Test Specifications in section Running Tests and Analysing Results, now extended with node information and -intended to be executed by Common Test Master:

    {define, 'Top', "/home/test"}.
    -{define, 'T1', "'Top'/t1"}.
    -{define, 'T2', "'Top'/t2"}.
    -{define, 'T3', "'Top'/t3"}.
    -{define, 'CfgFile', "config.cfg"}.
    -{define, 'Node', ct_node}.
    -
    -{node, node1, 'Node@host_x'}.
    -{node, node2, 'Node@host_y'}.
    -
    -{logdir, master, "'Top'/master_logs"}.
    -{logdir, "'Top'/logs"}.
    -
    -{config, node1, "'T1'/'CfgFile'"}.
    -{config, node2, "'T2'/'CfgFile'"}.
    -{config, "'T3'/'CfgFile'"}.
    -
    -{suites, node1, 'T1', all}.
    -{skip_suites, node1, 'T1', [t1B_SUITE,t1D_SUITE], "Not implemented"}.
    -{skip_cases, node1, 'T1', t1A_SUITE, [test3,test4], "Irrelevant"}.
    -{skip_cases, node1, 'T1', t1C_SUITE, [test1], "Ignore"}.
    +intended to be executed by Common Test Master:

    {define, 'Top', "/home/test"}.
    +{define, 'T1', "'Top'/t1"}.
    +{define, 'T2', "'Top'/t2"}.
    +{define, 'T3', "'Top'/t3"}.
    +{define, 'CfgFile', "config.cfg"}.
    +{define, 'Node', ct_node}.
    +
    +{node, node1, 'Node@host_x'}.
    +{node, node2, 'Node@host_y'}.
    +
    +{logdir, master, "'Top'/master_logs"}.
    +{logdir, "'Top'/logs"}.
    +
    +{config, node1, "'T1'/'CfgFile'"}.
    +{config, node2, "'T2'/'CfgFile'"}.
    +{config, "'T3'/'CfgFile'"}.
    +
    +{suites, node1, 'T1', all}.
    +{skip_suites, node1, 'T1', [t1B_SUITE,t1D_SUITE], "Not implemented"}.
    +{skip_cases, node1, 'T1', t1A_SUITE, [test3,test4], "Irrelevant"}.
    +{skip_cases, node1, 'T1', t1C_SUITE, [test1], "Ignore"}.
     
    -{suites, node2, 'T2', [t2B_SUITE,t2C_SUITE]}.
    -{cases, node2, 'T2', t2A_SUITE, [test4,test1,test7]}.
    +{suites, node2, 'T2', [t2B_SUITE,t2C_SUITE]}.
    +{cases, node2, 'T2', t2A_SUITE, [test4,test1,test7]}.
     
    -{skip_suites, 'T3', all, "Not implemented"}.

    This example specifies the same tests as the original example. But now if +{skip_suites, 'T3', all, "Not implemented"}.

    This example specifies the same tests as the original example. But now if started with a call to ct_master:run(TestSpecName), test t1 is executed on node ct_node@host_x (node1), test t2 on ct_node@host_y (node2) and test t3 on both node1 and node2. Configuration file t1 is only read on @@ -244,13 +244,13 @@ Automatic Startup of Test Target Nodes

    Initial actions can be started and performed automatically on test target nodes -using test specification term init.

    Two subterms are supported, node_start and eval.

    Example:

    {node, node1, node1@host1}.
    -{node, node2, node1@host2}.
    -{node, node3, node2@host2}.
    -{node, node4, node1@host3}.
    -{init, node1, [{node_start, [{callback_module, my_slave_callback}]}]}.
    -{init, [node2, node3], {node_start, [{username, "ct_user"}, {password, "ct_password"}]}}.
    -{init, node4, {eval, {module, function, []}}}.

    This test specification declares that node1@host1 is to be started using the +using test specification term init.

    Two subterms are supported, node_start and eval.

    Example:

    {node, node1, node1@host1}.
    +{node, node2, node1@host2}.
    +{node, node3, node2@host2}.
    +{node, node4, node1@host3}.
    +{init, node1, [{node_start, [{callback_module, my_slave_callback}]}]}.
    +{init, [node2, node3], {node_start, [{username, "ct_user"}, {password, "ct_password"}]}}.
    +{init, node4, {eval, {module, function, []}}}.

    This test specification declares that node1@host1 is to be started using the user callback function callback_module:my_slave_callback/0, and nodes node1@host2 and node2@host2 are to be started with the default callback module ct_slave. The specified username and password are used to log on to @@ -314,7 +314,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_netconfc.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_netconfc.html 2025-05-10 20:19:03.461139253 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_netconfc.html 2025-05-10 20:19:03.481139434 +0000 @@ -137,7 +137,7 @@ to the server.

    Alternately, open/1,2 can be used to establish a single session on a dedicated connection. (Or, equivalently, only_open/1,2 followed by hello/1-3.)

    Connect/session options can be specified in a configuration file with entries -like the following.

    {server_id(), [option()]}.

    The server_id/0 or an associated ct:target_name/0 can then be passed to +like the following.

    {server_id(), [option()]}.

    The server_id/0 or an associated ct:target_name/0 can then be passed to the aforementioned functions to use the referenced configuration.

    Signaling

    Protocol operations in the NETCONF protocol are realized as remote procedure calls (RPCs) from client to server and a corresponding reply from server to client. RPCs are sent using like-named functions (eg. @@ -150,8 +150,8 @@ in most cases since a non-response by the server or a missing message-id causes the call to hang indefinitely.

    Logging

    The NETCONF server uses error_logger for logging of NETCONF traffic. A special purpose error handler is implemented in ct_conn_log_h. To use this error -handler, add the cth_conn_log hook in the test suite, for example:

    suite() ->
    -    [{ct_hooks, [{cth_conn_log, [{ct:conn_log_mod(), ct:conn_log_options()}]}]}].

    conn_log_mod() is the name of the Common Test module implementing the +handler, add the cth_conn_log hook in the test suite, for example:

    suite() ->
    +    [{ct_hooks, [{cth_conn_log, [{ct:conn_log_mod(), ct:conn_log_options()}]}]}].

    conn_log_mod() is the name of the Common Test module implementing the connection protocol, for example, ct_netconfc.

    Hook option log_type specifies the type of logging:

    • raw - The sent and received NETCONF data is logged to a separate text file "as is" without any formatting. A link to the file is added to the test case HTML log.

    • pretty - The sent and received NETCONF data is logged to a separate text @@ -162,17 +162,17 @@ option hosts and list the names of the servers/connections to be used in the suite. The connections must be named for this to work, that is, they must be opened with open/2.

      Option hosts has no effect if log_type is set to html or silent.

      The hook options can also be specified in a configuration file with -configuration variable ct_conn_log:

      {ct_conn_log,[{ct:conn_log_mod(), ct:conn_log_options()}]}.

      For example:

      {ct_conn_log,[{ct_netconfc,[{log_type,pretty},
      -                            {hosts,[ct:key_or_name()]}]}]}

      Note

      Hook options specified in a configuration file overwrite the hard-coded hook +configuration variable ct_conn_log:

      {ct_conn_log,[{ct:conn_log_mod(), ct:conn_log_options()}]}.

      For example:

      {ct_conn_log,[{ct_netconfc,[{log_type,pretty},
      +                            {hosts,[ct:key_or_name()]}]}]}

      Note

      Hook options specified in a configuration file overwrite the hard-coded hook options in the test suite.

      Logging Example 1:

      The following ct_hooks statement causes pretty printing of NETCONF traffic to separate logs for the connections named nc_server1 and nc_server2. Any other -connections are logged to default NETCONF log.

      suite() ->
      -   [{ct_hooks, [{cth_conn_log, [{ct_netconfc,[{log_type,pretty}},
      -                                              {hosts,[nc_server1,nc_server2]}]}
      -                               ]}]}].

      Connections must be opened as follows:

      open(nc_server1,[...]),
      -open(nc_server2,[...]).

      Logging Example 2:

      The following configuration file causes raw logging of all NETCONF traffic in to -one single text file:

      {ct_conn_log,[{ct_netconfc,[{log_type,raw}]}]}.

      The ct_hooks statement must look as follows:

      suite() ->
      -    [{ct_hooks, [{cth_conn_log, []}]}].

      The same ct_hooks statement without the configuration file would cause HTML +connections are logged to default NETCONF log.

      suite() ->
      +   [{ct_hooks, [{cth_conn_log, [{ct_netconfc,[{log_type,pretty}},
      +                                              {hosts,[nc_server1,nc_server2]}]}
      +                               ]}]}].

      Connections must be opened as follows:

      open(nc_server1,[...]),
      +open(nc_server2,[...]).

      Logging Example 2:

      The following configuration file causes raw logging of all NETCONF traffic in to +one single text file:

      {ct_conn_log,[{ct_netconfc,[{log_type,raw}]}]}.

      The ct_hooks statement must look as follows:

      suite() ->
      +    [{ct_hooks, [{cth_conn_log, []}]}].

      The same ct_hooks statement without the configuration file would cause HTML logging of all NETCONF connections in to the test case HTML log.

      @@ -2173,8 +2173,8 @@

      Edits configuration data.

      By default only the running target is available, unless the server includes :candidate or :startup in its list of capabilities.

      OptParams can be used for specifying optional parameters (default-operation, test-option, or error-option) to be added to the edit-config request. The -value must be a list containing valid simple XML, for example:

      [{'default-operation', ["none"]},
      - {'error-option', ["rollback-on-error"]}]

      If OptParams is not given, the default value [] is used.

      +value must be a list containing valid simple XML, for example:

      [{'default-operation', ["none"]},
      + {'error-option', ["rollback-on-error"]}]

      If OptParams is not given, the default value [] is used.

      @@ -3296,7 +3296,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_property_test.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_property_test.html 2025-05-10 20:19:03.513139724 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_property_test.html 2025-05-10 20:19:03.521139796 +0000 @@ -135,30 +135,30 @@ directory has a subdirectory property_test, where everything needed for the property tests are collected. The usual Erlang application directory structure is assumed.

      A typical Common Test test suite using ct_property_test is organized as -follows:

      -module(my_prop_test_SUITE).
      --compile(export_all).
      +follows:

      -module(my_prop_test_SUITE).
      +-compile(export_all).
       
      --include_lib("common_test/include/ct.hrl").
      +-include_lib("common_test/include/ct.hrl").
       
      -all() -> [prop_ftp_case].
      +all() -> [prop_ftp_case].
       
      -init_per_suite(Config) ->
      -    ct_property_test:init_per_suite(Config).
      +init_per_suite(Config) ->
      +    ct_property_test:init_per_suite(Config).
       
       %%%---- test case
      -prop_ftp_case(Config) ->
      -    ct_property_test:quickcheck(
      -      ftp_simple_client_server:prop_ftp(),
      +prop_ftp_case(Config) ->
      +    ct_property_test:quickcheck(
      +      ftp_simple_client_server:prop_ftp(),
             Config
      -     ).

      and the the property test module (in this example + ).

      and the the property test module (in this example ftp_simple_client_server.erl) as almost a usual property testing module (More -examples are in the User's Guide):

      -module(ftp_simple_client_server).
      --export([prop_ftp/0...]).
      +examples are in the User's Guide):

      -module(ftp_simple_client_server).
      +-export([prop_ftp/0...]).
       
      --include_lib("common_test/include/ct_property_test.hrl").
      +-include_lib("common_test/include/ct_property_test.hrl").
       
      -prop_ftp() ->
      -    ?FORALL( ....
      +
      prop_ftp() -> + ?FORALL( ....
      @@ -876,7 +876,7 @@ 'EQC', 'PROPER' or 'TRIQ' set, depending on which tool that is first found. This could make parts of the Erlang property tests code to be included or excluded with the macro directives -ifdef(Macro). or -ifndef(Macro)..

      The file(s) in the property_test subdirectory could, or should, include the -ct_property_test include file:

      -include_lib("common_test/include/ct_property_test.hrl").

      This included file will:

      • Include the correct tool's include file
      • Set the macro 'MOD_eqc' to the correct module name for the selected tool. +ct_property_test include file:

        -include_lib("common_test/include/ct_property_test.hrl").

        This included file will:

        • Include the correct tool's include file
        • Set the macro 'MOD_eqc' to the correct module name for the selected tool. That is, the macro 'MOD_eqc' is set to either eqc, proper or triq.
        @@ -987,8 +987,8 @@

        Presents the result of stateful (statem) property testing using the aggregate function in PropEr, QuickCheck or other similar property testing tool.

        It is assumed to be called inside the property called by quickcheck/2:

        ...
        -RunResult = run_parallel_commands(?MODULE, Cmds),
        -ct_property_test:present_result(?MODULE, Cmds, RunResult, Config)
        +RunResult = run_parallel_commands(?MODULE, Cmds),
        +ct_property_test:present_result(?MODULE, Cmds, RunResult, Config)
         ...

        See the User's Guide for an example of the usage and of the default printout.

        The StatisticsSpec is a list of the tuples:

        • {Title::string(), CollectFun::fun/1}
        • {Title::string(), FrequencyFun::/0, CollectFun::fun/1}

        Each tuple will produce one table in the order of their places in the list.

        • Title will be the title of one result table

        • CollectFun is called with one argument: the Cmds. It should return a list of the values to be counted. The following pre-defined functions exist:

          • ct_property_test:cmnd_names/1 returns a list of commands (function calls) @@ -998,15 +998,15 @@ about sequential and parallel parts from Tool:parallel_commands/1,2
        • FrequencyFun/0 returns a fun/1 which is supposed to take a list of items as input, and return an iolist which will be printed as the table. Per default, the number of each item is counted and the percentage is printed for each. The -list [a,b,a,a,c] could for example return

          ["a 60%\n","b 20%\n","c 20%\n"]

          which will be printed by the print_fun. The default print_fun will print +list [a,b,a,a,c] could for example return

          ["a 60%\n","b 20%\n","c 20%\n"]

          which will be printed by the print_fun. The default print_fun will print it as:

          a 60%
           b 20%
          -c 20%

        The default StatisticsSpec is:

        • For sequential commands:

          [{"Function calls", fun cmnd_names/1},
          - {"Length of command sequences", fun print_frequency_ranges/0,
          -                                                  fun num_calls/1}]
        • For parallel commands:

          [{"Distribution sequential/parallel", fun sequential_parallel/1},
          - {"Function calls", fun cmnd_names/1},
          - {"Length of command sequences", fun print_frequency_ranges/0,
          -                                                  fun num_calls/1}]
        +c 20%

    The default StatisticsSpec is:

    • For sequential commands:

      [{"Function calls", fun cmnd_names/1},
      + {"Length of command sequences", fun print_frequency_ranges/0,
      +                                                  fun num_calls/1}]
    • For parallel commands:

      [{"Distribution sequential/parallel", fun sequential_parallel/1},
      + {"Function calls", fun cmnd_names/1},
      + {"Length of command sequences", fun print_frequency_ranges/0,
      +                                                  fun num_calls/1}]
    @@ -1099,7 +1099,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_property_test_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_property_test_chapter.html 2025-05-10 20:19:03.541139978 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_property_test_chapter.html 2025-05-10 20:19:03.545140014 +0000 @@ -147,51 +147,51 @@ Introductory Example

    Assume that we want to test the lists:sort/1 function.

    We need a property to test the function. In normal way, we create -property_test/ct_prop.erl module in the test directory in our application:

    -module(ct_prop).
    --export([prop_sort/0]).
    +property_test/ct_prop.erl module in the test directory in our application:

    -module(ct_prop).
    +-export([prop_sort/0]).
     
     %%% This will include the .hrl file for the installed testing tool:
    --include_lib("common_test/include/ct_property_test.hrl").
    +-include_lib("common_test/include/ct_property_test.hrl").
     
     %%% The property we want to check:
     %%%   For all possibly unsorted lists,
     %%%   the result of lists:sort/1 is sorted.
    -prop_sort() ->
    -    ?FORALL(UnSorted, list(),
    -            is_sorted(lists:sort(UnSorted))
    -           ).
    +prop_sort() ->
    +    ?FORALL(UnSorted, list(),
    +            is_sorted(lists:sort(UnSorted))
    +           ).
     
     %%% Function to check that a list is sorted:
    -is_sorted([]) ->
    +is_sorted([]) ->
         true;
    -is_sorted([_]) ->
    +is_sorted([_]) ->
         true;
    -is_sorted([H1,H2|SortedTail]) when H1 =< H2 ->
    -    is_sorted([H2|SortedTail]);
    -is_sorted(_) ->
    -    false.

    We also need a CommonTest test suite:

    -module(ct_property_test_SUITE).
    --compile(export_all). % Only in tests!
    +is_sorted([H1,H2|SortedTail]) when H1 =< H2 ->
    +    is_sorted([H2|SortedTail]);
    +is_sorted(_) ->
    +    false.

    We also need a CommonTest test suite:

    -module(ct_property_test_SUITE).
    +-compile(export_all). % Only in tests!
     
    --include_lib("common_test/include/ct.hrl").
    +-include_lib("common_test/include/ct.hrl").
     
    -all() -> [prop_sort
    -         ].
    +all() -> [prop_sort
    +         ].
     
     %%% First prepare Config and compile the property tests for the found tool:
    -init_per_suite(Config) ->
    -    ct_property_test:init_per_suite(Config).
    +init_per_suite(Config) ->
    +    ct_property_test:init_per_suite(Config).
     
    -end_per_suite(Config) ->
    +end_per_suite(Config) ->
         Config.
     
     %%%================================================================
     %%% Test suites
     %%%
    -prop_sort(Config) ->
    -    ct_property_test:quickcheck(
    -      ct_prop:prop_sort(),
    +prop_sort(Config) ->
    +    ct_property_test:quickcheck(
    +      ct_prop:prop_sort(),
           Config
    -     ).

    We run it as usual, for example with ct_run in the OS shell:

    ..../test$ ct_run -suite ct_property_test_SUITE
    +     ).

    We run it as usual, for example with ct_run in the OS shell:

    ..../test$ ct_run -suite ct_property_test_SUITE
     .....
     Common Test: Running make in test directories...
     
    @@ -221,13 +221,13 @@
       A stateful testing example
     
     

    Assume a test that generates some parallel stateful commands, and runs 300 -tests:

    prop_parallel(Config) ->
    -    numtests(300,
    -             ?FORALL(Cmds, parallel_commands(?MODULE),
    +tests:

    prop_parallel(Config) ->
    +    numtests(300,
    +             ?FORALL(Cmds, parallel_commands(?MODULE),
                          begin
    -                         RunResult = run_parallel_commands(?MODULE, Cmds),
    -                         ct_property_test:present_result(?MODULE, Cmds, RunResult, Config)
    -                     end)).

    The ct_property_test:present_result/4 is a help function for printing some + RunResult = run_parallel_commands(?MODULE, Cmds), + ct_property_test:present_result(?MODULE, Cmds, RunResult, Config) + end)).

    The ct_property_test:present_result/4 is a help function for printing some statistics in the CommonTest log file.

    Our example test could for example be a simple test of an ftp server, where we perform get, put and delete requests, some of them in parallel. Per default, the result has three sections:

    *** User 2019-12-11 13:28:17.504 ***
    @@ -330,7 +330,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_rpc.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_rpc.html 2025-05-10 20:19:03.569140232 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_rpc.html 2025-05-10 20:19:03.573140268 +0000 @@ -573,7 +573,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_run_cmd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_run_cmd.html 2025-05-10 20:19:03.597140486 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_run_cmd.html 2025-05-10 20:19:03.597140486 +0000 @@ -251,10 +251,10 @@ Run Common Test in Interactive Mode
     ct_run -shell
    -  [-config ConfigFile1 ConfigFile2 ... ConfigFileN]
    -  [-userconfig CallbackModule1 ConfigString1 and CallbackModule2
    -   ConfigString2 and .. and CallbackModuleN ConfigStringN]
    -  [-decrypt_key Key] | [-decrypt_file KeyFile]

    + [-config ConfigFile1 ConfigFile2 ... ConfigFileN] + [-userconfig CallbackModule1 ConfigString1 and CallbackModule2 + ConfigString2 and .. and CallbackModuleN ConfigStringN] + [-decrypt_key Key] | [-decrypt_file KeyFile]

    @@ -309,7 +309,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_slave.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_slave.html 2025-05-10 20:19:03.621140703 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_slave.html 2025-05-10 20:19:03.625140740 +0000 @@ -567,7 +567,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_snmp.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_snmp.html 2025-05-10 20:19:03.657141030 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_snmp.html 2025-05-10 20:19:03.669141139 +0000 @@ -150,15 +150,15 @@ Optional.

  • {agent_target_param_def, [term()] | {data_dir_file, rel_path()}} - Optional.

  • Parameter MgrAgentConfName in the functions is to be a name you allocate in your test suite using a require statement. Example (where -MgrAgentConfName = snmp_mgr_agent):

    suite() -> [{require, snmp_mgr_agent, snmp}].

    or

    ct:require(snmp_mgr_agent, snmp).

    Notice that USM users are needed for SNMPv3 configuration and are not to be +MgrAgentConfName = snmp_mgr_agent):

    suite() -> [{require, snmp_mgr_agent, snmp}].

    or

    ct:require(snmp_mgr_agent, snmp).

    Notice that USM users are needed for SNMPv3 configuration and are not to be confused with users.

    SNMP traps, inform, and report messages are handled by the user callback module. For details, see the SNMP application.

    It is recommended to use the .hrl files created by the Erlang/OTP MIB compiler to define the Object Identifiers (OIDs). For example, to get the Erlang node -name from erlNodeTable in the OTP-MIB:

    Oid = ?erlNodeEntry ++ [?erlNodeName, 1]

    Furthermore, values can be set for SNMP application configuration parameters, +name from erlNodeTable in the OTP-MIB:

    Oid = ?erlNodeEntry ++ [?erlNodeName, 1]

    Furthermore, values can be set for SNMP application configuration parameters, config, server, net_if, and so on (for a list of valid parameters and types, see the User's Guide for the SNMP application). -This is done by defining a configuration data variable on the following form:

    {snmp_app, [{manager, [snmp_app_manager_params()]},
    -            {agent, [snmp_app_agent_params()]}]}.

    A name for the data must be allocated in the suite using require (see the +This is done by defining a configuration data variable on the following form:

    {snmp_app, [{manager, [snmp_app_manager_params()]},
    +            {agent, [snmp_app_agent_params()]}]}.

    A name for the data must be allocated in the suite using require (see the example above). Pass this name as argument SnmpAppConfName to ct_snmp:start/3. ct_snmp specifies default values for some SNMP application configuration parameters (such as {verbosity,trace} for @@ -1930,7 +1930,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_ssh.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_ssh.html 2025-05-10 20:19:03.729141683 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_ssh.html 2025-05-10 20:19:03.757141937 +0000 @@ -133,14 +133,14 @@ that have been started on existing SSH connections (that is, when the original connection type is ssh). Whenever the connection type is sftp, use the SSH connection reference only.

    The following options are valid for specifying an SSH/SFTP connection (that is, -can be used as configuration elements):

    [{ConnType, Addr},
    - {port, Port},
    - {user, UserName}
    - {password, Pwd}
    - {user_dir, String}
    - {public_key_alg, PubKeyAlg}
    - {connect_timeout, Timeout}
    - {key_cb, KeyCallbackMod}]

    ConnType = ssh | sftp.

    For other types, see ssh.

    All time-out parameters in ct_ssh functions are values in milliseconds.

    +can be used as configuration elements):

    [{ConnType, Addr},
    + {port, Port},
    + {user, UserName}
    + {password, Pwd}
    + {user_dir, String}
    + {public_key_alg, PubKeyAlg}
    + {connect_timeout, Timeout}
    + {key_cb, KeyCallbackMod}]

    ConnType = ssh | sftp.

    For other types, see ssh.

    All time-out parameters in ct_ssh functions are values in milliseconds.

    @@ -3872,7 +3872,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_suite.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_suite.html 2025-05-10 20:19:03.789142227 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_suite.html 2025-05-10 20:19:03.801142335 +0000 @@ -1653,7 +1653,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_telnet.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_telnet.html 2025-05-10 20:19:03.833142625 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_telnet.html 2025-05-10 20:19:03.845142734 +0000 @@ -136,14 +136,14 @@ true
  • Polling limit (max number of times to poll to get a remaining string terminated) = 0
  • Polling interval (sleep time between polls) = 1 second
  • The TCP_NODELAY option for the telnet socket is disabled (set to false) per default
  • These parameters can be modified by the user with the following configuration -term:

    {telnet_settings, [{connect_timeout,Millisec},
    -                   {command_timeout,Millisec},
    -                   {reconnection_attempts,N},
    -                   {reconnection_interval,Millisec},
    -                   {keep_alive,Bool},
    -                   {poll_limit,N},
    -                   {poll_interval,Millisec},
    -                   {tcp_nodelay,Bool}]}.

    Millisec = integer(), N = integer()

    Enter the telnet_settings term in a configuration file included in the test +term:

    {telnet_settings, [{connect_timeout,Millisec},
    +                   {command_timeout,Millisec},
    +                   {reconnection_attempts,N},
    +                   {reconnection_interval,Millisec},
    +                   {keep_alive,Bool},
    +                   {poll_limit,N},
    +                   {poll_interval,Millisec},
    +                   {tcp_nodelay,Bool}]}.

    Millisec = integer(), N = integer()

    Enter the telnet_settings term in a configuration file included in the test and ct_telnet retrieves the information automatically.

    keep_alive can be specified per connection, if necessary. For details, see unix_telnet.

    @@ -158,8 +158,8 @@ such as expect/3. However, ct_telnet can be configured to use a special purpose event handler, implemented in ct_conn_log_h, for logging all Telnet traffic. To use this handler, install a Common Test hook named -cth_conn_log. Example (using the test suite information function):

    suite() ->
    -    [{ct_hooks, [{cth_conn_log, [{conn_mod(),hook_options()}]}]}].

    conn_mod() is the name of the Common Test module implementing the connection +cth_conn_log. Example (using the test suite information function):

    suite() ->
    +    [{ct_hooks, [{cth_conn_log, [{conn_mod(),hook_options()}]}]}].

    conn_mod() is the name of the Common Test module implementing the connection protocol, that is, ct_telnet.

    The cth_conn_log hook performs unformatted logging of Telnet data to a separate text file. All Telnet communication is captured and printed, including any data sent from the server. The link to this text file is located at the top @@ -176,15 +176,15 @@ disabled, which results with no prefix data. If the value is set to full prefix contains timestamp and additonal information. If the value is set to short prefix includes only human readable timestamp.

    All cth_conn_log hook options described can also be specified in a -configuration file with configuration variable ct_conn_log.

    Example:

    {ct_conn_log, [{ct_telnet,[{log_type,raw},
    -                           {hosts,[key_or_name()]}]}]}

    Note

    Hook options specified in a configuration file overwrite any hard-coded hook +configuration file with configuration variable ct_conn_log.

    Example:

    {ct_conn_log, [{ct_telnet,[{log_type,raw},
    +                           {hosts,[key_or_name()]}]}]}

    Note

    Hook options specified in a configuration file overwrite any hard-coded hook options in the test suite.

    Logging Example:

    The following ct_hooks statement causes printing of Telnet traffic to separate logs for the connections server1 and server2. Traffic for any other -connections is logged in the default Telnet log.

    suite() ->
    -    [{ct_hooks,
    -      [{cth_conn_log, [{ct_telnet,[{hosts,[server1,server2]}]}]}]}].

    As previously explained, this specification can also be provided by an entry -like the following in a configuration file:

    {ct_conn_log, [{ct_telnet,[{hosts,[server1,server2]}]}]}.

    In this case the ct_hooks statement in the test suite can look as follows:

    suite() ->
    -    [{ct_hooks, [{cth_conn_log, []}]}].

    +connections is logged in the default Telnet log.

    suite() ->
    +    [{ct_hooks,
    +      [{cth_conn_log, [{ct_telnet,[{hosts,[server1,server2]}]}]}]}].

    As previously explained, this specification can also be provided by an entry +like the following in a configuration file:

    {ct_conn_log, [{ct_telnet,[{hosts,[server1,server2]}]}]}.

    In this case the ct_hooks statement in the test suite can look as follows:

    suite() ->
    +    [{ct_hooks, [{cth_conn_log, []}]}].

    @@ -893,9 +893,9 @@ instead of only one Match. Also HaltReason is returned.

  • sequence - All patterns must be matched in a sequence. A match is not concluded until all patterns are matched. This option can be interrupted by one or more HaltPatterns. MatchList is always returned, that is, a list of -Match instead of only one Match. Also HaltReason is returned.

  • Example 1:

    expect(Connection,[{abc,"ABC"},{xyz,"XYZ"}],[sequence,{halt,[{nnn,"NNN"}]}])

    First this tries to match "ABC", and then "XYZ", but if "NNN" appears, the +Match instead of only one Match. Also HaltReason is returned.

    Example 1:

    expect(Connection,[{abc,"ABC"},{xyz,"XYZ"}],[sequence,{halt,[{nnn,"NNN"}]}])

    First this tries to match "ABC", and then "XYZ", but if "NNN" appears, the function returns {error,{nnn,["NNN"]}}. If both "ABC" and "XYZ" are -matched, the function returns {ok,[AbcMatch,XyzMatch]}.

    Example 2:

    expect(Connection,[{abc,"ABC"},{xyz,"XYZ"}],[{repeat,2},{halt,[{nnn,"NNN"}]}])

    This tries to match "ABC" or "XYZ" twice. If "NNN" appears, the function +matched, the function returns {ok,[AbcMatch,XyzMatch]}.

    Example 2:

    expect(Connection,[{abc,"ABC"},{xyz,"XYZ"}],[{repeat,2},{halt,[{nnn,"NNN"}]}])

    This tries to match "ABC" or "XYZ" twice. If "NNN" appears, the function returns HaltReason = {nnn,["NNN"]}.

    Options repeat and sequence can be combined to match a sequence multiple times.

    @@ -1235,7 +1235,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_testspec.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_testspec.html 2025-05-10 20:19:03.865142915 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/ct_testspec.html 2025-05-10 20:19:03.869142952 +0000 @@ -239,7 +239,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/dependencies_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/dependencies_chapter.html 2025-05-10 20:19:03.889143133 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/dependencies_chapter.html 2025-05-10 20:19:03.897143206 +0000 @@ -161,65 +161,65 @@ start and stop functionality separately.) The configuration can also be implemented as a common function, maybe grouped with the start function. Finally, the testing of connecting and disconnecting a client can be grouped -into one test case. The resulting suite can look as follows:

    -module(my_server_SUITE).
    --compile(export_all).
    --include_lib("ct.hrl").
    +into one test case. The resulting suite can look as follows:

    -module(my_server_SUITE).
    +-compile(export_all).
    +-include_lib("ct.hrl").
     
     %%% init and end functions...
     
    -suite() -> [{require,my_server_cfg}].
    +suite() -> [{require,my_server_cfg}].
     
    -init_per_testcase(start_and_stop, Config) ->
    +init_per_testcase(start_and_stop, Config) ->
         Config;
     
    -init_per_testcase(config, Config) ->
    -    [{server_pid,start_server()} | Config];
    +init_per_testcase(config, Config) ->
    +    [{server_pid,start_server()} | Config];
     
    -init_per_testcase(_, Config) ->
    -    ServerPid = start_server(),
    -    configure_server(),
    -    [{server_pid,ServerPid} | Config].
    +init_per_testcase(_, Config) ->
    +    ServerPid = start_server(),
    +    configure_server(),
    +    [{server_pid,ServerPid} | Config].
     
    -end_per_testcase(start_and_stop, _) ->
    +end_per_testcase(start_and_stop, _) ->
         ok;
     
    -end_per_testcase(_, Config) ->
    -    ServerPid = proplists:get_value(server_pid, Config),
    -    stop_server(ServerPid).
    +end_per_testcase(_, Config) ->
    +    ServerPid = proplists:get_value(server_pid, Config),
    +    stop_server(ServerPid).
     
     %%% test cases...
     
    -all() -> [start_and_stop, config, connect_and_disconnect].
    +all() -> [start_and_stop, config, connect_and_disconnect].
     
     %% test that starting and stopping works
    -start_and_stop(_) ->
    -    ServerPid = start_server(),
    -    stop_server(ServerPid).
    +start_and_stop(_) ->
    +    ServerPid = start_server(),
    +    stop_server(ServerPid).
     
     %% configuration test
    -config(Config) ->
    -    ServerPid = proplists:get_value(server_pid, Config),
    -    configure_server(ServerPid).
    +config(Config) ->
    +    ServerPid = proplists:get_value(server_pid, Config),
    +    configure_server(ServerPid).
     
     %% test connecting and disconnecting client
    -connect_and_disconnect(Config) ->
    -    ServerPid = proplists:get_value(server_pid, Config),
    -    {ok,SessionId} = my_server:connect(ServerPid),
    -    ok = my_server:disconnect(ServerPid, SessionId).
    +connect_and_disconnect(Config) ->
    +    ServerPid = proplists:get_value(server_pid, Config),
    +    {ok,SessionId} = my_server:connect(ServerPid),
    +    ok = my_server:disconnect(ServerPid, SessionId).
     
     %%% common functions...
     
    -start_server() ->
    -    {ok,ServerPid} = my_server:start(),
    +start_server() ->
    +    {ok,ServerPid} = my_server:start(),
         ServerPid.
     
    -stop_server(ServerPid) ->
    -    ok = my_server:stop(),
    +stop_server(ServerPid) ->
    +    ok = my_server:stop(),
         ok.
     
    -configure_server(ServerPid) ->
    -    ServerCfgData = ct:get_config(my_server_cfg),
    -    ok = my_server:configure(ServerPid, ServerCfgData),
    +configure_server(ServerPid) ->
    +    ServerCfgData = ct:get_config(my_server_cfg),
    +    ok = my_server:configure(ServerPid, ServerCfgData),
         ok.

    @@ -247,40 +247,40 @@ data is to be saved by finction end_per_suite and read by function init_per_suite in the suite that follows. When passing data between suites, Saver carries the name -of the test suite.

    Example:

    -module(server_b_SUITE).
    --compile(export_all).
    --include_lib("ct.hrl").
    +of the test suite.

    Example:

    -module(server_b_SUITE).
    +-compile(export_all).
    +-include_lib("ct.hrl").
     
     %%% init and end functions...
     
    -init_per_suite(Config) ->
    +init_per_suite(Config) ->
         %% read config saved by previous test suite
    -    {server_a_SUITE,OldConfig} = proplists:get_value(saved_config, Config),
    +    {server_a_SUITE,OldConfig} = proplists:get_value(saved_config, Config),
         %% extract server identity (comes from server_a_SUITE)
    -    ServerId = proplists:get_value(server_id, OldConfig),
    -    SessionId = connect_to_server(ServerId),
    -    [{ids,{ServerId,SessionId}} | Config].
    +    ServerId = proplists:get_value(server_id, OldConfig),
    +    SessionId = connect_to_server(ServerId),
    +    [{ids,{ServerId,SessionId}} | Config].
     
    -end_per_suite(Config) ->
    +end_per_suite(Config) ->
         %% save config for server_c_SUITE (session_id and server_id)
    -    {save_config,Config}
    +    {save_config,Config}
     
     %%% test cases...
     
    -all() -> [allocate, deallocate].
    +all() -> [allocate, deallocate].
     
    -allocate(Config) ->
    -    {ServerId,SessionId} = proplists:get_value(ids, Config),
    -    {ok,Handle} = allocate_resource(ServerId, SessionId),
    +allocate(Config) ->
    +    {ServerId,SessionId} = proplists:get_value(ids, Config),
    +    {ok,Handle} = allocate_resource(ServerId, SessionId),
         %% save handle for deallocation test
    -    NewConfig = [{handle,Handle}],
    -    {save_config,NewConfig}.
    +    NewConfig = [{handle,Handle}],
    +    {save_config,NewConfig}.
     
    -deallocate(Config) ->
    -    {ServerId,SessionId} = proplists:get_value(ids, Config),
    -    {allocate,OldConfig} = proplists:get_value(saved_config, Config),
    -    Handle = proplists:get_value(handle, OldConfig),
    -    ok = deallocate_resource(ServerId, SessionId, Handle).

    To save Config data from a test case that is to be skipped, return tuple +deallocate(Config) -> + {ServerId,SessionId} = proplists:get_value(ids, Config), + {allocate,OldConfig} = proplists:get_value(saved_config, Config), + Handle = proplists:get_value(handle, OldConfig), + ok = deallocate_resource(ServerId, SessionId, Handle).

    To save Config data from a test case that is to be skipped, return tuple {skip_and_save,Reason,ConfigList}.

    The result is that the test case is skipped with Reason printed to the log file (as described earlier) and ConfigList is saved for the next test case. ConfigList can be read using proplists:get_value(saved_config, Config), as @@ -300,22 +300,22 @@ property. Test case groups are defined through function groups/0 in the test suite (for details, see section Test Case Groups.

    For example, to ensure that if allocate in server_b_SUITE crashes, -deallocate is skipped, the following sequence can be defined:

    groups() -> [{alloc_and_dealloc, [sequence], [alloc,dealloc]}].

    Assume that the suite contains the test case get_resource_status that is -independent of the other two cases, then function all can look as follows:

    all() -> [{group,alloc_and_dealloc}, get_resource_status].

    If alloc succeeds, dealloc is also executed. If alloc fails however, +deallocate is skipped, the following sequence can be defined:

    groups() -> [{alloc_and_dealloc, [sequence], [alloc,dealloc]}].

    Assume that the suite contains the test case get_resource_status that is +independent of the other two cases, then function all can look as follows:

    all() -> [{group,alloc_and_dealloc}, get_resource_status].

    If alloc succeeds, dealloc is also executed. If alloc fails however, dealloc is not executed but marked as SKIPPED in the HTML log. get_resource_status runs no matter what happens to the alloc_and_dealloc cases.

    Test cases in a sequence are executed in order until all succeed or one fails. If one fails, all following cases in the sequence are skipped. The cases in the sequence that have succeeded up to that point are reported as successful in the -log. Any number of sequences can be specified.

    Example:

    groups() -> [{scenarioA, [sequence], [testA1, testA2]},
    -             {scenarioB, [sequence], [testB1, testB2, testB3]}].
    +log. Any number of sequences can be specified.

    Example:

    groups() -> [{scenarioA, [sequence], [testA1, testA2]},
    +             {scenarioB, [sequence], [testB1, testB2, testB3]}].
     
    -all() -> [test1,
    +all() -> [test1,
               test2,
    -          {group,scenarioA},
    +          {group,scenarioA},
               test3,
    -          {group,scenarioB},
    -          test4].

    A sequence group can have subgroups. Such subgroups can have any property, that + {group,scenarioB}, + test4].

    A sequence group can have subgroups. Such subgroups can have any property, that is, they are not required to also be sequences. If you want the status of the subgroup to affect the sequence on the level above, return {return_group_result,Status} from @@ -373,7 +373,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/event_handler_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/event_handler_chapter.html 2025-05-10 20:19:03.921143423 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/event_handler_chapter.html 2025-05-10 20:19:03.925143459 +0000 @@ -168,12 +168,12 @@ ct_run -event_handler_init instead of -event_handler.

    Note

    All event handler modules must have gen_event behavior. These modules must be precompiled and their locations must be added explicitly to the Erlang code server search path (as in the previous example).

    An event_handler tuple in argument Opts has the following definition (see -ct:run_test/1):

    {event_handler,EventHandlers}
    +ct:run_test/1):

    {event_handler,EventHandlers}
     
    -EventHandlers = EH | [EH]
    -EH = atom() | {atom(),InitArgs} | {[atom()],InitArgs}
    -InitArgs = [term()]

    In the following example, two event handlers for the my_SUITE test are -installed:

    1> ct:run_test([{suite,"test/my_SUITE"},{event_handler,[my_evh1,{my_evh2,[node()]}]}]).

    Event handler my_evh1 is started with [] as argument to the init function. +EventHandlers = EH | [EH] +EH = atom() | {atom(),InitArgs} | {[atom()],InitArgs} +InitArgs = [term()]

    In the following example, two event handlers for the my_SUITE test are +installed:

    1> ct:run_test([{suite,"test/my_SUITE"},{event_handler,[my_evh1,{my_evh2,[node()]}]}]).

    Event handler my_evh1 is started with [] as argument to the init function. Event handler my_evh2 is started with the name of the current node in the init argument list.

    Event handlers can also be plugged in using one of the following test specification terms:

    • {event_handler, EventHandlers}
    • {event_handler, EventHandlers, InitArgs}
    • {event_handler, NodeRefs, EventHandlers}
    • {event_handler, NodeRefs, EventHandlers, InitArgs}

    EventHandlers is a list of module names. Before a test session starts, the @@ -323,7 +323,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/example_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/example_chapter.html 2025-05-10 20:19:03.949143677 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/example_chapter.html 2025-05-10 20:19:03.957143750 +0000 @@ -131,19 +131,19 @@ Test Suite Example

    -

    The following example test suite shows some tests of a database server:

    -module(db_data_type_SUITE).
    +

    The following example test suite shows some tests of a database server:

    -module(db_data_type_SUITE).
     
    --include_lib("common_test/include/ct.hrl").
    +-include_lib("common_test/include/ct.hrl").
     
     %% Test server callbacks
    --export([suite/0, all/0,
    +-export([suite/0, all/0,
              init_per_suite/1, end_per_suite/1,
    -         init_per_testcase/2, end_per_testcase/2]).
    +         init_per_testcase/2, end_per_testcase/2]).
     
     %% Test cases
    --export([string/1, integer/1]).
    +-export([string/1, integer/1]).
     
    --define(CONNECT_STR, "DSN=sqlserver;UID=alladin;PWD=sesame").
    +-define(CONNECT_STR, "DSN=sqlserver;UID=alladin;PWD=sesame").
     
     %%--------------------------------------------------------------------
     %% COMMON TEST CALLBACK FUNCTIONS
    @@ -158,8 +158,8 @@
     %% Description: Returns list of tuples to set default properties
     %%              for the suite.
     %%--------------------------------------------------------------------
    -suite() ->
    -    [{timetrap,{minutes,1}}].
    +suite() ->
    +    [{timetrap,{minutes,1}}].
     
     %%--------------------------------------------------------------------
     %% Function: init_per_suite(Config0) -> Config1
    @@ -169,10 +169,10 @@
     %%
     %% Description: Initialization before the suite.
     %%--------------------------------------------------------------------
    -init_per_suite(Config) ->
    -    {ok, Ref} = db:connect(?CONNECT_STR, []),
    -    TableName = db_lib:unique_table_name(),
    -    [{con_ref, Ref },{table_name, TableName}| Config].
    +init_per_suite(Config) ->
    +    {ok, Ref} = db:connect(?CONNECT_STR, []),
    +    TableName = db_lib:unique_table_name(),
    +    [{con_ref, Ref },{table_name, TableName}| Config].
     
     %%--------------------------------------------------------------------
     %% Function: end_per_suite(Config) -> term()
    @@ -182,9 +182,9 @@
     %%
     %% Description: Cleanup after the suite.
     %%--------------------------------------------------------------------
    -end_per_suite(Config) ->
    -    Ref = proplists:get_value(con_ref, Config),
    -    db:disconnect(Ref),
    +end_per_suite(Config) ->
    +    Ref = proplists:get_value(con_ref, Config),
    +    db:disconnect(Ref),
         ok.
     
     %%--------------------------------------------------------------------
    @@ -197,10 +197,10 @@
     %%
     %% Description: Initialization before each test case.
     %%--------------------------------------------------------------------
    -init_per_testcase(Case, Config) ->
    -    Ref = proplists:get_value(con_ref, Config),
    -    TableName = proplists:get_value(table_name, Config),
    -    ok = db:create_table(Ref, TableName, table_type(Case)),
    +init_per_testcase(Case, Config) ->
    +    Ref = proplists:get_value(con_ref, Config),
    +    TableName = proplists:get_value(table_name, Config),
    +    ok = db:create_table(Ref, TableName, table_type(Case)),
         Config.
     
     %%--------------------------------------------------------------------
    @@ -213,10 +213,10 @@
     %%
     %% Description: Cleanup after each test case.
     %%--------------------------------------------------------------------
    -end_per_testcase(_Case, Config) ->
    -    Ref = proplists:get_value(con_ref, Config),
    -    TableName = proplists:get_value(table_name, Config),
    -    ok = db:delete_table(Ref, TableName),
    +end_per_testcase(_Case, Config) ->
    +    Ref = proplists:get_value(con_ref, Config),
    +    TableName = proplists:get_value(table_name, Config),
    +    ok = db:delete_table(Ref, TableName),
         ok.
     
     %%--------------------------------------------------------------------
    @@ -231,28 +231,28 @@
     %% Description: Returns the list of groups and test cases that
     %%              are to be executed.
     %%--------------------------------------------------------------------
    -all() ->
    -    [string, integer].
    +all() ->
    +    [string, integer].
     
     
     %%--------------------------------------------------------------------
     %% TEST CASES
     %%--------------------------------------------------------------------
     
    -string(Config) ->
    -    insert_and_lookup(dummy_key, "Dummy string", Config).
    +string(Config) ->
    +    insert_and_lookup(dummy_key, "Dummy string", Config).
     
    -integer(Config) ->
    -    insert_and_lookup(dummy_key, 42, Config).
    +integer(Config) ->
    +    insert_and_lookup(dummy_key, 42, Config).
     
     
    -insert_and_lookup(Key, Value, Config) ->
    -    Ref = proplists:get_value(con_ref, Config),
    -    TableName = proplists:get_value(table_name, Config),
    -    ok = db:insert(Ref, TableName, Key, Value),
    -    [Value] = db:lookup(Ref, TableName, Key),
    -    ok = db:delete(Ref, TableName, Key),
    -    [] = db:lookup(Ref, TableName, Key),
    +insert_and_lookup(Key, Value, Config) ->
    +    Ref = proplists:get_value(con_ref, Config),
    +    TableName = proplists:get_value(table_name, Config),
    +    ok = db:insert(Ref, TableName, Key, Value),
    +    [Value] = db:lookup(Ref, TableName, Key),
    +    ok = db:delete(Ref, TableName, Key),
    +    [] = db:lookup(Ref, TableName, Key),
         ok.

    @@ -270,12 +270,12 @@ %%% %%% Created : %%%------------------------------------------------------------------- --module(example_SUITE). +-module(example_SUITE). %% Note: This directive should only be used in test suites. --compile(export_all). +-compile(export_all). --include_lib("common_test/include/ct.hrl"). +-include_lib("common_test/include/ct.hrl"). %%-------------------------------------------------------------------- %% COMMON TEST CALLBACK FUNCTIONS @@ -293,8 +293,8 @@ %% Note: The suite/0 function is only meant to be used to return %% default data values, not perform any other operations. %%-------------------------------------------------------------------- -suite() -> - [{timetrap,{minutes,10}}]. +suite() -> + [{timetrap,{minutes,10}}]. %%-------------------------------------------------------------------- %% Function: init_per_suite(Config0) -> @@ -310,7 +310,7 @@ %% Note: This function is free to add any key/value pairs to the Config %% variable, but should NOT alter/remove any existing entries. %%-------------------------------------------------------------------- -init_per_suite(Config) -> +init_per_suite(Config) -> Config. %%-------------------------------------------------------------------- @@ -321,7 +321,7 @@ %% %% Description: Cleanup after the suite. %%-------------------------------------------------------------------- -end_per_suite(_Config) -> +end_per_suite(_Config) -> ok. %%-------------------------------------------------------------------- @@ -337,7 +337,7 @@ %% %% Description: Initialization before each test case group. %%-------------------------------------------------------------------- -init_per_group(_GroupName, Config) -> +init_per_group(_GroupName, Config) -> Config. %%-------------------------------------------------------------------- @@ -351,7 +351,7 @@ %% %% Description: Cleanup after each test case group. %%-------------------------------------------------------------------- -end_per_group(_GroupName, _Config) -> +end_per_group(_GroupName, _Config) -> ok. /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/getting_started_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/getting_started_chapter.html 2025-05-10 20:19:03.977143931 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/getting_started_chapter.html 2025-05-10 20:19:03.981143966 +0000 @@ -169,14 +169,14 @@ the test suite module implements callback functions (mandatory or optional) for various purposes, for example:

    • Init/end configuration function for the test suite
    • Init/end configuration function for a test case
    • Init/end configuration function for a test case group
    • Test cases

    The configuration functions are optional. The following example is a test suite without configuration functions, including one simple test case, to check that -module mymod exists (that is, can be successfully loaded by the code server):

    -module(my1st_SUITE).
    --compile(export_all).
    +module mymod exists (that is, can be successfully loaded by the code server):

    -module(my1st_SUITE).
    +-compile(export_all).
     
    -all() ->
    -    [mod_exists].
    +all() ->
    +    [mod_exists].
     
    -mod_exists(_) ->
    -    {module,mymod} = code:load_file(mymod).

    If the operation fails, a bad match error occurs that terminates the test case.

    +mod_exists(_) -> + {module,mymod} = code:load_file(mymod).

    If the operation fails, a bad match error occurs that terminates the test case.

    @@ -189,33 +189,33 @@ through configuration functions on "lower level"). The data flow looks as follows:

    Configuration Data Flow in a Suite

    The following example shows a test suite that uses configuration functions to open and close a log file for the test cases (an operation that is unnecessary -and irrelevant to perform by each test case):

    -module(check_log_SUITE).
    --export([all/0, init_per_suite/1, end_per_suite/1]).
    --export([check_restart_result/1, check_no_errors/1]).
    +and irrelevant to perform by each test case):

    -module(check_log_SUITE).
    +-export([all/0, init_per_suite/1, end_per_suite/1]).
    +-export([check_restart_result/1, check_no_errors/1]).
     
    --define(value(Key,Config), proplists:get_value(Key,Config)).
    +-define(value(Key,Config), proplists:get_value(Key,Config)).
     
    -all() -> [check_restart_result, check_no_errors].
    +all() -> [check_restart_result, check_no_errors].
     
    -init_per_suite(InitConfigData) ->
    -    [{logref,open_log()} | InitConfigData].
    +init_per_suite(InitConfigData) ->
    +    [{logref,open_log()} | InitConfigData].
     
    -end_per_suite(ConfigData) ->
    -    close_log(?value(logref, ConfigData)).
    +end_per_suite(ConfigData) ->
    +    close_log(?value(logref, ConfigData)).
     
    -check_restart_result(ConfigData) ->
    -    TestData = read_log(restart, ?value(logref, ConfigData)),
    -    {match,_Line} = search_for("restart successful", TestData).
    +check_restart_result(ConfigData) ->
    +    TestData = read_log(restart, ?value(logref, ConfigData)),
    +    {match,_Line} = search_for("restart successful", TestData).
     
    -check_no_errors(ConfigData) ->
    -    TestData = read_log(all, ?value(logref, ConfigData)),
    -    case search_for("error", TestData) of
    -        {match,Line} -> ct:fail({error_found_in_log,Line});
    +check_no_errors(ConfigData) ->
    +    TestData = read_log(all, ?value(logref, ConfigData)),
    +    case search_for("error", TestData) of
    +        {match,Line} -> ct:fail({error_found_in_log,Line});
             nomatch -> ok
         end.

    The test cases verify, by parsing a log file, that our SUT has performed a successful restart and that no unexpected errors are printed.

    To execute the test cases in the recent test suite, type the following on the UNIX/Linux command line (assuming that the suite module is in the current -working directory):

    $ ct_run -dir .

    or:

    $ ct_run -suite check_log_SUITE

    To use the Erlang shell to run our test, you can evaluate the following call:

    1> ct:run_test([{dir, "."}]).

    or:

    1> ct:run_test([{suite, "check_log_SUITE"}]).

    The result from running the test is printed in log files in HTML format (stored +working directory):

    $ ct_run -dir .

    or:

    $ ct_run -suite check_log_SUITE

    To use the Erlang shell to run our test, you can evaluate the following call:

    1> ct:run_test([{dir, "."}]).

    or:

    1> ct:run_test([{suite, "check_log_SUITE"}]).

    The result from running the test is printed in log files in HTML format (stored in unique log directories on a different level). The following illustration shows the log file structure:

    HTML Log File Structure

    @@ -297,7 +297,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/install_chapter.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/install_chapter.html 2025-05-10 20:19:04.001144148 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/install_chapter.html 2025-05-10 20:19:04.005144185 +0000 @@ -190,7 +190,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/introduction.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/introduction.html 2025-05-10 20:19:04.025144366 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/introduction.html 2025-05-10 20:19:04.025144366 +0000 @@ -204,7 +204,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/notes.html 2025-05-10 20:19:04.089144946 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/notes.html 2025-05-10 20:19:04.069144765 +0000 @@ -2834,7 +2834,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/run_test_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/run_test_chapter.html 2025-05-10 20:19:04.133145345 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/run_test_chapter.html 2025-05-10 20:19:04.149145490 +0000 @@ -279,7 +279,7 @@

    With the ct_run flag, or ct:run_test/1 option group, one or more test case groups can be specified, optionally in combination with specific test cases. The -syntax for specifying groups on the command line is as follows:

    $ ct_run -group <group_names_or_paths> [-case <cases>]

    The syntax in the Erlang shell is as follows:

    1> ct:run_test([{group,GroupsNamesOrPaths}, {case,Cases}]).

    Parameter group_names_or_paths specifies one or more group names and/or one or +syntax for specifying groups on the command line is as follows:

    $ ct_run -group <group_names_or_paths> [-case <cases>]

    The syntax in the Erlang shell is as follows:

    1> ct:run_test([{group,GroupsNamesOrPaths}, {case,Cases}]).

    Parameter group_names_or_paths specifies one or more group names and/or one or more group paths. At startup, Common Test searches for matching groups in the group definitions tree (that is, the list returned from Suite:groups/0; for details, see section Test Case Groups.

    Given a group name, say g, Common Test searches for all paths leading to @@ -311,30 +311,30 @@ paths if an incomplete group path is specified.

    Note

    Group names and group paths can be combined with parameter group_names_or_paths. Each element is treated as an individual specification in combination with parameter cases. The following examples illustrates -this.

    Examples:

    -module(x_SUITE).
    +this.

    Examples:

    -module(x_SUITE).
     ...
     %% The group definitions:
    -groups() ->
    -  [{top1,[],[tc11,tc12,
    -             {sub11,[],[tc12,tc13]},
    -             {sub12,[],[tc14,tc15,
    -       		 {sub121,[],[tc12,tc16]}]}]},
    -
    -   {top2,[],[{group,sub21},{group,sub22}]},
    -   {sub21,[],[tc21,{group,sub2X2}]},
    -   {sub22,[],[{group,sub221},tc21,tc22,{group,sub2X2}]},
    -   {sub221,[],[tc21,tc23]},
    -   {sub2X2,[],[tc21,tc24]}].

    The following executes two tests, one for all cases and all subgroups under -top1, and one for all under top2:

    $ ct_run -suite "x_SUITE" -group all
    1> ct:run_test([{suite,"x_SUITE"}, {group,all}]).

    Using -group top1 top2, or {group,[top1,top2]} gives the same result.

    The following executes one test for all cases and subgroups under top1:

    $ ct_run -suite "x_SUITE" -group top1
    1> ct:run_test([{suite,"x_SUITE"}, {group,[top1]}]).

    The following runs a test executing tc12 in top1 and any subgroup under -top1 where it can be found (sub11 and sub121):

    $ ct_run -suite "x_SUITE" -group top1 -case tc12
    1> ct:run_test([{suite,"x_SUITE"}, {group,[top1]}, {testcase,[tc12]}]).

    The following executes tc12 only in group top1:

    $ ct_run -suite "x_SUITE" -group [top1] -case tc12
    1> ct:run_test([{suite,"x_SUITE"}, {group,[[top1]]}, {testcase,[tc12]}]).

    The following searches top1 and all its subgroups for tc16 resulting in that -this test case executes in group sub121:

    $ ct_run -suite "x_SUITE" -group top1 -case tc16
    1> ct:run_test([{suite,"x_SUITE"}, {group,[top1]}, {testcase,[tc16]}]).

    Using the specific path -group [sub121] or {group,[[sub121]]} gives the same +groups() -> + [{top1,[],[tc11,tc12, + {sub11,[],[tc12,tc13]}, + {sub12,[],[tc14,tc15, + {sub121,[],[tc12,tc16]}]}]}, + + {top2,[],[{group,sub21},{group,sub22}]}, + {sub21,[],[tc21,{group,sub2X2}]}, + {sub22,[],[{group,sub221},tc21,tc22,{group,sub2X2}]}, + {sub221,[],[tc21,tc23]}, + {sub2X2,[],[tc21,tc24]}].

    The following executes two tests, one for all cases and all subgroups under +top1, and one for all under top2:

    $ ct_run -suite "x_SUITE" -group all
    1> ct:run_test([{suite,"x_SUITE"}, {group,all}]).

    Using -group top1 top2, or {group,[top1,top2]} gives the same result.

    The following executes one test for all cases and subgroups under top1:

    $ ct_run -suite "x_SUITE" -group top1
    1> ct:run_test([{suite,"x_SUITE"}, {group,[top1]}]).

    The following runs a test executing tc12 in top1 and any subgroup under +top1 where it can be found (sub11 and sub121):

    $ ct_run -suite "x_SUITE" -group top1 -case tc12
    1> ct:run_test([{suite,"x_SUITE"}, {group,[top1]}, {testcase,[tc12]}]).

    The following executes tc12 only in group top1:

    $ ct_run -suite "x_SUITE" -group [top1] -case tc12
    1> ct:run_test([{suite,"x_SUITE"}, {group,[[top1]]}, {testcase,[tc12]}]).

    The following searches top1 and all its subgroups for tc16 resulting in that +this test case executes in group sub121:

    $ ct_run -suite "x_SUITE" -group top1 -case tc16
    1> ct:run_test([{suite,"x_SUITE"}, {group,[top1]}, {testcase,[tc16]}]).

    Using the specific path -group [sub121] or {group,[[sub121]]} gives the same result in this example.

    The following executes two tests, one including all cases and subgroups under -sub12, and one with only the test cases in sub12:

    $ ct_run -suite "x_SUITE" -group sub12 [sub12]
    1> ct:run_test([{suite,"x_SUITE"}, {group,[sub12,[sub12]]}]).

    In the following example, Common Test finds and executes two tests, one for +sub12, and one with only the test cases in sub12:

    $ ct_run -suite "x_SUITE" -group sub12 [sub12]
    1> ct:run_test([{suite,"x_SUITE"}, {group,[sub12,[sub12]]}]).

    In the following example, Common Test finds and executes two tests, one for the path from top2 to sub2X2 through sub21, and one from top2 to -sub2X2 through sub22:

    $ ct_run -suite "x_SUITE" -group sub2X2
    1> ct:run_test([{suite,"x_SUITE"}, {group,[sub2X2]}]).

    In the following example, by specifying the unique path +sub2X2 through sub22:

    $ ct_run -suite "x_SUITE" -group sub2X2
    1> ct:run_test([{suite,"x_SUITE"}, {group,[sub2X2]}]).

    In the following example, by specifying the unique path top2 -> sub21 -> sub2X2, only one test is executed. The second possible path, -from top2 to sub2X2 (from the former example) is discarded:

    $ ct_run -suite "x_SUITE" -group [sub21,sub2X2]
    1> ct:run_test([{suite,"x_SUITE"}, {group,[[sub21,sub2X2]]}]).

    The following executes only the test cases for sub22 and in reverse order -compared to the group definition:

    $ ct_run -suite "x_SUITE" -group [sub22] -case tc22 tc21
    1> ct:run_test([{suite,"x_SUITE"}, {group,[[sub22]]}, {testcase,[tc22,tc21]}]).

    If a test case belonging to a group (according to the group definition) is +from top2 to sub2X2 (from the former example) is discarded:

    $ ct_run -suite "x_SUITE" -group [sub21,sub2X2]
    1> ct:run_test([{suite,"x_SUITE"}, {group,[[sub21,sub2X2]]}]).

    The following executes only the test cases for sub22 and in reverse order +compared to the group definition:

    $ ct_run -suite "x_SUITE" -group [sub22] -case tc22 tc21
    1> ct:run_test([{suite,"x_SUITE"}, {group,[[sub22]]}, {testcase,[tc22,tc21]}]).

    If a test case belonging to a group (according to the group definition) is executed without a group specification, that is, simply by (using the command line):

    $ ct_run -suite "my_SUITE" -case my_tc

    or (using the Erlang shell):

    1> ct:run_test([{suite,"my_SUITE"}, {testcase,my_tc}]).

    then Common Test ignores the group definition and executes the test case in the scope of the test suite only (no group configuration functions are called).

    The group specification feature, as presented in this section, can also be used @@ -362,12 +362,12 @@ configuration data with ct:require/1,2. This is equivalent to a require statement in the Test Suite Information Function or in the -Test Case Information Function.

    Example:

    1> ct:require(unix_telnet, unix).
    +Test Case Information Function.

    Example:

    1> ct:require(unix_telnet, unix).
     ok
    -2> ct_telnet:open(unix_telnet).
    -{ok,<0.105.0>}
    -4> ct_telnet:cmd(unix_telnet, "ls .").
    -{ok,["ls .","file1  ...",...]}

    Everything that Common Test normally prints in the test case logs, are in the +2> ct_telnet:open(unix_telnet). +{ok,<0.105.0>} +4> ct_telnet:cmd(unix_telnet, "ls ."). +{ok,["ls .","file1 ...",...]}

    Everything that Common Test normally prints in the test case logs, are in the interactive mode written to a log named ctlog.html in directory ct_run.<timestamp>. A link to this file is available in the file named last_interactive.html in the directory from which you execute ct_run. @@ -454,8 +454,8 @@ included specification can either be joined with the source specification or used to produce a separate test run (as with start flag/option join_specs above).

    Example:

    %% In specification file "a.spec"
    -{specs, join, ["b.spec", "c.spec"]}.
    -{specs, separate, ["d.spec", "e.spec"]}.
    +{specs, join, ["b.spec", "c.spec"]}.
    +{specs, separate, ["d.spec", "e.spec"]}.
     %% Config and test terms follow
     ...

    In this example, the test terms defined in files "b.spec" and "c.spec" are joined with the terms in source specification "a.spec" (if any). The inclusion @@ -517,154 +517,154 @@ available start flags (as most flags have a corresponding configuration term)

  • Logging (for terms verbosity, stylesheet, basic_html and esc_chars)
  • External Configuration Data (for terms config and userconfig)
  • Event Handling (for the -event_handler term)
  • Common Test Hooks (for term ct_hooks)
  • Configuration terms:

    {merge_tests, Bool}.
    +event_handler term)
  • Common Test Hooks (for term ct_hooks)
  • Configuration terms:

    {merge_tests, Bool}.
     
    -{define, Constant, Value}.
    +{define, Constant, Value}.
     
    -{specs, InclSpecsOption, TestSpecs}.
    +{specs, InclSpecsOption, TestSpecs}.
     
    -{node, NodeAlias, Node}.
    +{node, NodeAlias, Node}.
     
    -{init, InitOptions}.
    -{init, [NodeAlias], InitOptions}.
    +{init, InitOptions}.
    +{init, [NodeAlias], InitOptions}.
     
    -{label, Label}.
    -{label, NodeRefs, Label}.
    +{label, Label}.
    +{label, NodeRefs, Label}.
     
    -{verbosity, VerbosityLevels}.
    -{verbosity, NodeRefs, VerbosityLevels}.
    +{verbosity, VerbosityLevels}.
    +{verbosity, NodeRefs, VerbosityLevels}.
     
    -{stylesheet, CSSFile}.
    -{stylesheet, NodeRefs, CSSFile}.
    +{stylesheet, CSSFile}.
    +{stylesheet, NodeRefs, CSSFile}.
     
    -{silent_connections, ConnTypes}.
    -{silent_connections, NodeRefs, ConnTypes}.
    +{silent_connections, ConnTypes}.
    +{silent_connections, NodeRefs, ConnTypes}.
     
    -{multiply_timetraps, N}.
    -{multiply_timetraps, NodeRefs, N}.
    +{multiply_timetraps, N}.
    +{multiply_timetraps, NodeRefs, N}.
     
    -{scale_timetraps, Bool}.
    -{scale_timetraps, NodeRefs, Bool}.
    +{scale_timetraps, Bool}.
    +{scale_timetraps, NodeRefs, Bool}.
     
    -{cover, CoverSpecFile}.
    -{cover, NodeRefs, CoverSpecFile}.
    +{cover, CoverSpecFile}.
    +{cover, NodeRefs, CoverSpecFile}.
     
    -{cover_stop, Bool}.
    -{cover_stop, NodeRefs, Bool}.
    +{cover_stop, Bool}.
    +{cover_stop, NodeRefs, Bool}.
     
    -{include, IncludeDirs}.
    -{include, NodeRefs, IncludeDirs}.
    +{include, IncludeDirs}.
    +{include, NodeRefs, IncludeDirs}.
     
    -{auto_compile, Bool},
    -{auto_compile, NodeRefs, Bool},
    +{auto_compile, Bool},
    +{auto_compile, NodeRefs, Bool},
     
    -{abort_if_missing_suites, Bool},
    -{abort_if_missing_suites, NodeRefs, Bool},
    +{abort_if_missing_suites, Bool},
    +{abort_if_missing_suites, NodeRefs, Bool},
     
    -{config, ConfigFiles}.
    -{config, ConfigDir, ConfigBaseNames}.
    -{config, NodeRefs, ConfigFiles}.
    -{config, NodeRefs, ConfigDir, ConfigBaseNames}.
    +{config, ConfigFiles}.
    +{config, ConfigDir, ConfigBaseNames}.
    +{config, NodeRefs, ConfigFiles}.
    +{config, NodeRefs, ConfigDir, ConfigBaseNames}.
     
    -{userconfig, {CallbackModule, ConfigStrings}}.
    -{userconfig, NodeRefs, {CallbackModule, ConfigStrings}}.
    +{userconfig, {CallbackModule, ConfigStrings}}.
    +{userconfig, NodeRefs, {CallbackModule, ConfigStrings}}.
     
    -{logdir, LogDir}.
    -{logdir, NodeRefs, LogDir}.
    +{logdir, LogDir}.
    +{logdir, NodeRefs, LogDir}.
     
    -{logopts, LogOpts}.
    -{logopts, NodeRefs, LogOpts}.
    +{logopts, LogOpts}.
    +{logopts, NodeRefs, LogOpts}.
     
    -{create_priv_dir, PrivDirOption}.
    -{create_priv_dir, NodeRefs, PrivDirOption}.
    +{create_priv_dir, PrivDirOption}.
    +{create_priv_dir, NodeRefs, PrivDirOption}.
     
    -{event_handler, EventHandlers}.
    -{event_handler, NodeRefs, EventHandlers}.
    -{event_handler, EventHandlers, InitArgs}.
    -{event_handler, NodeRefs, EventHandlers, InitArgs}.
    +{event_handler, EventHandlers}.
    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/search.html differs (HTML document, UTF-8 Unicode text)
    --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/search.html	2025-05-10 20:19:04.169145672 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/search.html	2025-05-10 20:19:04.173145708 +0000
    @@ -145,7 +145,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/test_structure_chapter.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/test_structure_chapter.html 2025-05-10 20:19:04.189145853 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/test_structure_chapter.html 2025-05-10 20:19:04.193145889 +0000 @@ -236,7 +236,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/unix_telnet.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/unix_telnet.html 2025-05-10 20:19:04.213146071 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/unix_telnet.html 2025-05-10 20:19:04.217146107 +0000 @@ -129,14 +129,14 @@

    Callback module for ct_telnet, for connecting to a Telnet server on a UNIX -host.

    It requires the following entry in the configuration file:

    {unix,[{telnet,HostNameOrIpAddress},
    -       {port,PortNum},                 % optional
    -       {username,UserName},
    -       {password,Password},
    -       {keep_alive,Bool}]}.            % optional

    To communicate through Telnet to the host specified by HostNameOrIpAddress, +host.

    It requires the following entry in the configuration file:

    {unix,[{telnet,HostNameOrIpAddress},
    +       {port,PortNum},                 % optional
    +       {username,UserName},
    +       {password,Password},
    +       {keep_alive,Bool}]}.            % optional

    To communicate through Telnet to the host specified by HostNameOrIpAddress, use the interface functions in ct_telnet, for example, open(Name) and cmd(Name,Cmd).

    Name is the name you allocated to the Unix host in your require statement, -for example:

    suite() -> [{require,Name,{unix,[telnet]}}].

    or

    ct:require(Name,{unix,[telnet]}).

    The "keep alive" activity (that is, that Common Test sends NOP to the server +for example:

    suite() -> [{require,Name,{unix,[telnet]}}].

    or

    ct:require(Name,{unix,[telnet]}).

    The "keep alive" activity (that is, that Common Test sends NOP to the server every 10 seconds if the connection is idle) can be enabled or disabled for one particular connection as described here. It can be disabled for all connections using telnet_settings (see ct_telnet).

    The {port,PortNum} tuple is optional and if omitted, default Telnet port 23 is @@ -296,7 +296,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/why_test_chapter.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/why_test_chapter.html 2025-05-10 20:19:04.237146287 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/why_test_chapter.html 2025-05-10 20:19:04.237146287 +0000 @@ -210,7 +210,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/write_test_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/write_test_chapter.html 2025-05-10 20:19:04.273146615 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.7/doc/html/write_test_chapter.html 2025-05-10 20:19:04.285146723 +0000 @@ -266,29 +266,29 @@ system configuration files, the test case is skipped.

    A required variable can also be given a default value to be used if the variable is not found in any configuration file. To specify a default value, add a tuple on the form {default_config,ConfigVariableName,Value} to the -test case information list (the position in the list is irrelevant).

    Examples:

    testcase1() ->
    -    [{require, ftp},
    -     {default_config, ftp, [{ftp, "my_ftp_host"},
    -                            {username, "aladdin"},
    -                            {password, "sesame"}]}}].
    testcase2() ->
    -    [{require, unix_telnet, unix},
    -     {require, {unix, [telnet, username, password]}},
    -     {default_config, unix, [{telnet, "my_telnet_host"},
    -                             {username, "aladdin"},
    -                             {password, "sesame"}]}}].

    For more information about require, see section +test case information list (the position in the list is irrelevant).

    Examples:

    testcase1() ->
    +    [{require, ftp},
    +     {default_config, ftp, [{ftp, "my_ftp_host"},
    +                            {username, "aladdin"},
    +                            {password, "sesame"}]}}].
    testcase2() ->
    +    [{require, unix_telnet, unix},
    +     {require, {unix, [telnet, username, password]}},
    +     {default_config, unix, [{telnet, "my_telnet_host"},
    +                             {username, "aladdin"},
    +                             {password, "sesame"}]}}].

    For more information about require, see section Requiring and Reading Configuration Data in section External Configuration Data and function ct:require/1/2.

    Note

    Specifying a default value for a required variable can result in a test case always getting executed. This might not be a desired behavior.

    If timetrap or require, or both, is not set specifically for a particular test case, default values specified by function -suite/0 are used.

    Tags other than the earlier mentioned are ignored by the test server.

    An example of a test case information function follows:

    reboot_node() ->
    -    [
    -     {timetrap,{seconds,60}},
    -     {require,interfaces},
    -     {userdata,
    -         [{description,"System Upgrade: RpuAddition Normal RebootNode"},
    -          {fts,"http://someserver.ericsson.se/test_doc4711.pdf"}]}
    -    ].

    +suite/0 are used.

    Tags other than the earlier mentioned are ignored by the test server.

    An example of a test case information function follows:

    reboot_node() ->
    +    [
    +     {timetrap,{seconds,60}},
    +     {require,interfaces},
    +     {userdata,
    +         [{description,"System Upgrade: RpuAddition Normal RebootNode"},
    +          {fts,"http://someserver.ericsson.se/test_doc4711.pdf"}]}
    +    ].

    @@ -302,14 +302,14 @@ Test Case Information Function and Test Case Groups.

    The following options can also be specified with the suite information list:

    An example of the suite information function follows:

    suite() ->
    -    [
    -     {timetrap,{minutes,10}},
    -     {require,global_names},
    -     {userdata,[{info,"This suite tests database transactions."}]},
    -     {silent_connections,[telnet]},
    -     {stylesheet,"db_testing.css"}
    -    ].

    +Silent Connections

    An example of the suite information function follows:

    suite() ->
    +    [
    +     {timetrap,{minutes,10}},
    +     {require,global_names},
    +     {userdata,[{info,"This suite tests database transactions."}]},
    +     {silent_connections,[telnet]},
    +     {stylesheet,"db_testing.css"}
    +    ].

    @@ -331,20 +331,20 @@ TCRepeatProps = [{repeat,N} | {repeat_until_ok,N} | {repeat_until_fail,N}]

    GroupName is the name of the group and must be unique within the test suite module. Groups can be nested, by including a group definition within the GroupsAndTestCases list of another group. Properties is the list of -execution properties for the group. The possible values are as follows:

    Properties = [parallel | sequence | Shuffle | {GroupRepeatType,N}]
    -Shuffle = shuffle | {shuffle,Seed}
    -Seed = {integer(),integer(),integer()}
    +execution properties for the group. The possible values are as follows:

    Properties = [parallel | sequence | Shuffle | {GroupRepeatType,N}]
    +Shuffle = shuffle | {shuffle,Seed}
    +Seed = {integer(),integer(),integer()}
     GroupRepeatType = repeat | repeat_until_all_ok | repeat_until_all_fail |
                       repeat_until_any_ok | repeat_until_any_fail
    -N = integer() | forever

    Explanations:

    • parallel - Common Test executes all test cases in the group in +N = integer() | forever

    Explanations:

    • parallel - Common Test executes all test cases in the group in parallel.

    • sequence - The cases are executed in a sequence as described in section Sequences in section Dependencies Between Test Cases and Suites.

    • shuffle - The cases in the group are executed in random order.

    • repeat, repeat_until_* - Orders Common Test to repeat execution of all the cases in the group a given number of times, or until any, or all, cases -fail or succeed.

    Example:

    groups() -> [{group1, [parallel], [test1a,test1b]},
    -             {group2, [shuffle,sequence], [test2a,test2b,test2c]}].

    To specify in which order groups are to be executed (also with respect to test +fail or succeed.

    Example:

    groups() -> [{group1, [parallel], [test1a,test1b]},
    +             {group2, [shuffle,sequence], [test2a,test2b,test2c]}].

    To specify in which order groups are to be executed (also with respect to test cases that are not part of any group), add tuples on the form -{group,GroupName} to the all/0 list.

    Example:

    all() -> [testcase1, {group,group1}, {testcase,testcase2,[{repeat,10}]}, {group,group2}].

    Execution properties with a group tuple in all/0: +{group,GroupName} to the all/0 list.

    Example:

    all() -> [testcase1, {group,group1}, {testcase,testcase2,[{repeat,10}]}, {group,group2}].

    Execution properties with a group tuple in all/0: {group,GroupName,Properties} can also be specified. These properties override those specified in the group definition (see groups/0 earlier). This way, the same set of tests can be run, but with different properties, without having to @@ -353,33 +353,33 @@ SubGroups is a list of tuples, {GroupName,Properties} or {GroupName,Properties,SubGroups} representing the subgroups. Any subgroups defined in groups/0 for a group, that are not specified in the SubGroups -list, executes with their predefined properties.

    Example:

    groups() -> [{tests1, [], [{tests2, [], [t2a,t2b]},
    -                          {tests3, [], [t31,t3b]}]}].

    To execute group tests1 twice with different properties for tests2 each -time:

    all() ->
    -   [{group, tests1, default, [{tests2, [parallel]}]},
    -    {group, tests1, default, [{tests2, [shuffle,{repeat,10}]}]}].

    This is equivalent to the following specification:

    all() ->
    -   [{group, tests1, default, [{tests2, [parallel]},
    -                              {tests3, default}]},
    -    {group, tests1, default, [{tests2, [shuffle,{repeat,10}]},
    -                              {tests3, default}]}].

    Value default states that the predefined properties are to be used.

    The following example shows how to override properties in a scenario with deeply -nested groups:

    groups() ->
    -   [{tests1, [], [{group, tests2}]},
    -    {tests2, [], [{group, tests3}]},
    -    {tests3, [{repeat,2}], [t3a,t3b,t3c]}].
    -
    -all() ->
    -   [{group, tests1, default,
    -     [{tests2, default,
    -       [{tests3, [parallel,{repeat,100}]}]}]}].

    For ease of readability, all syntax definitions can be replaced by a function -call whose return value should match the expected syntax case.

    Example:

    all() ->
    -   [{group, tests1, default, test_cases()},
    -    {group, tests1, default, [shuffle_test(),
    -                              {tests3, default}]}].
    -test_cases() ->
    -   [{tests2, [parallel]}, {tests3, default}].
    +list, executes with their predefined properties.

    Example:

    groups() -> [{tests1, [], [{tests2, [], [t2a,t2b]},
    +                          {tests3, [], [t31,t3b]}]}].

    To execute group tests1 twice with different properties for tests2 each +time:

    all() ->
    +   [{group, tests1, default, [{tests2, [parallel]}]},
    +    {group, tests1, default, [{tests2, [shuffle,{repeat,10}]}]}].

    This is equivalent to the following specification:

    all() ->
    +   [{group, tests1, default, [{tests2, [parallel]},
    +                              {tests3, default}]},
    +    {group, tests1, default, [{tests2, [shuffle,{repeat,10}]},
    +                              {tests3, default}]}].

    Value default states that the predefined properties are to be used.

    The following example shows how to override properties in a scenario with deeply +nested groups:

    groups() ->
    +   [{tests1, [], [{group, tests2}]},
    +    {tests2, [], [{group, tests3}]},
    +    {tests3, [{repeat,2}], [t3a,t3b,t3c]}].
    +
    +all() ->
    +   [{group, tests1, default,
    +     [{tests2, default,
    +       [{tests3, [parallel,{repeat,100}]}]}]}].

    For ease of readability, all syntax definitions can be replaced by a function +call whose return value should match the expected syntax case.

    Example:

    all() ->
    +   [{group, tests1, default, test_cases()},
    +    {group, tests1, default, [shuffle_test(),
    +                              {tests3, default}]}].
    +test_cases() ->
    +   [{tests2, [parallel]}, {tests3, default}].
     
    -shuffle_test() ->
    -   {tests2, [shuffle,{repeat,10}]}.

    The described syntax can also be used in test specifications to change group +shuffle_test() -> + {tests2, [shuffle,{repeat,10}]}.

    The described syntax can also be used in test specifications to change group properties at the time of execution, without having to edit the test suite. For more information, see section Test Specifications in section @@ -405,13 +405,13 @@ bottom of the log for end_per_group/2.

    Test case groups can be nested so sets of groups can be configured with the same init_per_group/2 and end_per_group/2 functions. Nested groups can be defined by including a group definition, or a group name reference, in the test case -list of another group.

    Example:

    groups() -> [{group1, [shuffle], [test1a,
    -                                  {group2, [], [test2a,test2b]},
    -                                  test1b]},
    -             {group3, [], [{group,group4},
    -                           {group,group5}]},
    -             {group4, [parallel], [test4a,test4b]},
    -             {group5, [sequence], [test5a,test5b,test5c]}].

    In the previous example, if all/0 returns group name references in the order +list of another group.

    Example:

    groups() -> [{group1, [shuffle], [test1a,
    +                                  {group2, [], [test2a,test2b]},
    +                                  test1b]},
    +             {group3, [], [{group,group4},
    +                           {group,group5}]},
    +             {group4, [parallel], [test4a,test4b]},
    +             {group5, [sequence], [test5a,test5b,test5c]}].

    In the previous example, if all/0 returns group name references in the order [{group,group1},{group,group3}], the order of the configuration functions and test cases becomes the following (notice that init_per_testcase/2 and end_per_testcase/2: are also always called, but not included in this example @@ -484,25 +484,25 @@ account by Common Test when evaluating if execution of a group is to be repeated or not (unless the basic repeat property is used).

    The value of tc_group_properties is a list of status tuples, each with the key ok, skipped, and failed. The value of a status tuple is a list with names -of test cases that have been executed with the corresponding status as result.

    The following is an example of how to return the status from a group:

    end_per_group(_Group, Config) ->
    -    Status = proplists:get_value(tc_group_result, Config),
    -    case proplists:get_value(failed, Status) of
    -        [] ->                                   % no failed cases
    -            {return_group_result,ok};
    +of test cases that have been executed with the corresponding status as result.

    The following is an example of how to return the status from a group:

    end_per_group(_Group, Config) ->
    +    Status = proplists:get_value(tc_group_result, Config),
    +    case proplists:get_value(failed, Status) of
    +        [] ->                                   % no failed cases
    +            {return_group_result,ok};
             _Failed ->                              % one or more failed
    -            {return_group_result,failed}
    +            {return_group_result,failed}
         end.

    It is also possible, in end_per_group/2, to check the status of a subgroup /usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/404.html 2025-05-10 20:19:04.305146905 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/404.html 2025-05-10 20:19:04.305146905 +0000 @@ -147,7 +147,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/api-reference.html 2025-05-10 20:19:04.321147049 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/api-reference.html 2025-05-10 20:19:04.325147085 +0000 @@ -212,7 +212,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/beam_ssa.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/beam_ssa.html 2025-05-10 20:19:04.345147267 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/beam_ssa.html 2025-05-10 20:19:04.349147303 +0000 @@ -188,8 +188,8 @@
    br ^common_end_of_catch common_end_of_catch: - @tmp = phi { @catched_val, ^landing_pad_block }, - { @successful_result, ^protected_blockN } + @tmp = phi { @catched_val, ^landing_pad_block }, + { @successful_result, ^protected_blockN } @result_of_catch_expr = catch_end @tag, @tmp

    Just as for a try-catch expression all code that can cause an exception in one of the protected blocks must have explicit control flow edges to the landing pad block.

    @@ -234,7 +234,7 @@ Variable Naming

    A variable name in BEAM SSA is either an atom or a non-negative -integer:

    atom() | non_neg_integer()

    In order to generate fresh unused variable names, all compiler +integer:

    atom() | non_neg_integer()

    In order to generate fresh unused variable names, all compiler transforms maintain a counter, the cnt-field in the b_function and opt_st records, which is incremented each time a new variable or label is created. In the following description the value of the @@ -292,7 +292,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/cerl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/cerl.html 2025-05-10 20:19:04.461148319 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/cerl.html 2025-05-10 20:19:04.529148936 +0000 @@ -11556,7 +11556,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/cerl_clauses.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/cerl_clauses.html 2025-05-10 20:19:04.561149226 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/cerl_clauses.html 2025-05-10 20:19:04.565149262 +0000 @@ -676,7 +676,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/cerl_trees.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/cerl_trees.html 2025-05-10 20:19:04.589149479 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/cerl_trees.html 2025-05-10 20:19:04.597149552 +0000 @@ -733,7 +733,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/compile.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/compile.html 2025-05-10 20:19:04.629149842 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/compile.html 2025-05-10 20:19:04.641149951 +0000 @@ -153,7 +153,7 @@

    Options given in the compile() attribute in the source code take precedence over options given to the compiler, which in turn take precedence over options given in the environment.

    A later compiler option takes precedence over an earlier one in the -option list. Example:

    compile:file(something, [nowarn_missing_spec,warn_missing_spec]).

    Warnings will be emitted for functions without specifications, unless +option list. Example:

    compile:file(something, [nowarn_missing_spec,warn_missing_spec]).

    Warnings will be emitted for functions without specifications, unless the source code for module something contains a compile(nowarn_missing_spec) attribute.

    Change

    In Erlang/OTP 26 and earlier, the option order was the opposite of what is described here.

    @@ -177,14 +177,14 @@ which functions to inline, or {inline,[{Name,Arity},...]} to have the compiler inline all calls to the given functions. If the option is given inside a compile directive in an Erlang module, {Name,Arity} can be written as -Name/Arity.

    Example of explicit inlining:

    -compile({inline,[pi/0]}).
    +Name/Arity.

    Example of explicit inlining:

    -compile({inline,[pi/0]}).
     
    -pi() -> 3.1416.

    Example of implicit inlining:

    -compile(inline).

    The option {inline_size,Size} controls how large functions that are allowed to +pi() -> 3.1416.

    Example of implicit inlining:

    -compile(inline).

    The option {inline_size,Size} controls how large functions that are allowed to be inlined. Default is 24, which keeps the size of the inlined code roughly the same as the un-inlined version (only relatively small functions are inlined).

    Example:

    %% Aggressive inlining - will increase code size.
    --compile(inline).
    --compile({inline_size,100}).

    +-compile(inline). +-compile({inline_size,100}).

    @@ -932,10 +932,10 @@ function definitions. This is the preferred method of enabling and disabling features, since it is a local property of a module.

  • makedep - Produces a Makefile rule to track headers dependencies. No object file is produced.

    By default, this rule is written to <File>.Pbeam. However, if option -binary is set, nothing is written and the rule is returned in Binary.

    The output will be encoded in UTF-8.

    For example, if you have the following module:

    -module(module).
    +binary is set, nothing is written and the rule is returned in Binary.

    The output will be encoded in UTF-8.

    For example, if you have the following module:

    -module(module).
     
    --include_lib("eunit/include/eunit.hrl").
    --include("header.hrl").

    The Makefile rule generated by this option looks as follows:

    module.beam: module.erl \
    +-include_lib("eunit/include/eunit.hrl").
    +-include("header.hrl").

    The Makefile rule generated by this option looks as follows:

    module.beam: module.erl \
       /usr/local/lib/erlang/lib/eunit/include/eunit.hrl \
       header.hrl
  • makedep_side_effect - The dependencies are created as a side effect to the normal compilation process. This means that the object file will also be @@ -1001,7 +1001,7 @@ before Erlang/OTP R14A when calling a local function with the same name as an auto-imported BIF without module prefix.

    If the BIF is to be called, use the erlang module prefix in the call, not {no_auto_import,[{F,A}, ...]}.

    If this option is written in the source code, as a -compile directive, the -syntax F/A can be used instead of {F,A}. For example:

    -compile({no_auto_import,[error/1]}).
  • no_auto_import - Do not auto-import any functions from erlang module.

  • no_line_info - Omits line number information to produce a slightly +syntax F/A can be used instead of {F,A}. For example:

    -compile({no_auto_import,[error/1]}).
  • no_auto_import - Do not auto-import any functions from erlang module.

  • no_line_info - Omits line number information to produce a slightly smaller output file.

  • no_lint - Skips the pass that checks for errors and warnings. Only applicable together with the from_abstr option. This is mainly for implementations of other languages on top of Erlang, which have already done @@ -1371,7 +1371,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/compiler.epub/OEBPS/beam_ssa.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/compiler.epub/OEBPS/beam_ssa.xhtml 2025-05-10 20:19:04.669150204 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/compiler.epub/OEBPS/beam_ssa.xhtml 2025-05-10 20:19:04.677150277 +0000 @@ -83,8 +83,8 @@ br ^common_end_of_catch common_end_of_catch: - @tmp = phi { @catched_val, ^landing_pad_block }, - { @successful_result, ^protected_blockN } + @tmp = phi { @catched_val, ^landing_pad_block }, + { @successful_result, ^protected_blockN } @result_of_catch_expr = catch_end @tag, @tmp
  • Just as for a try-catch expression all code that can cause an exception in one of the protected blocks must have explicit control flow edges to the landing pad block.

    @@ -129,7 +129,7 @@ Variable Naming

    A variable name in BEAM SSA is either an atom or a non-negative -integer:

    atom() | non_neg_integer()

    In order to generate fresh unused variable names, all compiler +integer:

    atom() | non_neg_integer()

    In order to generate fresh unused variable names, all compiler transforms maintain a counter, the cnt-field in the b_function and opt_st records, which is incremented each time a new variable or label is created. In the following description the value of the /usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/compiler.epub/OEBPS/compile.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/compiler.epub/OEBPS/compile.xhtml 2025-05-10 20:19:04.669150204 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/compiler.epub/OEBPS/compile.xhtml 2025-05-10 20:19:04.673150241 +0000 @@ -48,7 +48,7 @@

    Options given in the compile() attribute in the source code take precedence over options given to the compiler, which in turn take precedence over options given in the environment.

    A later compiler option takes precedence over an earlier one in the -option list. Example:

    compile:file(something, [nowarn_missing_spec,warn_missing_spec]).

    Warnings will be emitted for functions without specifications, unless +option list. Example:

    compile:file(something, [nowarn_missing_spec,warn_missing_spec]).

    Warnings will be emitted for functions without specifications, unless the source code for module something contains a compile(nowarn_missing_spec) attribute.

    Change

    In Erlang/OTP 26 and earlier, the option order was the opposite of what is described here.

    @@ -72,14 +72,14 @@ which functions to inline, or {inline,[{Name,Arity},...]} to have the compiler inline all calls to the given functions. If the option is given inside a compile directive in an Erlang module, {Name,Arity} can be written as -Name/Arity.

    Example of explicit inlining:

    -compile({inline,[pi/0]}).
    +Name/Arity.

    Example of explicit inlining:

    -compile({inline,[pi/0]}).
     
    -pi() -> 3.1416.

    Example of implicit inlining:

    -compile(inline).

    The option {inline_size,Size} controls how large functions that are allowed to +pi() -> 3.1416.

    Example of implicit inlining:

    -compile(inline).

    The option {inline_size,Size} controls how large functions that are allowed to be inlined. Default is 24, which keeps the size of the inlined code roughly the same as the un-inlined version (only relatively small functions are inlined).

    Example:

    %% Aggressive inlining - will increase code size.
    --compile(inline).
    --compile({inline_size,100}).

    +-compile(inline). +-compile({inline_size,100}).

    @@ -811,10 +811,10 @@ function definitions. This is the preferred method of enabling and disabling features, since it is a local property of a module.

  • makedep - Produces a Makefile rule to track headers dependencies. No object file is produced.

    By default, this rule is written to <File>.Pbeam. However, if option -binary is set, nothing is written and the rule is returned in Binary.

    The output will be encoded in UTF-8.

    For example, if you have the following module:

    -module(module).
    +binary is set, nothing is written and the rule is returned in Binary.

    The output will be encoded in UTF-8.

    For example, if you have the following module:

    -module(module).
     
    --include_lib("eunit/include/eunit.hrl").
    --include("header.hrl").

    The Makefile rule generated by this option looks as follows:

    module.beam: module.erl \
    +-include_lib("eunit/include/eunit.hrl").
    +-include("header.hrl").

    The Makefile rule generated by this option looks as follows:

    module.beam: module.erl \
       /usr/local/lib/erlang/lib/eunit/include/eunit.hrl \
       header.hrl
  • makedep_side_effect - The dependencies are created as a side effect to the normal compilation process. This means that the object file will also be @@ -880,7 +880,7 @@ before Erlang/OTP R14A when calling a local function with the same name as an auto-imported BIF without module prefix.

    If the BIF is to be called, use the erlang module prefix in the call, not {no_auto_import,[{F,A}, ...]}.

    If this option is written in the source code, as a -compile directive, the -syntax F/A can be used instead of {F,A}. For example:

    -compile({no_auto_import,[error/1]}).
  • no_auto_import - Do not auto-import any functions from erlang module.

  • no_line_info - Omits line number information to produce a slightly +syntax F/A can be used instead of {F,A}. For example:

    -compile({no_auto_import,[error/1]}).
  • no_auto_import - Do not auto-import any functions from erlang module.

  • no_line_info - Omits line number information to produce a slightly smaller output file.

  • no_lint - Skips the pass that checks for errors and warnings. Only applicable together with the from_abstr option. This is mainly for implementations of other languages on top of Erlang, which have already done /usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/compiler.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/compiler.epub/OEBPS/content.opf 2025-05-10 20:19:04.669150204 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/compiler.epub/OEBPS/content.opf 2025-05-10 20:19:04.673150241 +0000 @@ -4,10 +4,10 @@ version="3.0"> compiler - 8.6.1 - urn:uuid:54d97bdf-9f6b-b4fb-1ab6-1aeaa657e44b + urn:uuid:b0484746-ae80-9085-8717-4297aeabe35f en - 2025-05-10T20:10:20Z + 2041-06-12T09:30:28Z /usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/compiler.epub/OEBPS/notes.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/compiler.epub/OEBPS/notes.xhtml 2025-05-10 20:19:04.669150204 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/compiler.epub/OEBPS/notes.xhtml 2025-05-10 20:19:04.673150241 +0000 @@ -70,8 +70,8 @@

    • Fixed a crash in the common sub-expression elimination pass.

      Own Id: OTP-19243 Aux Id: GH-8818, PR-8838

    • Fixed a bug where bogus code was generated for consecutive calls to erlang:setelement/2, potentially crashing the runtime system.

      Own Id: OTP-19270 Aux Id: GH-8783, PR-8898

    • When the line_coverage option was used, exceptions could show the wrong line for where the exception was raised.

      Own Id: OTP-19282 Aux Id: PR-8907

    • The line_coverage option would be ignored if given in a compile() attribute within a module.

      Own Id: OTP-19309 Aux Id: GH-8942, PR-8970

    • A segment matching a float in a binary generator will now skip any invalid float (such as a NaN) and continue matching the rest of the binary. Before this correction, the comprehension would stop as soon as an invalid float was encountered.

      Example:

      1> BadFloat = <<-1:64>>.
       <<"ÿÿÿÿÿÿÿÿ">>
      -2> [X || <<X:64/float>> <= <<0.0/float,BadFloat/binary,42.0/float>>].
      -[0.0,42.0]

      Own Id: OTP-19331 Aux Id: PR-8978

    +2> [X || <<X:64/float>> <= <<0.0/float,BadFloat/binary,42.0/float>>]. +[0.0,42.0]

    Own Id: OTP-19331 Aux Id: PR-8978

    @@ -119,13 +119,13 @@ Fixed Bugs and Malfunctions

    -
    • Generators for binary comprehensions could be evaluated before it was known that they would be needed. That could result in a binary comprehensions failing if a generator that should not be evaluated until later failed.

      As an example, consider this module:

      -module(t).
      --export([f/0]).
      +
      • Generators for binary comprehensions could be evaluated before it was known that they would be needed. That could result in a binary comprehensions failing if a generator that should not be evaluated until later failed.

        As an example, consider this module:

        -module(t).
        +-export([f/0]).
         
        -f() ->
        -    <<0 || _ <- [], _ <- ok, false>>.

        In Erlang/OTP 26 it would fail like so:

        1> t:f().
        +f() ->
        +    <<0 || _ <- [], _ <- ok, false>>.

        In Erlang/OTP 26 it would fail like so:

        1> t:f().
         ** exception error: bad generator ok
        -     in function  t:f/0 (t.erl, line 6)

        In Erlang/OTP 27 it returns an empty binary:

        1> t:f().
        +     in function  t:f/0 (t.erl, line 6)

        In Erlang/OTP 27 it returns an empty binary:

        1> t:f().
         <<>>

        Own Id: OTP-18703 Aux Id: GH-7494, PR-7538

      • The documentation for the preprocessor now mentions that defined(Name) can be called in the condition for an -if or -elif directive to test whether Name is the name of a defined macro. (This feature was implemented in OTP 21.)

        If a function call in an -if or -elif with a name that is not the name of a guard BIF, there would not be a compilation error, but would instead cause the lines following the directive to be skipped. This has now been changed to be a compilation error.

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-18784 Aux Id: GH-7706, PR-7726

      @@ -133,39 +133,39 @@ Improvements and New Features

      Own Id: OTP-18680 Aux Id: PR-7491, PR-8086, ERIERL-967

    • Improved the performance of the alias analysis pass.

      Own Id: OTP-18714 Aux Id: PR-7528, GH-7432

    • -spec attributes are now used for documentation.

      Own Id: OTP-18801 Aux Id: PR-7739

    • Native coverage support has been implemented in the JIT. It will automatically be used by the cover tool to reduce the execution overhead when running cover-compiled code.

      There are also new APIs to support native coverage without using the cover tool.

      To instrument code for native coverage it must be compiled with the line_coverage option.

      To enable native coverage in the runtime system, start it like so:

      $ erl +JPcover true

      There are also the following new functions for supporting native coverage:

      Own Id: OTP-18856 Aux Id: PR-7856

    • EEP-59 - Documentation Attributes has been implemented.

      Documentation attributes can be used to document functions, types, callbacks, and modules. The keyword -moduledoc "Documentation here". is used to document modules, while -doc "Documentation here". can be used on top of functions, types, and callbacks to document them, respectively.

      • Types, callbacks, and function documentation can be set to hidden either via -doc false or -doc hidden. When documentation attributes mark a type as hidden, they will not be part of the documentation.

      • The documentation from moduledoc and doc gets added by default to the binary beam file, following the format of EEP-48.

      • Using the compiler flag warn_missing_doc will raise a warning when -doc attributes are missing in exported functions, types, and callbacks.

      • Using the compiler flag warn_missing_spec_documented will raise a warning when -spec attributes are missing in documented functions, types, and callbacks.

      • moduledocs and docs may refer to external files to be embedded, such as -doc {file, "README.md"}., which refers to the file README.md found in the current working directory.

      • The compiler warns about exported functions whose specs refer to hidden types. Thus, there will be warnings when a hidden type (meaning, the type is not part of the documentation) gets used in an exported function.

      Own Id: OTP-18916 Aux Id: PR-7936

    • The documentation has been migrated to use Markdown and ExDoc.

      Own Id: OTP-18955 Aux Id: PR-8026

    • The order in which the compiler looks up options has changed.

      When there is a conflict in the compiler options given in the -compile() attribute and options given to the compiler, the options given in the -compile() attribute overrides the option given to the compiler, which in turn overrides options given in the ERL_COMPILER_OPTIONS environment variable.

      Example:

      If some_module.erl has the following attribute:

      -compile([nowarn_missing_spec]).

      and the compiler is invoked like so:

      % erlc +warn_missing_spec some_module.erl

      no warnings will be issued for functions that do not have any specs.

      POTENTIAL INCOMPATIBILITY

      Own Id: OTP-18968 Aux Id: GH-6979, PR-8093

    • Safe destructive update of tuples has been implemented in the compiler and runtime system. This allows the VM to update tuples in-place when it is safe to do so, thus improving performance by doing less copying but also by producing less garbage.

      Example:

      -record(rec, {a,b,c}).
      +spec attributes are missing in documented functions, types, and callbacks.

    • moduledocs and docs may refer to external files to be embedded, such as -doc {file, "README.md"}., which refers to the file README.md found in the current working directory.

    • The compiler warns about exported functions whose specs refer to hidden types. Thus, there will be warnings when a hidden type (meaning, the type is not part of the documentation) gets used in an exported function.

    Own Id: OTP-18916 Aux Id: PR-7936

  • The documentation has been migrated to use Markdown and ExDoc.

    Own Id: OTP-18955 Aux Id: PR-8026

  • The order in which the compiler looks up options has changed.

    When there is a conflict in the compiler options given in the -compile() attribute and options given to the compiler, the options given in the -compile() attribute overrides the option given to the compiler, which in turn overrides options given in the ERL_COMPILER_OPTIONS environment variable.

    Example:

    If some_module.erl has the following attribute:

    -compile([nowarn_missing_spec]).

    and the compiler is invoked like so:

    % erlc +warn_missing_spec some_module.erl

    no warnings will be issued for functions that do not have any specs.

    POTENTIAL INCOMPATIBILITY

    Own Id: OTP-18968 Aux Id: GH-6979, PR-8093

  • Safe destructive update of tuples has been implemented in the compiler and runtime system. This allows the VM to update tuples in-place when it is safe to do so, thus improving performance by doing less copying but also by producing less garbage.

    Example:

    -record(rec, {a,b,c}).
     
    -update(#rec{a=needs_update,b=N}=R0) ->
    -    R = R0#rec{a=up_to_date},
    +update(#rec{a=needs_update,b=N}=R0) ->
    +    R = R0#rec{a=up_to_date},
         if
             N < 0 ->
    -            R#rec{c=negative};
    +            R#rec{c=negative};
             N == 0 ->
    -            R#rec{c=zero};
    +            R#rec{c=zero};
             N > 0 ->
    -            R#rec{c=positive}
    +            R#rec{c=positive}
         end.

    The record updates in each of the three clauses of the if can safely be done in-place, because variable R is not used again.

    Own Id: OTP-18972 Aux Id: PR-8090

  • Improved the match context reuse optimization slightly, allowing match contexts to be passed as-is to bit_size/1 and byte_size/1.

    Own Id: OTP-18987

  • erl_lint (and by extension the compiler) will now warn for code using deprecated callbacks.

    The only callback currenly deprecated is format_status/2 in gen_server, gen_event and gen_statem.

    You can use nowarn_deprecated_callback to silence the warning.

    Own Id: OTP-19010 Aux Id: PR-8205

  • /usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/compiler.epub/OEBPS/ssa_checks.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/compiler.epub/OEBPS/ssa_checks.xhtml 2025-05-10 20:19:04.665150168 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/compiler.epub/OEBPS/ssa_checks.xhtml 2025-05-10 20:19:04.673150241 +0000 @@ -37,32 +37,32 @@

    SSA checks are embedded in the source code as comments starting with with one of %ssa%, %%ssa% or %%%ssa%. This is a short introduction the syntax, for the full syntax please refer to the -ssa_check_when_clause production in erl_parse.yrl.

    SSA checks can be placed inside any Erlang function, for example:

    t0() ->
    +ssa_check_when_clause production in erl_parse.yrl.

    SSA checks can be placed inside any Erlang function, for example:

    t0() ->
     %ssa% () when post_ssa_opt ->
     %ssa%   ret(#{}).
    -  #{}.

    will check that t0/0 returns the literal #{}. If we want to check -that a function returns its first formal parameter, we can write:

    t1(A, _B) ->
    +  #{}.

    will check that t0/0 returns the literal #{}. If we want to check +that a function returns its first formal parameter, we can write:

    t1(A, _B) ->
     %ssa% (X, _) when post_ssa_opt ->
     %ssa%   ret(X).
       A.

    Note how we match the first formal parameter using X. The reason for having our own formal parameters for the SSA check, is that we don't want to introduce new identifiers at the Erlang level to support SSA-level checks. Consider if t1/2 had been defined as t1([A|As], B) we would have had to introduce a new identifier for the aggregate -value [A|As].

    The full syntax for a SSA check clause is:

    <expected-result>? (<formals>) when <pipeline-location> -> <checks> '.'

    where <expected-result> can be one of pass (the check must +value [A|As].

    The full syntax for a SSA check clause is:

    <expected-result>? (<formals>) when <pipeline-location> -> <checks> '.'

    where <expected-result> can be one of pass (the check must succeed), fail and xfail (the check must fail). Omitting <expected-result> is parsed as an implicit pass.

    <formals> is a comma-separated list of variables.

    <pipeline-location> specifies when in the compiler pipeline to run the checks. For now the only supported value for <pipeline-location> is post_ssa_opt which runs the checks after the ssa_opt pass.

    <checks> is a comma-separated list of matches against the BEAM SSA -code. For non-flow-control operations the syntax is:

    <variable> = <operation> ( <arguments> ) <annotation>?

    where <operation> is the #b_set.op field from the internal SSA -representation. BIFs are written as bif:<atom>.

    <arguments> is a comma-separated list of variables or literals.

    For flow control operations and labels, the syntax is as follows:

    br(<bool>, <true-label>, <false-label>)
    +code. For non-flow-control operations the syntax is:

    <variable> = <operation> ( <arguments> ) <annotation>?

    where <operation> is the #b_set.op field from the internal SSA +representation. BIFs are written as bif:<atom>.

    <arguments> is a comma-separated list of variables or literals.

    For flow control operations and labels, the syntax is as follows:

    br(<bool>, <true-label>, <false-label>)
     
    -switch(<value>, <fail-label>, [{<label>,<value>},...])
    +switch(<value>, <fail-label>, [{<label>,<value>},...])
     
    -ret(<value>)
    +ret(<value>)
     
     label <value>

    where <value> is a literal or a variable.

    A check can also include an assertion on operation annotations. The assertion is written as a map-like pattern following the argument -list, for example:

    t0() ->
    +list, for example:

    t0() ->
     %ssa% () when post_ssa_opt ->
     %ssa% _ = call(fun return_int/0) { result_type => {t_integer,{17,17}},
     %ssa%                              location => {_,32} },
    @@ -70,9 +70,9 @@
     %ssa%    result_type => {t_tuple,2,true,#{1 => {t_integer,{1,1}},
     %ssa%                                     2 => {t_integer,{2,2}}}}
     %ssa% }.
    -    X = return_int(),
    -    Y = return_tuple(),
    -    {X, Y}.

    + X = return_int(), + Y = return_tuple(), + {X, Y}.

    /usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/notes.html 2025-05-10 20:19:04.789151293 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/notes.html 2025-05-10 20:19:04.817151547 +0000 @@ -175,8 +175,8 @@

    • Fixed a crash in the common sub-expression elimination pass.

      Own Id: OTP-19243 Aux Id: GH-8818, PR-8838

    • Fixed a bug where bogus code was generated for consecutive calls to erlang:setelement/2, potentially crashing the runtime system.

      Own Id: OTP-19270 Aux Id: GH-8783, PR-8898

    • When the line_coverage option was used, exceptions could show the wrong line for where the exception was raised.

      Own Id: OTP-19282 Aux Id: PR-8907

    • The line_coverage option would be ignored if given in a compile() attribute within a module.

      Own Id: OTP-19309 Aux Id: GH-8942, PR-8970

    • A segment matching a float in a binary generator will now skip any invalid float (such as a NaN) and continue matching the rest of the binary. Before this correction, the comprehension would stop as soon as an invalid float was encountered.

      Example:

      1> BadFloat = <<-1:64>>.
       <<"ÿÿÿÿÿÿÿÿ">>
      -2> [X || <<X:64/float>> <= <<0.0/float,BadFloat/binary,42.0/float>>].
      -[0.0,42.0]

      Own Id: OTP-19331 Aux Id: PR-8978

    +2> [X || <<X:64/float>> <= <<0.0/float,BadFloat/binary,42.0/float>>]. +[0.0,42.0]

    Own Id: OTP-19331 Aux Id: PR-8978

    @@ -224,13 +224,13 @@ Fixed Bugs and Malfunctions

    -
    • Generators for binary comprehensions could be evaluated before it was known that they would be needed. That could result in a binary comprehensions failing if a generator that should not be evaluated until later failed.

      As an example, consider this module:

      -module(t).
      --export([f/0]).
      +
      • Generators for binary comprehensions could be evaluated before it was known that they would be needed. That could result in a binary comprehensions failing if a generator that should not be evaluated until later failed.

        As an example, consider this module:

        -module(t).
        +-export([f/0]).
         
        -f() ->
        -    <<0 || _ <- [], _ <- ok, false>>.

        In Erlang/OTP 26 it would fail like so:

        1> t:f().
        +f() ->
        +    <<0 || _ <- [], _ <- ok, false>>.

        In Erlang/OTP 26 it would fail like so:

        1> t:f().
         ** exception error: bad generator ok
        -     in function  t:f/0 (t.erl, line 6)

        In Erlang/OTP 27 it returns an empty binary:

        1> t:f().
        +     in function  t:f/0 (t.erl, line 6)

        In Erlang/OTP 27 it returns an empty binary:

        1> t:f().
         <<>>

        Own Id: OTP-18703 Aux Id: GH-7494, PR-7538

      • The documentation for the preprocessor now mentions that defined(Name) can be called in the condition for an -if or -elif directive to test whether Name is the name of a defined macro. (This feature was implemented in OTP 21.)

        If a function call in an -if or -elif with a name that is not the name of a guard BIF, there would not be a compilation error, but would instead cause the lines following the directive to be skipped. This has now been changed to be a compilation error.

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-18784 Aux Id: GH-7706, PR-7726

      @@ -238,39 +238,39 @@ Improvements and New Features

      Own Id: OTP-18680 Aux Id: PR-7491, PR-8086, ERIERL-967

    • Improved the performance of the alias analysis pass.

      Own Id: OTP-18714 Aux Id: PR-7528, GH-7432

    • -spec attributes are now used for documentation.

      Own Id: OTP-18801 Aux Id: PR-7739

    • Native coverage support has been implemented in the JIT. It will automatically be used by the cover tool to reduce the execution overhead when running cover-compiled code.

      There are also new APIs to support native coverage without using the cover tool.

      To instrument code for native coverage it must be compiled with the line_coverage option.

      To enable native coverage in the runtime system, start it like so:

      $ erl +JPcover true

      There are also the following new functions for supporting native coverage:

      Own Id: OTP-18856 Aux Id: PR-7856

    • EEP-59 - Documentation Attributes has been implemented.

      Documentation attributes can be used to document functions, types, callbacks, and modules. The keyword -moduledoc "Documentation here". is used to document modules, while -doc "Documentation here". can be used on top of functions, types, and callbacks to document them, respectively.

      • Types, callbacks, and function documentation can be set to hidden either via -doc false or -doc hidden. When documentation attributes mark a type as hidden, they will not be part of the documentation.

      • The documentation from moduledoc and doc gets added by default to the binary beam file, following the format of EEP-48.

      • Using the compiler flag warn_missing_doc will raise a warning when -doc attributes are missing in exported functions, types, and callbacks.

      • Using the compiler flag warn_missing_spec_documented will raise a warning when -spec attributes are missing in documented functions, types, and callbacks.

      • moduledocs and docs may refer to external files to be embedded, such as -doc {file, "README.md"}., which refers to the file README.md found in the current working directory.

      • The compiler warns about exported functions whose specs refer to hidden types. Thus, there will be warnings when a hidden type (meaning, the type is not part of the documentation) gets used in an exported function.

      Own Id: OTP-18916 Aux Id: PR-7936

    • The documentation has been migrated to use Markdown and ExDoc.

      Own Id: OTP-18955 Aux Id: PR-8026

    • The order in which the compiler looks up options has changed.

      When there is a conflict in the compiler options given in the -compile() attribute and options given to the compiler, the options given in the -compile() attribute overrides the option given to the compiler, which in turn overrides options given in the ERL_COMPILER_OPTIONS environment variable.

      Example:

      If some_module.erl has the following attribute:

      -compile([nowarn_missing_spec]).

      and the compiler is invoked like so:

      % erlc +warn_missing_spec some_module.erl

      no warnings will be issued for functions that do not have any specs.

      POTENTIAL INCOMPATIBILITY

      Own Id: OTP-18968 Aux Id: GH-6979, PR-8093

    • Safe destructive update of tuples has been implemented in the compiler and runtime system. This allows the VM to update tuples in-place when it is safe to do so, thus improving performance by doing less copying but also by producing less garbage.

      Example:

      -record(rec, {a,b,c}).
      +spec attributes are missing in documented functions, types, and callbacks.

    • moduledocs and docs may refer to external files to be embedded, such as -doc {file, "README.md"}., which refers to the file README.md found in the current working directory.

    • The compiler warns about exported functions whose specs refer to hidden types. Thus, there will be warnings when a hidden type (meaning, the type is not part of the documentation) gets used in an exported function.

    Own Id: OTP-18916 Aux Id: PR-7936

  • The documentation has been migrated to use Markdown and ExDoc.

    Own Id: OTP-18955 Aux Id: PR-8026

  • The order in which the compiler looks up options has changed.

    When there is a conflict in the compiler options given in the -compile() attribute and options given to the compiler, the options given in the -compile() attribute overrides the option given to the compiler, which in turn overrides options given in the ERL_COMPILER_OPTIONS environment variable.

    Example:

    If some_module.erl has the following attribute:

    -compile([nowarn_missing_spec]).

    and the compiler is invoked like so:

    % erlc +warn_missing_spec some_module.erl

    no warnings will be issued for functions that do not have any specs.

    POTENTIAL INCOMPATIBILITY

    Own Id: OTP-18968 Aux Id: GH-6979, PR-8093

  • Safe destructive update of tuples has been implemented in the compiler and runtime system. This allows the VM to update tuples in-place when it is safe to do so, thus improving performance by doing less copying but also by producing less garbage.

    Example:

    -record(rec, {a,b,c}).
     
    -update(#href_anchor"ss">rec{a=needs_update,b=N}=R0) ->
    -    R = R0#rec{a=up_to_date},
    +update(#href_anchor"ss">rec{a=needs_update,b=N}=R0) ->
    +    R = R0#rec{a=up_to_date},
         if
             N < 0 ->
    -            R#rec{c=negative};
    +            R#rec{c=negative};
             N == 0 ->
    -            R#rec{c=zero};
    +            R#rec{c=zero};
             N > 0 ->
    -            R#rec{c=positive}
    +            R#rec{c=positive}
         end.

    The record updates in each of the three clauses of the if can safely be done in-place, because variable R is not used again.

    Own Id: OTP-18972 Aux Id: PR-8090

  • Improved the match context reuse optimization slightly, allowing match contexts to be passed as-is to bit_size/1 and byte_size/1.

    Own Id: OTP-18987

  • erl_lint (and by extension the compiler) will now warn for code using deprecated callbacks.

    The only callback currenly deprecated is format_status/2 in gen_server, gen_event and gen_statem.

    You can use nowarn_deprecated_callback to silence the warning.

    Own Id: OTP-19010 Aux Id: PR-8205

  • @@ -3195,7 +3195,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/search.html 2025-05-10 20:19:04.837151727 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/search.html 2025-05-10 20:19:04.841151764 +0000 @@ -145,7 +145,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/ssa_checks.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/ssa_checks.html 2025-05-10 20:19:04.861151945 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.6.1/doc/html/ssa_checks.html 2025-05-10 20:19:04.861151945 +0000 @@ -142,32 +142,32 @@

    SSA checks are embedded in the source code as comments starting with with one of %ssa%, %%ssa% or %%%ssa%. This is a short introduction the syntax, for the full syntax please refer to the -ssa_check_when_clause production in erl_parse.yrl.

    SSA checks can be placed inside any Erlang function, for example:

    t0() ->
    +ssa_check_when_clause production in erl_parse.yrl.

    SSA checks can be placed inside any Erlang function, for example:

    t0() ->
     %ssa% () when post_ssa_opt ->
     %ssa%   ret(#{}).
    -  #{}.

    will check that t0/0 returns the literal #{}. If we want to check -that a function returns its first formal parameter, we can write:

    t1(A, _B) ->
    +  #{}.

    will check that t0/0 returns the literal #{}. If we want to check +that a function returns its first formal parameter, we can write:

    t1(A, _B) ->
     %ssa% (X, _) when post_ssa_opt ->
     %ssa%   ret(X).
       A.

    Note how we match the first formal parameter using X. The reason for having our own formal parameters for the SSA check, is that we don't want to introduce new identifiers at the Erlang level to support SSA-level checks. Consider if t1/2 had been defined as t1([A|As], B) we would have had to introduce a new identifier for the aggregate -value [A|As].

    The full syntax for a SSA check clause is:

    <expected-result>? (<formals>) when <pipeline-location> -> <checks> '.'

    where <expected-result> can be one of pass (the check must +value [A|As].

    The full syntax for a SSA check clause is:

    <expected-result>? (<formals>) when <pipeline-location> -> <checks> '.'

    where <expected-result> can be one of pass (the check must succeed), fail and xfail (the check must fail). Omitting <expected-result> is parsed as an implicit pass.

    <formals> is a comma-separated list of variables.

    <pipeline-location> specifies when in the compiler pipeline to run the checks. For now the only supported value for <pipeline-location> is post_ssa_opt which runs the checks after the ssa_opt pass.

    <checks> is a comma-separated list of matches against the BEAM SSA -code. For non-flow-control operations the syntax is:

    <variable> = <operation> ( <arguments> ) <annotation>?

    where <operation> is the #b_set.op field from the internal SSA -representation. BIFs are written as bif:<atom>.

    <arguments> is a comma-separated list of variables or literals.

    For flow control operations and labels, the syntax is as follows:

    br(<bool>, <true-label>, <false-label>)
    +code. For non-flow-control operations the syntax is:

    <variable> = <operation> ( <arguments> ) <annotation>?

    where <operation> is the #b_set.op field from the internal SSA +representation. BIFs are written as bif:<atom>.

    <arguments> is a comma-separated list of variables or literals.

    For flow control operations and labels, the syntax is as follows:

    br(<bool>, <true-label>, <false-label>)
     
    -switch(<value>, <fail-label>, [{<label>,<value>},...])
    +switch(<value>, <fail-label>, [{<label>,<value>},...])
     
    -ret(<value>)
    +ret(<value>)
     
     label <value>

    where <value> is a literal or a variable.

    A check can also include an assertion on operation annotations. The assertion is written as a map-like pattern following the argument -list, for example:

    t0() ->
    +list, for example:

    t0() ->
     %ssa% () when post_ssa_opt ->
     %ssa% _ = call(fun return_int/0) { result_type => {t_integer,{17,17}},
     %ssa%                              location => {_,32} },
    @@ -175,9 +175,9 @@
     %ssa%    result_type => {t_tuple,2,true,#{1 => {t_integer,{1,1}},
     %ssa%                                     2 => {t_integer,{2,2}}}}
     %ssa% }.
    -    X = return_int(),
    -    Y = return_tuple(),
    -    {X, Y}.

    + X = return_int(), + Y = return_tuple(), + {X, Y}.

    @@ -250,7 +250,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/404.html 2025-05-10 20:19:04.881152127 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/404.html 2025-05-10 20:19:04.881152127 +0000 @@ -147,7 +147,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/algorithm_details.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/algorithm_details.html 2025-05-10 20:19:04.901152308 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/algorithm_details.html 2025-05-10 20:19:04.909152380 +0000 @@ -319,7 +319,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/api-reference.html 2025-05-10 20:19:04.925152525 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/api-reference.html 2025-05-10 20:19:04.929152562 +0000 @@ -185,7 +185,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/crypto.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/crypto.epub/OEBPS/content.opf 2025-05-10 20:19:04.953152779 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/crypto.epub/OEBPS/content.opf 2025-05-10 20:19:04.961152852 +0000 @@ -4,10 +4,10 @@ version="3.0"> crypto - 5.5.3 - urn:uuid:36fc4af9-1b3f-23f0-f2f3-3b359cbc54fd + urn:uuid:09e53de8-b7eb-a5e0-c674-4c8284d603ca en - 2025-05-10T20:11:39Z + 2041-06-12T09:31:47Z /usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/crypto.epub/OEBPS/crypto.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/crypto.epub/OEBPS/crypto.xhtml 2025-05-10 20:19:04.953152779 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/crypto.epub/OEBPS/crypto.xhtml 2025-05-10 20:19:04.961152852 +0000 @@ -484,7 +484,7 @@ -
    rsa_public() = [E, N]
    rsa_private() = [E, N, D] | [E, N, D, P1, P2, E1, E2, C]

    Where E is the public exponent, N is public modulus and D is the private +

    rsa_public() = [E, N]
    rsa_private() = [E, N, D] | [E, N, D, P1, P2, E1, E2, C]

    Where E is the public exponent, N is public modulus and D is the private exponent. The longer key format contains redundant information that will make the calculation faster. P1 and P2 are first and second prime factors. E1 and E2 are first and second exponents. C is the CRT coefficient. The terminology is @@ -2983,7 +2983,7 @@

    -
    rsa_public() = [E, N]
    rsa_private() = [E, N, D] | [E, N, D, P1, P2, E1, E2, C]

    Where E is the public exponent, N is public modulus and D is the private +

    rsa_public() = [E, N]
    rsa_private() = [E, N, D] | [E, N, D, P1, P2, E1, E2, C]

    Where E is the public exponent, N is public modulus and D is the private exponent. The longer key format contains redundant information that will make the calculation faster. P1 and P2 are first and second prime factors. E1 and E2 are first and second exponents. C is the CRT coefficient. The terminology is @@ -5340,9 +5340,9 @@ BN_rand_range).

    Saves the state in the process dictionary before returning it as well. See also rand:seed/1 and rand_seed_s/0.

    When using the state object from this function the rand functions using it may raise exception error:low_entropy in case the random generator failed due -to lack of secure "randomness".

    Example

    _ = crypto:rand_seed(),
    -_IntegerValue = rand:uniform(42), % [1; 42]
    -_FloatValue = rand:uniform().     % [0.0; 1.0[
    +to lack of secure "randomness".

    Example

    _ = crypto:rand_seed(),
    +_IntegerValue = rand:uniform(42), % [1; 42]
    +_FloatValue = rand:uniform().     % [0.0; 1.0[
    @@ -5408,9 +5408,9 @@ generate cryptographically strong random numbers.

    Saves the state in the process dictionary before returning it as well. See also rand:seed/1 and rand_seed_alg_s/1.

    When using the state object from this function the rand functions using it may raise exception error:low_entropy in case the random generator failed due -to lack of secure "randomness".

    Example

    _ = crypto:rand_seed_alg(crypto_cache),
    -_IntegerValue = rand:uniform(42), % [1; 42]
    -_FloatValue = rand:uniform().     % [0.0; 1.0[
    +to lack of secure "randomness".

    Example

    _ = crypto:rand_seed_alg(crypto_cache),
    +_IntegerValue = rand:uniform(42), % [1; 42]
    +_FloatValue = rand:uniform().     % [0.0; 1.0[
    @@ -5442,12 +5442,12 @@

    Creates a state object for random number generation, in order to generate cryptographically unpredictable random numbers.

    Saves the state in the process dictionary before returning it as well. See also -rand_seed_alg_s/2.

    Example

    _ = crypto:rand_seed_alg(crypto_aes, "my seed"),
    -IntegerValue = rand:uniform(42), % [1; 42]
    -FloatValue = rand:uniform(),     % [0.0; 1.0[
    -_ = crypto:rand_seed_alg(crypto_aes, "my seed"),
    -IntegerValue = rand:uniform(42), % Same values
    -FloatValue = rand:uniform().     % again
    +rand_seed_alg_s/2.

    Example

    _ = crypto:rand_seed_alg(crypto_aes, "my seed"),
    +IntegerValue = rand:uniform(42), % [1; 42]
    +FloatValue = rand:uniform(),     % [0.0; 1.0[
    +_ = crypto:rand_seed_alg(crypto_aes, "my seed"),
    +IntegerValue = rand:uniform(42), % Same values
    +FloatValue = rand:uniform().     % again
    @@ -5939,12 +5939,12 @@
    -

    Get information about crypto and the OpenSSL backend.

    Returns a map with information about the compilation and linking of crypto.

    Example:

    1> crypto:info().
    -#{compile_type => normal,
    +

    Get information about crypto and the OpenSSL backend.

    Returns a map with information about the compilation and linking of crypto.

    Example:

    1> crypto:info().
    +#{compile_type => normal,
       cryptolib_version_compiled => "OpenSSL 3.0.0 7 sep 2021",
       cryptolib_version_linked => "OpenSSL 3.0.0 7 sep 2021",
       link_type => dynamic,
    -  otp_crypto_version => "5.0.2"}
    +  otp_crypto_version => "5.0.2"}
     2>

    More association types than documented may be present in the map.

    @@ -6011,8 +6011,8 @@

    Get the name and version of the libraries used by crypto.

    Name is the name of the library. VerNum is the numeric version according to the library's own versioning scheme. VerStr contains a text variant of the -version.

    > info_lib().
    -[{<<"OpenSSL">>,269484095,<<"OpenSSL 1.1.0c  10 Nov 2016"">>}]

    Note

    From OTP R16 the numeric version represents the version of the OpenSSL +version.

    > info_lib().
    +[{<<"OpenSSL">>,269484095,<<"OpenSSL 1.1.0c  10 Nov 2016"">>}]

    Note

    From OTP R16 the numeric version represents the version of the OpenSSL header files (openssl/opensslv.h) used when crypto was compiled. The text variant represents the libcrypto library used at runtime. In earlier OTP versions both numeric and text was taken from the library.

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/crypto.epub/OEBPS/engine_keys.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/crypto.epub/OEBPS/engine_keys.xhtml 2025-05-10 20:19:04.953152779 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/crypto.epub/OEBPS/engine_keys.xhtml 2025-05-10 20:19:04.957152816 +0000 @@ -56,13 +56,13 @@ Sign with an engine stored private key

    This example shows how to construct a key reference that is used in a sign -operation. The actual key is stored in the engine that is loaded at prompt 1.

    1> {ok, EngineRef} = crypto:engine_load(....).
    +operation. The actual key is stored in the engine that is loaded at prompt 1.

    1> {ok, EngineRef} = crypto:engine_load(....).
     ...
    -{ok,#Ref<0.2399045421.3028942852.173962>}
    -2> PrivKey = #{engine => EngineRef,
    -               key_id => "id of the private key in Engine"}.
    +{ok,#Ref<0.2399045421.3028942852.173962>}
    +2> PrivKey = #{engine => EngineRef,
    +               key_id => "id of the private key in Engine"}.
     ...
    -3> Signature = crypto:sign(rsa, sha, <<"The message">>, PrivKey).
    +3> Signature = crypto:sign(rsa, sha, <<"The message">>, PrivKey).
     <<65,6,125,254,54,233,84,77,83,63,168,28,169,214,121,76,
       207,177,124,183,156,185,160,243,36,79,125,230,231,...>>

    @@ -72,10 +72,10 @@

    Here the signature and message in the last example is verifyed using the public key. The public key is stored in an engine, only to exemplify that it is -possible. The public key could of course be handled openly as usual.

    4> PublicKey = #{engine => EngineRef,
    -                 key_id => "id of the public key in Engine"}.
    +possible. The public key could of course be handled openly as usual.

    4> PublicKey = #{engine => EngineRef,
    +                 key_id => "id of the public key in Engine"}.
     ...
    -5> crypto:verify(rsa, sha, <<"The message">>, Signature, PublicKey).
    +5> crypto:verify(rsa, sha, <<"The message">>, Signature, PublicKey).
     true
     6>

    @@ -84,11 +84,11 @@ Using a password protected private key

    The same example as the first sign example, except that a password protects the -key down in the Engine.

    6> PrivKeyPwd = #{engine => EngineRef,
    +key down in the Engine.

    6> PrivKeyPwd = #{engine => EngineRef,
                       key_id => "id of the pwd protected private key in Engine",
    -		  password => "password"}.
    +		  password => "password"}.
     ...
    -7> crypto:sign(rsa, sha, <<"The message">>, PrivKeyPwd).
    +7> crypto:sign(rsa, sha, <<"The message">>, PrivKeyPwd).
     <<140,80,168,101,234,211,146,183,231,190,160,82,85,163,
       175,106,77,241,141,120,72,149,181,181,194,154,175,76,
       223,...>>
    /usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/crypto.epub/OEBPS/engine_load.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/crypto.epub/OEBPS/engine_load.xhtml	2025-05-10 20:19:04.953152779 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/crypto.epub/OEBPS/engine_load.xhtml	2025-05-10 20:19:04.957152816 +0000
    @@ -47,35 +47,35 @@
       Dynamically load an engine from default directory
     

    If the engine is located in the OpenSSL/LibreSSL installation engines -directory.

    1> {ok, Engine} = crypto:engine_load(<<"otp_test_engine">>, [], []).
    - {ok, #Ref}

    +directory.

    1> {ok, Engine} = crypto:engine_load(<<"otp_test_engine">>, [], []).
    + {ok, #Ref}

    Load an engine with the dynamic engine

    Load an engine with the help of the dynamic engine by giving the path to the -library.

     2> {ok, Engine} = crypto:engine_load(<<"dynamic">>,
    -                                      [{<<"SO_PATH">>,
    -                                        <<"/some/path/otp_test_engine.so">>},
    -                                       {<<"ID">>, <<"MD5">>},
    -                                       <<"LOAD">>],
    -                                      []).
    - {ok, #Ref}

    +library.

     2> {ok, Engine} = crypto:engine_load(<<"dynamic">>,
    +                                      [{<<"SO_PATH">>,
    +                                        <<"/some/path/otp_test_engine.so">>},
    +                                       {<<"ID">>, <<"MD5">>},
    +                                       <<"LOAD">>],
    +                                      []).
    + {ok, #Ref}

    Load an engine and replace some methods

    Load an engine with the help of the dynamic engine and just replace some engine -methods.

     3> {ok, Engine} = crypto:engine_load(<<"dynamic">>,
    -                                      [{<<"SO_PATH">>,
    -                                        <<"/some/path/otp_test_engine.so">>},
    -                                       {<<"ID">>, <<"MD5">>},
    -                                       <<"LOAD">>],
    -                                      []).
    -{ok, #Ref}
    -4> ok = crypto:engine_register(Engine, [engine_method_digests]).
    +methods.

     3> {ok, Engine} = crypto:engine_load(<<"dynamic">>,
    +                                      [{<<"SO_PATH">>,
    +                                        <<"/some/path/otp_test_engine.so">>},
    +                                       {<<"ID">>, <<"MD5">>},
    +                                       <<"LOAD">>],
    +                                      []).
    +{ok, #Ref}
    +4> ok = crypto:engine_register(Engine, [engine_method_digests]).
     ok

    @@ -84,19 +84,19 @@

    This function makes sure the engine is loaded just once and the ID is added to the internal engine list of OpenSSL. The following calls to the function will -check if the ID is loaded and then just get a new reference to the engine.

     5> {ok, Engine} = crypto:ensure_engine_loaded(<<"MD5">>,
    -                                               <<"/some/path/otp_test_engine.so">>).
    - {ok, #Ref}

    To remove the tag from the OpenSSL engine list use crypto:engine_remove/1.

     6> crypto:engine_remove(Engine).
    +check if the ID is loaded and then just get a new reference to the engine.

     5> {ok, Engine} = crypto:ensure_engine_loaded(<<"MD5">>,
    +                                               <<"/some/path/otp_test_engine.so">>).
    + {ok, #Ref}

    To remove the tag from the OpenSSL engine list use crypto:engine_remove/1.

     6> crypto:engine_remove(Engine).
      ok

    To unload it use crypto:engine_unload/1 which removes the references to the -engine.

     6> crypto:engine_unload(Engine).
    +engine.

     6> crypto:engine_unload(Engine).
      ok

    List all engines currently loaded

    -
     8> crypto:engine_list().
    -[<<"dynamic">>, <<"MD5">>]
    +
     8> crypto:engine_list().
    +[<<"dynamic">>, <<"MD5">>]
    /usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/crypto.epub/OEBPS/new_api.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/crypto.epub/OEBPS/new_api.xhtml 2025-05-10 20:19:04.953152779 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/crypto.epub/OEBPS/new_api.xhtml 2025-05-10 20:19:04.957152816 +0000 @@ -87,41 +87,41 @@ initialises the crypto context. One or more calls crypto_update/2 does the actual encryption or decryption for each block.

    This example shows first the encryption of two blocks and then decryptions of the cipher text, but divided into three blocks just to show that it is possible -to divide the plain text and cipher text differently for some ciphers:

    	1> crypto:start().
    +to divide the plain text and cipher text differently for some ciphers:

    	1> crypto:start().
     	ok
     	2> Key = <<1:128>>.
     	<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1>>
     	3> IV = <<0:128>>.
     	<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>>
    -	4> StateEnc = crypto:crypto_init(aes_128_ctr, Key, IV, true). % encrypt -> true
    +	4> StateEnc = crypto:crypto_init(aes_128_ctr, Key, IV, true). % encrypt -> true
     	#Ref<0.3768901617.1128660993.124047>
    -	5> crypto:crypto_update(StateEnc, <<"First bytes">>).
    +	5> crypto:crypto_update(StateEnc, <<"First bytes">>).
     	<<67,44,216,166,25,130,203,5,66,6,162>>
    -	6> crypto:crypto_update(StateEnc, <<"Second bytes">>).
    +	6> crypto:crypto_update(StateEnc, <<"Second bytes">>).
     	<<16,79,94,115,234,197,94,253,16,144,151,41>>
     	7>
    -	7> StateDec = crypto:crypto_init(aes_128_ctr, Key, IV, false). % decrypt -> false
    +	7> StateDec = crypto:crypto_init(aes_128_ctr, Key, IV, false). % decrypt -> false
     	#Ref<0.3768901617.1128660994.124255>
    -	8> crypto:crypto_update(StateDec, <<67,44,216,166,25,130,203>>).
    +	8> crypto:crypto_update(StateDec, <<67,44,216,166,25,130,203>>).
     	<<"First b">>
    -	9> crypto:crypto_update(StateDec, <<5,66,6,162,16,79,94,115,234,197,
    -        94,253,16,144,151>>).
    +	9> crypto:crypto_update(StateDec, <<5,66,6,162,16,79,94,115,234,197,
    +        94,253,16,144,151>>).
     	<<"ytesSecond byte">>
    -	10> crypto:crypto_update(StateDec, <<41>>).
    +	10> crypto:crypto_update(StateDec, <<41>>).
     	<<"s">>
     	11>

    Note that the internal data that the StateEnc and StateDec references are destructivly updated by the calls to crypto_update/2. This is to gain time in the calls of the nifs interfacing the cryptolib. In a loop where the state is saved in the loop's state, it also saves one update of the loop state per crypto operation.

    For example, a simple server receiving text parts to encrypt and send the result -back to the one who sent them (the Requester):

    	encode(Crypto, Key, IV) ->
    -	crypto_loop(crypto:crypto_init(Crypto, Key, IV, true)).
    +back to the one who sent them (the Requester):

    	encode(Crypto, Key, IV) ->
    +	crypto_loop(crypto:crypto_init(Crypto, Key, IV, true)).
     
    -	crypto_loop(State) ->
    +	crypto_loop(State) ->
     	receive
    -        {Text, Requester} ->
    -        Requester ! crypto:crypto_update(State, Text),
    -	loop(State)
    +        {Text, Requester} ->
    +        Requester ! crypto:crypto_update(State, Text),
    +	loop(State)
     	end.

    @@ -134,9 +134,9 @@ <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1>> 2> IV = <<0:128>>. <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>> - 3> Txt = [<<"First bytes">>,<<"Second bytes">>]. - [<<"First bytes">>,<<"Second bytes">>] - 4> crypto:crypto_one_time(aes_128_ctr, Key, IV, Txt, true). + 3> Txt = [<<"First bytes">>,<<"Second bytes">>]. + [<<"First bytes">>,<<"Second bytes">>] + 4> crypto:crypto_one_time(aes_128_ctr, Key, IV, Txt, true). <<67,44,216,166,25,130,203,5,66,6,162,16,79,94,115,234, 197,94,253,16,144,151,41>> 5>

    The [<<"First bytes">>,<<"Second bytes">>] could of course have been one @@ -152,14 +152,14 @@ <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1>> 2> IV = <<0:128>>. <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>> - 3> Txt = [<<"First bytes">>,<<"Second bytes">>]. - [<<"First bytes">>,<<"Second bytes">>] + 3> Txt = [<<"First bytes">>,<<"Second bytes">>]. + [<<"First bytes">>,<<"Second bytes">>] 4> AAD = <<"Some additional auth data">>. <<"Some additional auth data">> - 5> crypto:crypto_one_time_aead(aes_128_gcm, Key, IV, Txt, AAD, true). - {<<240,130,38,96,130,241,189,52,3,190,179,213,132,1,72, + 5> crypto:crypto_one_time_aead(aes_128_gcm, Key, IV, Txt, AAD, true). + {<<240,130,38,96,130,241,189,52,3,190,179,213,132,1,72, 192,103,176,90,104,15,71,158>>, - <<131,47,45,91,142,85,9,244,21,141,214,71,31,135,2,155>>} + <<131,47,45,91,142,85,9,244,21,141,214,71,31,135,2,155>>} 6>

    The [<<"First bytes">>,<<"Second bytes">>] could of course have been one single binary: <<"First bytesSecond bytes">>.

    @@ -169,21 +169,21 @@

    	1> Key = <<1:128>>.
     	<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1>>
    -	2> StateMac = crypto:mac_init(cmac, aes_128_cbc, Key).
    +	2> StateMac = crypto:mac_init(cmac, aes_128_cbc, Key).
     	#Ref<0.2424664121.2781478916.232610>
    -	3> crypto:mac_update(StateMac, <<"First bytes">>).
    +	3> crypto:mac_update(StateMac, <<"First bytes">>).
     	#Ref<0.2424664121.2781478916.232610>
    -	4> crypto:mac_update(StateMac, " ").
    +	4> crypto:mac_update(StateMac, " ").
     	#Ref<0.2424664121.2781478916.232610>
    -	5> crypto:mac_update(StateMac, <<"last bytes">>).
    +	5> crypto:mac_update(StateMac, <<"last bytes">>).
     	#Ref<0.2424664121.2781478916.232610>
    -	6> crypto:mac_final(StateMac).
    +	6> crypto:mac_final(StateMac).
     	<<68,191,219,128,84,77,11,193,197,238,107,6,214,141,160,
     	249>>
    -	7>

    and compare the result with a single calculation just for this example:

    	7> crypto:mac(cmac, aes_128_cbc, Key, "First bytes last bytes").
    +	7>

    and compare the result with a single calculation just for this example:

    	7> crypto:mac(cmac, aes_128_cbc, Key, "First bytes last bytes").
     	<<68,191,219,128,84,77,11,193,197,238,107,6,214,141,160,
     	249>>
    -	8> v(7) == v(6).
    +	8> v(7) == v(6).
     	true
     	9>

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/crypto.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/crypto.html 2025-05-10 20:19:05.101154121 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/crypto.html 2025-05-10 20:19:05.145154520 +0000 @@ -595,7 +595,7 @@ -
    rsa_public() = [E, N]
    rsa_private() = [E, N, D] | [E, N, D, P1, P2, E1, E2, C]

    Where E is the public exponent, N is public modulus and D is the private +

    rsa_public() = [E, N]
    rsa_private() = [E, N, D] | [E, N, D, P1, P2, E1, E2, C]

    Where E is the public exponent, N is public modulus and D is the private exponent. The longer key format contains redundant information that will make the calculation faster. P1 and P2 are first and second prime factors. E1 and E2 are first and second exponents. C is the CRT coefficient. The terminology is @@ -3119,7 +3119,7 @@

    -
    rsa_public() = [E, N]
    rsa_private() = [E, N, D] | [E, N, D, P1, P2, E1, E2, C]

    Where E is the public exponent, N is public modulus and D is the private +

    rsa_public() = [E, N]
    rsa_private() = [E, N, D] | [E, N, D, P1, P2, E1, E2, C]

    Where E is the public exponent, N is public modulus and D is the private exponent. The longer key format contains redundant information that will make the calculation faster. P1 and P2 are first and second prime factors. E1 and E2 are first and second exponents. C is the CRT coefficient. The terminology is @@ -5536,9 +5536,9 @@ BN_rand_range).

    Saves the state in the process dictionary before returning it as well. See also rand:seed/1 and rand_seed_s/0.

    When using the state object from this function the rand functions using it may raise exception error:low_entropy in case the random generator failed due -to lack of secure "randomness".

    Example

    _ = crypto:rand_seed(),
    -_IntegerValue = rand:uniform(42), % [1; 42]
    -_FloatValue = rand:uniform().     % [0.0; 1.0[
    +to lack of secure "randomness".

    Example

    _ = crypto:rand_seed(),
    +_IntegerValue = rand:uniform(42), % [1; 42]
    +_FloatValue = rand:uniform().     % [0.0; 1.0[
    @@ -5604,9 +5604,9 @@ generate cryptographically strong random numbers.

    Saves the state in the process dictionary before returning it as well. See also rand:seed/1 and rand_seed_alg_s/1.

    When using the state object from this function the rand functions using it may raise exception error:low_entropy in case the random generator failed due -to lack of secure "randomness".

    Example

    _ = crypto:rand_seed_alg(crypto_cache),
    -_IntegerValue = rand:uniform(42), % [1; 42]
    -_FloatValue = rand:uniform().     % [0.0; 1.0[
    +to lack of secure "randomness".

    Example

    _ = crypto:rand_seed_alg(crypto_cache),
    +_IntegerValue = rand:uniform(42), % [1; 42]
    +_FloatValue = rand:uniform().     % [0.0; 1.0[
    @@ -5638,12 +5638,12 @@

    Creates a state object for random number generation, in order to generate cryptographically unpredictable random numbers.

    Saves the state in the process dictionary before returning it as well. See also -rand_seed_alg_s/2.

    Example

    _ = crypto:rand_seed_alg(crypto_aes, "my seed"),
    -IntegerValue = rand:uniform(42), % [1; 42]
    -FloatValue = rand:uniform(),     % [0.0; 1.0[
    -_ = crypto:rand_seed_alg(crypto_aes, "my seed"),
    -IntegerValue = rand:uniform(42), % Same values
    -FloatValue = rand:uniform().     % again
    +rand_seed_alg_s/2.

    Example

    _ = crypto:rand_seed_alg(crypto_aes, "my seed"),
    +IntegerValue = rand:uniform(42), % [1; 42]
    +FloatValue = rand:uniform(),     % [0.0; 1.0[
    +_ = crypto:rand_seed_alg(crypto_aes, "my seed"),
    +IntegerValue = rand:uniform(42), % Same values
    +FloatValue = rand:uniform().     % again
    @@ -6140,12 +6140,12 @@
    -

    Get information about crypto and the OpenSSL backend.

    Returns a map with information about the compilation and linking of crypto.

    Example:

    1> crypto:info().
    -#{compile_type => normal,
    +

    Get information about crypto and the OpenSSL backend.

    Returns a map with information about the compilation and linking of crypto.

    Example:

    1> crypto:info().
    +#{compile_type => normal,
       cryptolib_version_compiled => "OpenSSL 3.0.0 7 sep 2021",
       cryptolib_version_linked => "OpenSSL 3.0.0 7 sep 2021",
       link_type => dynamic,
    -  otp_crypto_version => "5.0.2"}
    +  otp_crypto_version => "5.0.2"}
     2>

    More association types than documented may be present in the map.

    @@ -6212,8 +6212,8 @@

    Get the name and version of the libraries used by crypto.

    Name is the name of the library. VerNum is the numeric version according to the library's own versioning scheme. VerStr contains a text variant of the -version.

    > info_lib().
    -[{<<"OpenSSL">>,269484095,<<"OpenSSL 1.1.0c  10 Nov 2016"">>}]

    Note

    From OTP R16 the numeric version represents the version of the OpenSSL +version.

    > info_lib().
    +[{<<"OpenSSL">>,269484095,<<"OpenSSL 1.1.0c  10 Nov 2016"">>}]

    Note

    From OTP R16 the numeric version represents the version of the OpenSSL header files (openssl/opensslv.h) used when crypto was compiled. The text variant represents the libcrypto library used at runtime. In earlier OTP versions both numeric and text was taken from the library.

    @@ -7154,7 +7154,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/crypto_app.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/crypto_app.html 2025-05-10 20:19:05.169154738 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/crypto_app.html 2025-05-10 20:19:05.173154774 +0000 @@ -225,7 +225,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/engine_keys.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/engine_keys.html 2025-05-10 20:19:05.193154955 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/engine_keys.html 2025-05-10 20:19:05.197154991 +0000 @@ -161,13 +161,13 @@ Sign with an engine stored private key

    This example shows how to construct a key reference that is used in a sign -operation. The actual key is stored in the engine that is loaded at prompt 1.

    1> {ok, EngineRef} = crypto:engine_load(....).
    +operation. The actual key is stored in the engine that is loaded at prompt 1.

    1> {ok, EngineRef} = crypto:engine_load(....).
     ...
    -{ok,#Ref<0.2399045421.3028942852.173962>}
    -2> PrivKey = #{engine => EngineRef,
    -               key_id => "id of the private key in Engine"}.
    +{ok,#Ref<0.2399045421.3028942852.173962>}
    +2> PrivKey = #{engine => EngineRef,
    +               key_id => "id of the private key in Engine"}.
     ...
    -3> Signature = crypto:sign(rsa, sha, <<"The message">>, PrivKey).
    +3> Signature = crypto:sign(rsa, sha, <<"The message">>, PrivKey).
     <<65,6,125,254,54,233,84,77,83,63,168,28,169,214,121,76,
       207,177,124,183,156,185,160,243,36,79,125,230,231,...>>

    @@ -177,10 +177,10 @@

    Here the signature and message in the last example is verifyed using the public key. The public key is stored in an engine, only to exemplify that it is -possible. The public key could of course be handled openly as usual.

    4> PublicKey = #{engine => EngineRef,
    -                 key_id => "id of the public key in Engine"}.
    +possible. The public key could of course be handled openly as usual.

    4> PublicKey = #{engine => EngineRef,
    +                 key_id => "id of the public key in Engine"}.
     ...
    -5> crypto:verify(rsa, sha, <<"The message">>, Signature, PublicKey).
    +5> crypto:verify(rsa, sha, <<"The message">>, Signature, PublicKey).
     true
     6>

    @@ -189,11 +189,11 @@ Using a password protected private key

    The same example as the first sign example, except that a password protects the -key down in the Engine.

    6> PrivKeyPwd = #{engine => EngineRef,
    +key down in the Engine.

    6> PrivKeyPwd = #{engine => EngineRef,
                       key_id => "id of the pwd protected private key in Engine",
    -		  password => "password"}.
    +		  password => "password"}.
     ...
    -7> crypto:sign(rsa, sha, <<"The message">>, PrivKeyPwd).
    +7> crypto:sign(rsa, sha, <<"The message">>, PrivKeyPwd).
     <<140,80,168,101,234,211,146,183,231,190,160,82,85,163,
       175,106,77,241,141,120,72,149,181,181,194,154,175,76,
       223,...>>
    @@ -248,7 +248,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/engine_load.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/engine_load.html 2025-05-10 20:19:05.217155173 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/engine_load.html 2025-05-10 20:19:05.221155209 +0000 @@ -152,35 +152,35 @@ Dynamically load an engine from default directory

    If the engine is located in the OpenSSL/LibreSSL installation engines -directory.

    1> {ok, Engine} = crypto:engine_load(<<"otp_test_engine">>, [], []).
    - {ok, #Ref}

    +directory.

    1> {ok, Engine} = crypto:engine_load(<<"otp_test_engine">>, [], []).
    + {ok, #Ref}

    Load an engine with the dynamic engine

    Load an engine with the help of the dynamic engine by giving the path to the -library.

     2> {ok, Engine} = crypto:engine_load(<<"dynamic">>,
    -                                      [{<<"SO_PATH">>,
    -                                        <<"/some/path/otp_test_engine.so">>},
    -                                       {<<"ID">>, <<"MD5">>},
    -                                       <<"LOAD">>],
    -                                      []).
    - {ok, #Ref}

    +library.

     2> {ok, Engine} = crypto:engine_load(<<"dynamic">>,
    +                                      [{<<"SO_PATH">>,
    +                                        <<"/some/path/otp_test_engine.so">>},
    +                                       {<<"ID">>, <<"MD5">>},
    +                                       <<"LOAD">>],
    +                                      []).
    + {ok, #Ref}

    Load an engine and replace some methods

    Load an engine with the help of the dynamic engine and just replace some engine -methods.

     3> {ok, Engine} = crypto:engine_load(<<"dynamic">>,
    -                                      [{<<"SO_PATH">>,
    -                                        <<"/some/path/otp_test_engine.so">>},
    -                                       {<<"ID">>, <<"MD5">>},
    -                                       <<"LOAD">>],
    -                                      []).
    -{ok, #Ref}
    -4> ok = crypto:engine_register(Engine, [engine_method_digests]).
    +methods.

     3> {ok, Engine} = crypto:engine_load(<<"dynamic">>,
    +                                      [{<<"SO_PATH">>,
    +                                        <<"/some/path/otp_test_engine.so">>},
    +                                       {<<"ID">>, <<"MD5">>},
    +                                       <<"LOAD">>],
    +                                      []).
    +{ok, #Ref}
    +4> ok = crypto:engine_register(Engine, [engine_method_digests]).
     ok

    @@ -189,19 +189,19 @@

    This function makes sure the engine is loaded just once and the ID is added to the internal engine list of OpenSSL. The following calls to the function will -check if the ID is loaded and then just get a new reference to the engine.

     5> {ok, Engine} = crypto:ensure_engine_loaded(<<"MD5">>,
    -                                               <<"/some/path/otp_test_engine.so">>).
    - {ok, #Ref}

    To remove the tag from the OpenSSL engine list use crypto:engine_remove/1.

     6> crypto:engine_remove(Engine).
    +check if the ID is loaded and then just get a new reference to the engine.

     5> {ok, Engine} = crypto:ensure_engine_loaded(<<"MD5">>,
    +                                               <<"/some/path/otp_test_engine.so">>).
    + {ok, #Ref}

    To remove the tag from the OpenSSL engine list use crypto:engine_remove/1.

     6> crypto:engine_remove(Engine).
      ok

    To unload it use crypto:engine_unload/1 which removes the references to the -engine.

     6> crypto:engine_unload(Engine).
    +engine.

     6> crypto:engine_unload(Engine).
      ok

    List all engines currently loaded

    -
     8> crypto:engine_list().
    -[<<"dynamic">>, <<"MD5">>]
    +
     8> crypto:engine_list().
    +[<<"dynamic">>, <<"MD5">>]
    @@ -252,7 +252,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/fips.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/fips.html 2025-05-10 20:19:05.241155390 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/fips.html 2025-05-10 20:19:05.241155390 +0000 @@ -293,7 +293,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/licenses.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/licenses.html 2025-05-10 20:19:05.261155572 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/licenses.html 2025-05-10 20:19:05.265155608 +0000 @@ -296,7 +296,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/new_api.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/new_api.html 2025-05-10 20:19:05.289155825 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/new_api.html 2025-05-10 20:19:05.297155897 +0000 @@ -192,41 +192,41 @@ initialises the crypto context. One or more calls crypto_update/2 does the actual encryption or decryption for each block.

    This example shows first the encryption of two blocks and then decryptions of the cipher text, but divided into three blocks just to show that it is possible -to divide the plain text and cipher text differently for some ciphers:

    	1> crypto:start().
    +to divide the plain text and cipher text differently for some ciphers:

    	1> crypto:start().
     	ok
     	2> Key = <<1:128>>.
     	<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1>>
     	3> IV = <<0:128>>.
     	<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>>
    -	4> StateEnc = crypto:crypto_init(aes_128_ctr, Key, IV, true). % encrypt -> true
    +	4> StateEnc = crypto:crypto_init(aes_128_ctr, Key, IV, true). % encrypt -> true
     	#Ref<0.3768901617.1128660993.124047>
    -	5> crypto:crypto_update(StateEnc, <<"First bytes">>).
    +	5> crypto:crypto_update(StateEnc, <<"First bytes">>).
     	<<67,44,216,166,25,130,203,5,66,6,162>>
    -	6> crypto:crypto_update(StateEnc, <<"Second bytes">>).
    +	6> crypto:crypto_update(StateEnc, <<"Second bytes">>).
     	<<16,79,94,115,234,197,94,253,16,144,151,41>>
     	7>
    -	7> StateDec = crypto:crypto_init(aes_128_ctr, Key, IV, false). % decrypt -> false
    +	7> StateDec = crypto:crypto_init(aes_128_ctr, Key, IV, false). % decrypt -> false
     	#Ref<0.3768901617.1128660994.124255>
    -	8> crypto:crypto_update(StateDec, <<67,44,216,166,25,130,203>>).
    +	8> crypto:crypto_update(StateDec, <<67,44,216,166,25,130,203>>).
     	<<"First b">>
    -	9> crypto:crypto_update(StateDec, <<5,66,6,162,16,79,94,115,234,197,
    -        94,253,16,144,151>>).
    +	9> crypto:crypto_update(StateDec, <<5,66,6,162,16,79,94,115,234,197,
    +        94,253,16,144,151>>).
     	<<"ytesSecond byte">>
    -	10> crypto:crypto_update(StateDec, <<41>>).
    +	10> crypto:crypto_update(StateDec, <<41>>).
     	<<"s">>
     	11>

    Note that the internal data that the StateEnc and StateDec references are destructivly updated by the calls to crypto_update/2. This is to gain time in the calls of the nifs interfacing the cryptolib. In a loop where the state is saved in the loop's state, it also saves one update of the loop state per crypto operation.

    For example, a simple server receiving text parts to encrypt and send the result -back to the one who sent them (the Requester):

    	encode(Crypto, Key, IV) ->
    -	crypto_loop(crypto:crypto_init(Crypto, Key, IV, true)).
    +back to the one who sent them (the Requester):

    	encode(Crypto, Key, IV) ->
    +	crypto_loop(crypto:crypto_init(Crypto, Key, IV, true)).
     
    -	crypto_loop(State) ->
    +	crypto_loop(State) ->
     	receive
    -        {Text, Requester} ->
    -        Requester ! crypto:crypto_update(State, Text),
    -	loop(State)
    +        {Text, Requester} ->
    +        Requester ! crypto:crypto_update(State, Text),
    +	loop(State)
     	end.

    @@ -239,9 +239,9 @@ <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1>> 2> IV = <<0:128>>. <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>> - 3> Txt = [<<"First bytes">>,<<"Second bytes">>]. - [<<"First bytes">>,<<"Second bytes">>] - 4> crypto:crypto_one_time(aes_128_ctr, Key, IV, Txt, true). + 3> Txt = [<<"First bytes">>,<<"Second bytes">>]. + [<<"First bytes">>,<<"Second bytes">>] + 4> crypto:crypto_one_time(aes_128_ctr, Key, IV, Txt, true). <<67,44,216,166,25,130,203,5,66,6,162,16,79,94,115,234, 197,94,253,16,144,151,41>> 5>

    The [<<"First bytes">>,<<"Second bytes">>] could of course have been one @@ -257,14 +257,14 @@ <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1>> 2> IV = <<0:128>>. <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>> - 3> Txt = [<<"First bytes">>,<<"Second bytes">>]. - [<<"First bytes">>,<<"Second bytes">>] + 3> Txt = [<<"First bytes">>,<<"Second bytes">>]. + [<<"First bytes">>,<<"Second bytes">>] 4> AAD = <<"Some additional auth data">>. <<"Some additional auth data">> - 5> crypto:crypto_one_time_aead(aes_128_gcm, Key, IV, Txt, AAD, true). - {<<240,130,38,96,130,241,189,52,3,190,179,213,132,1,72, + 5> crypto:crypto_one_time_aead(aes_128_gcm, Key, IV, Txt, AAD, true). + {<<240,130,38,96,130,241,189,52,3,190,179,213,132,1,72, 192,103,176,90,104,15,71,158>>, - <<131,47,45,91,142,85,9,244,21,141,214,71,31,135,2,155>>} + <<131,47,45,91,142,85,9,244,21,141,214,71,31,135,2,155>>} 6>

    The [<<"First bytes">>,<<"Second bytes">>] could of course have been one single binary: <<"First bytesSecond bytes">>.

    @@ -274,21 +274,21 @@

    	1> Key = <<1:128>>.
     	<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1>>
    -	2> StateMac = crypto:mac_init(cmac, aes_128_cbc, Key).
    +	2> StateMac = crypto:mac_init(cmac, aes_128_cbc, Key).
     	#Ref<0.2424664121.2781478916.232610>
    -	3> crypto:mac_update(StateMac, <<"First bytes">>).
    +	3> crypto:mac_update(StateMac, <<"First bytes">>).
     	#Ref<0.2424664121.2781478916.232610>
    -	4> crypto:mac_update(StateMac, " ").
    +	4> crypto:mac_update(StateMac, " ").
     	#Ref<0.2424664121.2781478916.232610>
    -	5> crypto:mac_update(StateMac, <<"last bytes">>).
    +	5> crypto:mac_update(StateMac, <<"last bytes">>).
     	#Ref<0.2424664121.2781478916.232610>
    -	6> crypto:mac_final(StateMac).
    +	6> crypto:mac_final(StateMac).
     	<<68,191,219,128,84,77,11,193,197,238,107,6,214,141,160,
     	249>>
    -	7>

    and compare the result with a single calculation just for this example:

    	7> crypto:mac(cmac, aes_128_cbc, Key, "First bytes last bytes").
    +	7>

    and compare the result with a single calculation just for this example:

    	7> crypto:mac(cmac, aes_128_cbc, Key, "First bytes last bytes").
     	<<68,191,219,128,84,77,11,193,197,238,107,6,214,141,160,
     	249>>
    -	8> v(7) == v(6).
    +	8> v(7) == v(6).
     	true
     	9>

    @@ -345,7 +345,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/notes.html 2025-05-10 20:19:05.337156261 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/notes.html 2025-05-10 20:19:05.353156405 +0000 @@ -2233,7 +2233,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/search.html 2025-05-10 20:19:05.373156587 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.3/doc/html/search.html 2025-05-10 20:19:05.373156587 +0000 @@ -145,7 +145,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/404.html 2025-05-10 20:19:05.389156732 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/404.html 2025-05-10 20:19:05.389156732 +0000 @@ -147,7 +147,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/api-reference.html 2025-05-10 20:19:05.409156913 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/api-reference.html 2025-05-10 20:19:05.409156913 +0000 @@ -203,7 +203,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.epub/OEBPS/content.opf 2025-05-10 20:19:05.433157131 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.epub/OEBPS/content.opf 2025-05-10 20:19:05.437157167 +0000 @@ -4,10 +4,10 @@ version="3.0"> debugger - 5.5 - urn:uuid:bf0f16e0-d1c1-2808-728e-505e832a2025 + urn:uuid:9df97d7b-1019-9c56-6df3-3f6c702d8b85 en - 2025-05-10T20:11:33Z + 2041-06-12T09:31:40Z /usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.epub/OEBPS/debugger_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.epub/OEBPS/debugger_chapter.xhtml 2025-05-10 20:19:05.433157131 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.epub/OEBPS/debugger_chapter.xhtml 2025-05-10 20:19:05.437157167 +0000 @@ -59,12 +59,12 @@

    To have an effect, a breakpoint must be set at an executable line, which is a line of code containing an executable expression such as a matching or a function call. A blank line or a line containing a comment, function head, or -pattern in a case statement or receive statement is not executable.

    In the following example, lines 2, 4, 6, 8, and 11 are executable lines:

    1: is_loaded(Module,Compiled) ->
    -2:   case get_file(Module,Compiled) of
    -3:     {ok,File} ->
    -4:       case code:which(Module) of
    +pattern in a case statement or receive statement is not executable.

    In the following example, lines 2, 4, 6, 8, and 11 are executable lines:

    1: is_loaded(Module,Compiled) ->
    +2:   case get_file(Module,Compiled) of
    +3:     {ok,File} ->
    +4:       case code:which(Module) of
     5:         ?TAG ->
    -6:           {loaded,File};
    +6:           {loaded,File};
     7:         _ ->
     8:           unloaded
     9:       end;
    @@ -103,13 +103,13 @@
     returns unbound or {value,Value}.

    Conditional Break Dialog Window

    Right-click the Module entry to open a popup menu from which the appropriate module can be selected.

    Example:

    A conditional breakpoint calling c_test:c_break/1 is added at line 6 in module fact. Each time the breakpoint is reached, the function is called. When N is -equal to 3, the function returns true and the process stops.

    Extract from fact.erl:

    5. fac(0) -> 1;
    -6. fac(N) when N > 0, is_integer(N) -> N * fac(N-1).

    Definition of c_test:c_break/1:

    -module(c_test).
    --export([c_break/1]).
    +equal to 3, the function returns true and the process stops.

    Extract from fact.erl:

    5. fac(0) -> 1;
    +6. fac(N) when N > 0, is_integer(N) -> N * fac(N-1).

    Definition of c_test:c_break/1:

    -module(c_test).
    +-export([c_break/1]).
     
    -c_break(Bindings) ->
    -    case int:get_binding('N', Bindings) of
    -        {value, 3} ->
    +c_break(Bindings) ->
    +    case int:get_binding('N', Bindings) of
    +        {value, 3} ->
                 true;
             _ ->
                 false
    @@ -130,12 +130,12 @@
     

    The Erlang emulator keeps track of a stack trace, information about recent function calls. This information is used if an error occurs, for example:

    1> catch a+1.
    -{'EXIT',{badarith,[{erlang,'+',[a,1],[]},
    -                   {erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,573}]},
    -                   {erl_eval,expr,5,[{file,"erl_eval.erl"},{line,357}]},
    -                   {shell,exprs,7,[{file,"shell.erl"},{line,674}]},
    -                   {shell,eval_exprs,7,[{file,"shell.erl"},{line,629}]},
    -                   {shell,eval_loop,3,[{file,"shell.erl"},{line,614}]}]}}

    For details about the stack trace, see section +{'EXIT',{badarith,[{erlang,'+',[a,1],[]}, + {erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,573}]}, + {erl_eval,expr,5,[{file,"erl_eval.erl"},{line,357}]}, + {shell,exprs,7,[{file,"shell.erl"},{line,674}]}, + {shell,eval_exprs,7,[{file,"shell.erl"},{line,629}]}, + {shell,eval_loop,3,[{file,"shell.erl"},{line,614}]}]}}

    For details about the stack trace, see section Errors and Error Handling in the Erlang Reference Manual.

    Debugger emulates the stack trace by keeping track of recently called interpreted functions. (The real stack trace cannot be used, as it shows which /usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.epub/OEBPS/i.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.epub/OEBPS/i.xhtml 2025-05-10 20:19:05.433157131 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.epub/OEBPS/i.xhtml 2025-05-10 20:19:05.437157167 +0000 @@ -29,9 +29,9 @@ interpreted processes and break points.

    It is possible to attach to interpreted processes by only giving the corresponding process identity. By default, an attachment window is displayed. Processes at other Erlang nodes can be attached manually or automatically.

    The functions in this module are defined in the Erlang shell. That is, -they can be called without the i: prefix. For example:

    1> ii(t).
    -{module,t}
    -2> iaa([init]).
    +they can be called without the i: prefix. For example:

    1> ii(t).
    +{module,t}
    +2> iaa([init]).
     true
    /usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.epub/OEBPS/int.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.epub/OEBPS/int.xhtml 2025-05-10 20:19:05.433157131 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.epub/OEBPS/int.xhtml 2025-05-10 20:19:05.437157167 +0000 @@ -570,7 +570,7 @@

    Sets when and how to attach automatically to a process executing code in interpreted modules.

    By default when the interpreter is started, automatic attach is disabled.

    If Flags is an empty list, automatic attach is disabled.

    Otherwise Flags should be a list containing at least one of the following flags:

    • init - Attach when a process for the first time calls an interpreted -function.
    • break - Attach whenever a process reaches a breakpoint.
    • exit - Attach when a process terminates.

    When the specified event occurs, the function Function is called as:

    spawn(Module, Name, [Pid | Args])

    Pid is the pid of the process executing interpreted code.

    +function.
  • break - Attach whenever a process reaches a breakpoint.
  • exit - Attach when a process terminates.
  • When the specified event occurs, the function Function is called as:

    spawn(Module, Name, [Pid | Args])

    Pid is the pid of the process executing interpreted code.

    /usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.epub/OEBPS/notes.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.epub/OEBPS/notes.xhtml 2025-05-10 20:19:05.433157131 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.epub/OEBPS/notes.xhtml 2025-05-10 20:19:05.437157167 +0000 @@ -34,15 +34,15 @@
    • Defining a fun in the shell using the syntax fun Name/Arity would fail. This has been corrected so that the following now works:

      1> F = fun is_atom/1.
       #Fun.erl.42.18682967>
      -> F(a).
      +> F(a).
       true
       3> Id = fun id/1.
       #Fun.erl.42.18682967>
      -4> Id(42).
      +4> Id(42).
       ** exception error: undefined shell command id/1
      -5> id(I) -> I.
      +5> id(I) -> I.
       ok
      -6> Id(42).
      +6> Id(42).
       42

      The Debugger has also been corrected to correctly handle this syntax for a BIF.

      Own Id: OTP-19322 Aux Id: GH-8963, PR-8987

    /usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.html 2025-05-10 20:19:05.521157929 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.html 2025-05-10 20:19:05.525157964 +0000 @@ -347,7 +347,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger_chapter.html 2025-05-10 20:19:05.549158182 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger_chapter.html 2025-05-10 20:19:05.557158255 +0000 @@ -164,12 +164,12 @@

    To have an effect, a breakpoint must be set at an executable line, which is a line of code containing an executable expression such as a matching or a function call. A blank line or a line containing a comment, function head, or -pattern in a case statement or receive statement is not executable.

    In the following example, lines 2, 4, 6, 8, and 11 are executable lines:

    1: is_loaded(Module,Compiled) ->
    -2:   case get_file(Module,Compiled) of
    -3:     {ok,File} ->
    -4:       case code:which(Module) of
    +pattern in a case statement or receive statement is not executable.

    In the following example, lines 2, 4, 6, 8, and 11 are executable lines:

    1: is_loaded(Module,Compiled) ->
    +2:   case get_file(Module,Compiled) of
    +3:     {ok,File} ->
    +4:       case code:which(Module) of
     5:         ?TAG ->
    -6:           {loaded,File};
    +6:           {loaded,File};
     7:         _ ->
     8:           unloaded
     9:       end;
    @@ -208,13 +208,13 @@
     returns unbound or {value,Value}.

    Conditional Break Dialog Window

    Right-click the Module entry to open a popup menu from which the appropriate module can be selected.

    Example:

    A conditional breakpoint calling c_test:c_break/1 is added at line 6 in module fact. Each time the breakpoint is reached, the function is called. When N is -equal to 3, the function returns true and the process stops.

    Extract from fact.erl:

    5. fac(0) -> 1;
    -6. fac(N) when N > 0, is_integer(N) -> N * fac(N-1).

    Definition of c_test:c_break/1:

    -module(c_test).
    --export([c_break/1]).
    -
    -c_break(Bindings) ->
    -    case int:get_binding('N', Bindings) of
    -        {value, 3} ->
    +equal to 3, the function returns true and the process stops.

    Extract from fact.erl:

    5. fac(0) -> 1;
    +6. fac(N) when N > 0, is_integer(N) -> N * fac(N-1).

    Definition of c_test:c_break/1:

    -module(c_test).
    +-export([c_break/1]).
    +
    +c_break(Bindings) ->
    +    case int:get_binding('N', Bindings) of
    +        {value, 3} ->
                 true;
             _ ->
                 false
    @@ -235,12 +235,12 @@
     

    The Erlang emulator keeps track of a stack trace, information about recent function calls. This information is used if an error occurs, for example:

    1> catch a+1.
    -{'EXIT',{badarith,[{erlang,'+',[a,1],[]},
    -                   {erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,573}]},
    -                   {erl_eval,expr,5,[{file,"erl_eval.erl"},{line,357}]},
    -                   {shell,exprs,7,[{file,"shell.erl"},{line,674}]},
    -                   {shell,eval_exprs,7,[{file,"shell.erl"},{line,629}]},
    -                   {shell,eval_loop,3,[{file,"shell.erl"},{line,614}]}]}}

    For details about the stack trace, see section +{'EXIT',{badarith,[{erlang,'+',[a,1],[]}, + {erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,573}]}, + {erl_eval,expr,5,[{file,"erl_eval.erl"},{line,357}]}, + {shell,exprs,7,[{file,"shell.erl"},{line,674}]}, + {shell,eval_exprs,7,[{file,"shell.erl"},{line,629}]}, + {shell,eval_loop,3,[{file,"shell.erl"},{line,614}]}]}}

    For details about the stack trace, see section Errors and Error Handling in the Erlang Reference Manual.

    Debugger emulates the stack trace by keeping track of recently called interpreted functions. (The real stack trace cannot be used, as it shows which @@ -547,7 +547,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/i.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/i.html 2025-05-10 20:19:05.585158509 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/i.html 2025-05-10 20:19:05.593158582 +0000 @@ -134,9 +134,9 @@ interpreted processes and break points.

    It is possible to attach to interpreted processes by only giving the corresponding process identity. By default, an attachment window is displayed. Processes at other Erlang nodes can be attached manually or automatically.

    The functions in this module are defined in the Erlang shell. That is, -they can be called without the i: prefix. For example:

    1> ii(t).
    -{module,t}
    -2> iaa([init]).
    +they can be called without the i: prefix. For example:

    1> ii(t).
    +{module,t}
    +2> iaa([init]).
     true
    @@ -1350,7 +1350,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/int.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/int.html 2025-05-10 20:19:05.625158872 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/int.html 2025-05-10 20:19:05.633158944 +0000 @@ -686,7 +686,7 @@

    Sets when and how to attach automatically to a process executing code in interpreted modules.

    By default when the interpreter is started, automatic attach is disabled.

    If Flags is an empty list, automatic attach is disabled.

    Otherwise Flags should be a list containing at least one of the following flags:

    • init - Attach when a process for the first time calls an interpreted -function.
    • break - Attach whenever a process reaches a breakpoint.
    • exit - Attach when a process terminates.

    When the specified event occurs, the function Function is called as:

    spawn(Module, Name, [Pid | Args])

    Pid is the pid of the process executing interpreted code.

    +function.
  • break - Attach whenever a process reaches a breakpoint.
  • exit - Attach when a process terminates.
  • When the specified event occurs, the function Function is called as:

    spawn(Module, Name, [Pid | Args])

    Pid is the pid of the process executing interpreted code.

    @@ -1461,7 +1461,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/introduction.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/introduction.html 2025-05-10 20:19:05.653159126 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/introduction.html 2025-05-10 20:19:05.657159162 +0000 @@ -192,7 +192,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/notes.html 2025-05-10 20:19:05.681159379 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/notes.html 2025-05-10 20:19:05.689159452 +0000 @@ -139,15 +139,15 @@
    • Defining a fun in the shell using the syntax fun Name/Arity would fail. This has been corrected so that the following now works:

      1> F = fun is_atom/1.
       #Fun.erl.42.18682967>
      -> F(a).
      +> F(a).
       true
       3> Id = fun id/1.
       #Fun.erl.42.18682967>
      -4> Id(42).
      +4> Id(42).
       ** exception error: undefined shell command id/1
      -5> id(I) -> I.
      +5> id(I) -> I.
       ok
      -6> Id(42).
      +6> Id(42).
       42

      The Debugger has also been corrected to correctly handle this syntax for a BIF.

      Own Id: OTP-19322 Aux Id: GH-8963, PR-8987

    @@ -992,7 +992,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/search.html 2025-05-10 20:19:05.709159633 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/search.html 2025-05-10 20:19:05.709159633 +0000 @@ -145,7 +145,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/404.html 2025-05-10 20:19:05.725159778 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/404.html 2025-05-10 20:19:05.725159778 +0000 @@ -147,7 +147,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/api-reference.html 2025-05-10 20:19:05.745159960 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/api-reference.html 2025-05-10 20:19:05.745159960 +0000 @@ -185,7 +185,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer.epub/OEBPS/content.opf 2025-05-10 20:19:05.769160177 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer.epub/OEBPS/content.opf 2025-05-10 20:19:05.773160213 +0000 @@ -4,10 +4,10 @@ version="3.0"> dialyzer - 5.3.1 - urn:uuid:f2fdf9e7-75b7-dc6f-33a7-b33d5c4f4f27 + urn:uuid:c06e1971-a512-b766-6193-84f652d14298 en - 2025-05-10T20:12:09Z + 2041-06-12T09:32:14Z /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer.epub/OEBPS/dialyzer.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer.epub/OEBPS/dialyzer.xhtml 2025-05-10 20:19:05.769160177 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer.epub/OEBPS/dialyzer.xhtml 2025-05-10 20:19:05.773160213 +0000 @@ -165,13 +165,13 @@ repeating options which would otherwise need to be given explicitly to Dialyzer on every invocation.

    The location of the configuration file can be set via the DIALYZER_CONFIG environment variable, and defaults to within the user_config from -filename:basedir/3.

    An example configuration file's contents might be:

          {incremental,
    -        {default_apps,[stdlib,kernel,erts]},
    -        {default_warning_apps,[stdlib]}
    -      }.
    -      {warnings, [no_improper_lists]}.
    -      {add_pathsa,["/users/samwise/potatoes/ebin"]}.
    -      {add_pathsz,["/users/smeagol/fish/ebin"]}.

    +filename:basedir/3.

    An example configuration file's contents might be:

          {incremental,
    +        {default_apps,[stdlib,kernel,erts]},
    +        {default_warning_apps,[stdlib]}
    +      }.
    +      {warnings, [no_improper_lists]}.
    +      {add_pathsa,["/users/samwise/potatoes/ebin"]}.
    +      {add_pathsz,["/users/smeagol/fish/ebin"]}.

    @@ -179,13 +179,13 @@

    Attribute -dialyzer() can be used for turning off warnings in a module by specifying functions or warning options. For example, to turn off all warnings -for the function f/0, include the following line:

    -dialyzer({nowarn_function, f/0}).

    To turn off warnings for improper lists, add the following line to the source +for the function f/0, include the following line:

    -dialyzer({nowarn_function, f/0}).

    To turn off warnings for improper lists, add the following line to the source file:

    -dialyzer(no_improper_lists).

    Attribute -dialyzer() is allowed after function declarations. Lists of warning -options or functions are allowed:

    -dialyzer([{nowarn_function, [f/0]}, no_improper_lists]).

    Warning options can be restricted to functions:

    -dialyzer({no_improper_lists, g/0}).
    -dialyzer({[no_return, no_match], [g/0, h/0]}).

    The warning option for underspecified functions, -Wunderspecs, can result in +options or functions are allowed:

    -dialyzer([{nowarn_function, [f/0]}, no_improper_lists]).

    Warning options can be restricted to functions:

    -dialyzer({no_improper_lists, g/0}).
    -dialyzer({[no_return, no_match], [g/0, h/0]}).

    The warning option for underspecified functions, -Wunderspecs, can result in useful warnings, but often functions with specifications that are strictly more allowing than the success typing cannot easily be modified to be less allowing. To turn off the warning for underspecified function f/0, include the following -line:

    -dialyzer({no_underspecs, f/0}).

    For help on the warning options, use dialyzer -Whelp. The options are also +line:

    -dialyzer({no_underspecs, f/0}).

    For help on the warning options, use dialyzer -Whelp. The options are also enumerated, see type warn_option/0.

    Attribute -dialyzer() can also be used for turning on warnings. For example, if a module has been fixed regarding unmatched returns, adding the following line can help in assuring that no new unmatched return warnings are introduced:

    -dialyzer(unmatched_returns).
    /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer.epub/OEBPS/dialyzer_chapter.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer.epub/OEBPS/dialyzer_chapter.xhtml 2025-05-10 20:19:05.769160177 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer.epub/OEBPS/dialyzer_chapter.xhtml 2025-05-10 20:19:05.773160213 +0000 @@ -104,29 +104,29 @@ deduce). One implication of this is that if the user gives a spec for a function which overlaps with Dialyzer's inferred type, but is more restrictive, Dialyzer will trust those restrictions. This may then generate an error elsewhere that -follows from the erroneously restricted spec.

    Examples:

    Non-overlapping argument:

    -spec foo(boolean()) -> string().
    +follows from the erroneously restricted spec.

    Examples:

    Non-overlapping argument:

    -spec foo(boolean()) -> string().
     %% Dialyzer will infer: foo(integer()) -> string().
    -foo(N) ->
    -    integer_to_list(N).

    Since the type of the argument in the spec is different from the type that +foo(N) -> + integer_to_list(N).

    Since the type of the argument in the spec is different from the type that Dialyzer inferred, Dialyzer will generate the following warning:

    some_module.erl:7:2: Invalid type specification for function some_module:foo/1.
      The success typing is some_module:foo
    -          (integer()) -> string()
    +          (integer()) -> string()
      But the spec is some_module:foo
    -          (boolean()) -> string()
    - They do not overlap in the 1st argument

    Non-overlapping return:

    -spec bar(a | b) -> atom().
    +          (boolean()) -> string()
    + They do not overlap in the 1st argument

    Non-overlapping return:

    -spec bar(a | b) -> atom().
     %% Dialyzer will infer: bar(a | b) -> binary().
    -bar(a) -> <<"a">>;
    -bar(b) -> <<"b">>.

    Since the return value in the spec and the return value inferred by Dialyzer are +bar(a) -> <<"a">>; +bar(b) -> <<"b">>.

    Since the return value in the spec and the return value inferred by Dialyzer are different, Dialyzer will generate the following warning:

    some_module.erl:11:2: Invalid type specification for function some_module:bar/1.
      The success typing is some_module:bar
    -          ('a' | 'b') -> <<_:8>>
    +          ('a' | 'b') -> <<_:8>>
      But the spec is some_module:bar
    -          ('a' | 'b') -> atom()
    - The return types do not overlap

    Overlapping spec and inferred type:

    -spec baz(a | b) -> non_neg_integer().
    +          ('a' | 'b') -> atom()
    + The return types do not overlap

    Overlapping spec and inferred type:

    -spec baz(a | b) -> non_neg_integer().
     %% Dialyzer will infer: baz(b | c | d) -> -1 | 0 | 1.
    -baz(b) -> -1;
    -baz(c) -> 0;
    -baz(d) -> 1.

    Dialyzer will "trust" the spec and using the intersection of the spec and +baz(b) -> -1; +baz(c) -> 0; +baz(d) -> 1.

    Dialyzer will "trust" the spec and using the intersection of the spec and inferred type:

    baz(b) -> 0 | 1.

    Notice how the c and d from the argument to baz/1 and the -1 in the return from the inferred type were dropped once the spec and inferred type were intersected. This could result in warnings being emitted for later functions.

    For example, if baz/1 is called like this:

    call_baz1(A) ->
    /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer.html	2025-05-10 20:19:05.833160757 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer.html	2025-05-10 20:19:05.841160829 +0000
    @@ -270,13 +270,13 @@
     repeating options which would otherwise need to be given explicitly to Dialyzer
     on every invocation.

    The location of the configuration file can be set via the DIALYZER_CONFIG environment variable, and defaults to within the user_config from -filename:basedir/3.

    An example configuration file's contents might be:

          {incremental,
    -        {default_apps,[stdlib,kernel,erts]},
    -        {default_warning_apps,[stdlib]}
    -      }.
    -      {warnings, [no_improper_lists]}.
    -      {add_pathsa,["/users/samwise/potatoes/ebin"]}.
    -      {add_pathsz,["/users/smeagol/fish/ebin"]}.

    +filename:basedir/3.

    An example configuration file's contents might be:

          {incremental,
    +        {default_apps,[stdlib,kernel,erts]},
    +        {default_warning_apps,[stdlib]}
    +      }.
    +      {warnings, [no_improper_lists]}.
    +      {add_pathsa,["/users/samwise/potatoes/ebin"]}.
    +      {add_pathsz,["/users/smeagol/fish/ebin"]}.

    @@ -284,13 +284,13 @@

    Attribute -dialyzer() can be used for turning off warnings in a module by specifying functions or warning options. For example, to turn off all warnings -for the function f/0, include the following line:

    -dialyzer({nowarn_function, f/0}).

    To turn off warnings for improper lists, add the following line to the source +for the function f/0, include the following line:

    -dialyzer({nowarn_function, f/0}).

    To turn off warnings for improper lists, add the following line to the source file:

    -dialyzer(no_improper_lists).

    Attribute -dialyzer() is allowed after function declarations. Lists of warning -options or functions are allowed:

    -dialyzer([{nowarn_function, [f/0]}, no_improper_lists]).

    Warning options can be restricted to functions:

    -dialyzer({no_improper_lists, g/0}).
    -dialyzer({[no_return, no_match], [g/0, h/0]}).

    The warning option for underspecified functions, -Wunderspecs, can result in +options or functions are allowed:

    -dialyzer([{nowarn_function, [f/0]}, no_improper_lists]).

    Warning options can be restricted to functions:

    -dialyzer({no_improper_lists, g/0}).
    -dialyzer({[no_return, no_match], [g/0, h/0]}).

    The warning option for underspecified functions, -Wunderspecs, can result in useful warnings, but often functions with specifications that are strictly more allowing than the success typing cannot easily be modified to be less allowing. To turn off the warning for underspecified function f/0, include the following -line:

    -dialyzer({no_underspecs, f/0}).

    For help on the warning options, use dialyzer -Whelp. The options are also +line:

    -dialyzer({no_underspecs, f/0}).

    For help on the warning options, use dialyzer -Whelp. The options are also enumerated, see type warn_option/0.

    Attribute -dialyzer() can also be used for turning on warnings. For example, if a module has been fixed regarding unmatched returns, adding the following line can help in assuring that no new unmatched return warnings are introduced:

    -dialyzer(unmatched_returns).
    @@ -882,7 +882,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer_chapter.html 2025-05-10 20:19:05.861161011 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer_chapter.html 2025-05-10 20:19:05.865161047 +0000 @@ -209,29 +209,29 @@ deduce). One implication of this is that if the user gives a spec for a function which overlaps with Dialyzer's inferred type, but is more restrictive, Dialyzer will trust those restrictions. This may then generate an error elsewhere that -follows from the erroneously restricted spec.

    Examples:

    Non-overlapping argument:

    -spec foo(boolean()) -> string().
    +follows from the erroneously restricted spec.

    Examples:

    Non-overlapping argument:

    -spec foo(boolean()) -> string().
     %% Dialyzer will infer: foo(integer()) -> string().
    -foo(N) ->
    -    integer_to_list(N).

    Since the type of the argument in the spec is different from the type that +foo(N) -> + integer_to_list(N).

    Since the type of the argument in the spec is different from the type that Dialyzer inferred, Dialyzer will generate the following warning:

    some_module.erl:7:2: Invalid type specification for function some_module:foo/1.
      The success typing is some_module:foo
    -          (integer()) -> string()
    +          (integer()) -> string()
      But the spec is some_module:foo
    -          (boolean()) -> string()
    - They do not overlap in the 1st argument

    Non-overlapping return:

    -spec bar(a | b) -> atom().
    +          (boolean()) -> string()
    + They do not overlap in the 1st argument

    Non-overlapping return:

    -spec bar(a | b) -> atom().
     %% Dialyzer will infer: bar(a | b) -> binary().
    -bar(a) -> <<"a">>;
    -bar(b) -> <<"b">>.

    Since the return value in the spec and the return value inferred by Dialyzer are +bar(a) -> <<"a">>; +bar(b) -> <<"b">>.

    Since the return value in the spec and the return value inferred by Dialyzer are different, Dialyzer will generate the following warning:

    some_module.erl:11:2: Invalid type specification for function some_module:bar/1.
      The success typing is some_module:bar
    -          ('a' | 'b') -> <<_:8>>
    +          ('a' | 'b') -> <<_:8>>
      But the spec is some_module:bar
    -          ('a' | 'b') -> atom()
    - The return types do not overlap

    Overlapping spec and inferred type:

    -spec baz(a | b) -> non_neg_integer().
    +          ('a' | 'b') -> atom()
    + The return types do not overlap

    Overlapping spec and inferred type:

    -spec baz(a | b) -> non_neg_integer().
     %% Dialyzer will infer: baz(b | c | d) -> -1 | 0 | 1.
    -baz(b) -> -1;
    -baz(c) -> 0;
    -baz(d) -> 1.

    Dialyzer will "trust" the spec and using the intersection of the spec and +baz(b) -> -1; +baz(c) -> 0; +baz(d) -> 1.

    Dialyzer will "trust" the spec and using the intersection of the spec and inferred type:

    baz(b) -> 0 | 1.

    Notice how the c and d from the argument to baz/1 and the -1 in the return from the inferred type were dropped once the spec and inferred type were intersected. This could result in warnings being emitted for later functions.

    For example, if baz/1 is called like this:

    call_baz1(A) ->
    @@ -306,7 +306,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/notes.html 2025-05-10 20:19:05.901161374 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/notes.html 2025-05-10 20:19:05.917161519 +0000 @@ -1891,7 +1891,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/search.html 2025-05-10 20:19:05.933161664 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/search.html 2025-05-10 20:19:05.937161700 +0000 @@ -145,7 +145,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/typer_cmd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/typer_cmd.html 2025-05-10 20:19:05.953161845 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/typer_cmd.html 2025-05-10 20:19:05.957161882 +0000 @@ -200,7 +200,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/404.html 2025-05-10 20:19:05.973162027 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/404.html 2025-05-10 20:19:05.973162027 +0000 @@ -147,7 +147,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/api-reference.html 2025-05-10 20:19:05.993162208 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/api-reference.html 2025-05-10 20:19:05.997162244 +0000 @@ -246,7 +246,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.epub/OEBPS/content.opf 2025-05-10 20:19:06.025162498 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.epub/OEBPS/content.opf 2025-05-10 20:19:06.029162534 +0000 @@ -4,10 +4,10 @@ version="3.0"> diameter - 2.4.1 - urn:uuid:ebed4384-6833-e20f-2e39-c39c75bbe5d3 + urn:uuid:99cac37a-ff0d-1552-34d0-079f3c956764 en - 2025-05-10T20:11:55Z + 2041-06-12T09:32:02Z /usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.epub/OEBPS/diameter.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.epub/OEBPS/diameter.xhtml 2025-05-10 20:19:06.025162498 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.epub/OEBPS/diameter.xhtml 2025-05-10 20:19:06.029162534 +0000 @@ -124,14 +124,14 @@ containing only 0 (NO_INBAND_SECURITY). If 1 (TLS) is specified then TLS is selected if the CER/CEA received from the peer offers it.

  • {'Acct-Application-Id', [Unsigned32()]}

  • {'Vendor-Specific-Application-Id', [Grouped()]}

  • {'Firmware-Revision',Unsigned32()}

  • Note that each tuple communicates one or more AVP values. It is an error to specify duplicate tuples.

  • eval() = {M,F,A} | fun() | [eval() | A] - An expression that can be -evaluated as a function in the following sense.

    eval([{M,F,A} | T]) ->
    -    apply(M, F, T ++ A);
    -eval([[F|A] | T]) ->
    -    eval([F | T ++ A]);
    -eval([F|A]) ->
    -    apply(F, A);
    -eval(F) ->
    -    eval([F]).

    Applying an eval() E to an argument list A is meant +evaluated as a function in the following sense.

    eval([{M,F,A} | T]) ->
    +    apply(M, F, T ++ A);
    +eval([[F|A] | T]) ->
    +    eval([F | T ++ A]);
    +eval([F|A]) ->
    +    apply(F, A);
    +eval(F) ->
    +    eval([F]).

    Applying an eval() E to an argument list A is meant in the sense of eval([E|A]).

    Warning

    Beware of using fun expressions of the form fun Name/Arity in situations in which the fun is not short-lived and code is to be upgraded at runtime since any processes retaining such a fun will have a reference to old code. @@ -174,10 +174,10 @@ service_event() record. Can have one of the following types.

    • start

    • stop - The service is being started or stopped. No event precedes a start event. No event follows a stop event, and this event implies the -termination of all transport processes.

    • {up, Ref, Peer, Config, Pkt}

    • {up, Ref, Peer, Config}

    • {down, Ref, Peer, Config}

      Ref    = transport_ref()
      -Peer   = diameter_app:peer()
      -Config = {connect|listen, [transport_opt()]}
      -Pkt    = #diameter_packet{}

      The RFC 3539 watchdog state machine has transitioned into (up) or out of +termination of all transport processes.

    • {up, Ref, Peer, Config, Pkt}

    • {up, Ref, Peer, Config}

    • {down, Ref, Peer, Config}

      Ref    = transport_ref()
      +Peer   = diameter_app:peer()
      +Config = {connect|listen, [transport_opt()]}
      +Pkt    = #diameter_packet{}

      The RFC 3539 watchdog state machine has transitioned into (up) or out of (down) the OKAY state. If a #diameter_packet{} is present in an up event then there has been a capabilities exchange on a newly established transport connection and the record contains the received CER or CEA.

      Note that a single up or down event for a given peer corresponds to @@ -203,20 +203,20 @@ Pkt = #diameter_packet{}

  • An incoming CER contained errors and has been answered with the indicated result code. Caps contains values for the local node only. Pkt contains the CER in question.

  • {'CER', timeout} - An expected CER was not received within -capx_timeout of connection establishment.

  • {'CEA', Result, Caps, Pkt}

    Result = ResultCode | atom() | {capabilities_cb, CB, ResultCode|discard}
    -Caps = #diameter_caps{}
    -Pkt  = #diameter_packet{}
    -ResultCode = integer()

    An incoming CEA has been rejected for the indicated reason. An +capx_timeout of connection establishment.

  • {'CEA', Result, Caps, Pkt}

    Result = ResultCode | atom() | {capabilities_cb, CB, ResultCode|discard}
    +Caps = #diameter_caps{}
    +Pkt  = #diameter_packet{}
    +ResultCode = integer()

    An incoming CEA has been rejected for the indicated reason. An integer-valued Result indicates the result code sent by the peer. Caps contains pairs of values for the local node and remote peer. Pkt contains the CEA in question. In the case of rejection by a capabilities callback, the tuple contains the rejecting callback.

  • {'CEA', Caps, Pkt}

    Caps = #diameter_caps{}
     Pkt  = #diameter_packet{}

    An incoming CEA contained errors and has been rejected. Caps contains only values for the local node. Pkt contains the CEA in question.

  • {'CEA', timeout} - An expected CEA was not received within -capx_timeout of connection establishment.

  • {watchdog, Ref, PeerRef, {From, To}, Config}

    Ref = transport_ref()
    -PeerRef = diameter_app:peer_ref()
    +capx_timeout of connection establishment.

  • {watchdog, Ref, PeerRef, {From, To}, Config}

    Ref = transport_ref()
    +PeerRef = diameter_app:peer_ref()
     From, To = initial | okay | suspect | down | reopen
    -Config = {connect|listen, [transport_opt()]}

    An RFC 3539 watchdog state machine has changed state.

  • any/0 - For forward compatibility, a subscriber should be prepared +Config = {connect|listen, [transport_opt()]}

  • An RFC 3539 watchdog state machine has changed state.

  • any/0 - For forward compatibility, a subscriber should be prepared to receive info fields of forms other than the above.

  • service_name() = term() - Name of a service as passed to start_service/2 and with which the service is identified. There can be at most one service with a given name on a given node. Note that @@ -464,10 +464,10 @@ which a started transport process should be terminated if it has not yet established a connection. For example, the following options on a connecting transport request a connection with one peer over SCTP or another (typically -the same) over TCP.

    {transport_module, diameter_sctp}
    -{transport_config, SctpOpts, 5000}
    -{transport_module, diameter_tcp}
    -{transport_config, TcpOpts}

    To listen on both SCTP and TCP, define one transport for each.

  • {transport_module, atom()} - Module implementing +the same) over TCP.

    {transport_module, diameter_sctp}
    +{transport_config, SctpOpts, 5000}
    +{transport_module, diameter_tcp}
    +{transport_config, TcpOpts}

    To listen on both SCTP and TCP, define one transport for each.

  • {transport_module, atom()} - Module implementing a transport process as defined in diameter_transport. Defaults to diameter_tcp.

    Multiple transport_module and transport_config options are allowed. The @@ -2438,13 +2438,13 @@

    Remove previously added transports.

    Pred determines which transports to remove. An arity-3-valued Pred removes all transports for which Pred(Ref, Type, Opts) returns true, where Type and Opts are as passed to add_transport/2 and Ref is as returned by it. -The remaining forms are equivalent to an arity-3 fun as follows.

    Pred = fun(transport_ref(), list()):  fun(Ref, _, Opts) -> Pred(Ref, Opts) end
    -Pred = fun(list()):                   fun(_, _, Opts) -> Pred(Opts) end
    -Pred = transport_ref():               fun(Ref, _, _)  -> Pred == Ref end
    -Pred = list():                        fun(_, _, Opts) -> [] == Pred -- Opts end
    -Pred = true:                          fun(_, _, _) -> true end
    -Pred = false:                         fun(_, _, _) -> false end
    -Pred = {M,F,A}:  fun(Ref, Type, Opts) -> apply(M, F, [Ref, Type, Opts | A]) end

    Removing a transport causes the corresponding transport processes to be +The remaining forms are equivalent to an arity-3 fun as follows.

    Pred = fun(transport_ref(), list()):  fun(Ref, _, Opts) -> Pred(Ref, Opts) end
    +Pred = fun(list()):                   fun(_, _, Opts) -> Pred(Opts) end
    +Pred = transport_ref():               fun(Ref, _, _)  -> Pred == Ref end
    +Pred = list():                        fun(_, _, Opts) -> [] == Pred -- Opts end
    +Pred = true:                          fun(_, _, _) -> true end
    +Pred = false:                         fun(_, _, _) -> false end
    +Pred = {M,F,A}:  fun(Ref, Type, Opts) -> apply(M, F, [Ref, Type, Opts | A]) end

    Removing a transport causes the corresponding transport processes to be terminated. Whether or not a DPR message is sent to a peer is controlled by value of disconnect_cb configured on the transport.

    @@ -2488,52 +2488,52 @@ containing both configuration and information about established peer connections. An example return value with for a client service with Origin-Host "client.example.com" configured with a single transport connected -to "server.example.com" might look as follows.

    [[{ref,#Ref<0.0.0.93>},
    -  {type,connect},
    -  {options,[{transport_module,diameter_tcp},
    -            {transport_config,[{ip,{127,0,0,1}},
    -                               {raddr,{127,0,0,1}},
    -                               {rport,3868},
    -                               {reuseaddr,true}]}]},
    -  {watchdog,{<0.66.0>,-576460736368485571,okay}},
    -  {peer,{<0.67.0>,-576460736357885808}},
    -  {apps,[{0,common}]},
    -  {caps,[{origin_host,{"client.example.com","server.example.com"}},
    -         {origin_realm,{"example.com","example.com"}},
    -         {host_ip_address,{[{127,0,0,1}],[{127,0,0,1}]}},
    -         {vendor_id,{0,193}},
    -         {product_name,{"Client","Server"}},
    -         {origin_state_id,{[],[]}},
    -         {supported_vendor_id,{[],[]}},
    -         {auth_application_id,{[0],[0]}},
    -         {inband_security_id,{[],[0]}},
    -         {acct_application_id,{[],[]}},
    -         {vendor_specific_application_id,{[],[]}},
    -         {firmware_revision,{[],[]}},
    -         {avp,{[],[]}}]},
    -  {port,[{owner,<0.69.0>},
    -         {module,diameter_tcp},
    -         {socket,{{127,0,0,1},48758}},
    -         {peer,{{127,0,0,1},3868}},
    -         {statistics,[{recv_oct,656},
    -                      {recv_cnt,6},
    -                      {recv_max,148},
    -                      {recv_avg,109},
    -                      {recv_dvi,19},
    -                      {send_oct,836},
    -                      {send_cnt,6},
    -                      {send_max,184},
    -                      {send_avg,139},
    -                      {send_pend,0}]}]},
    -  {statistics,[{{{0,258,0},recv},3},
    -               {{{0,258,1},send},3},
    -               {{{0,258,0},recv,{'Result-Code',2001}},3},
    -               {{{0,257,0},recv},1},
    -               {{{0,257,1},send},1},
    -               {{{0,257,0},recv,{'Result-Code',2001}},1},
    -               {{{0,280,1},recv},2},
    -               {{{0,280,0},send},2},
    -               {{{0,280,0},send,{'Result-Code',2001}},2}]}]]

    Here ref is a transport_ref() and options +to "server.example.com" might look as follows.

    [[{ref,#Ref<0.0.0.93>},
    +  {type,connect},
    +  {options,[{transport_module,diameter_tcp},
    +            {transport_config,[{ip,{127,0,0,1}},
    +                               {raddr,{127,0,0,1}},
    +                               {rport,3868},
    +                               {reuseaddr,true}]}]},
    +  {watchdog,{<0.66.0>,-576460736368485571,okay}},
    +  {peer,{<0.67.0>,-576460736357885808}},
    +  {apps,[{0,common}]},
    +  {caps,[{origin_host,{"client.example.com","server.example.com"}},
    +         {origin_realm,{"example.com","example.com"}},
    +         {host_ip_address,{[{127,0,0,1}],[{127,0,0,1}]}},
    +         {vendor_id,{0,193}},
    +         {product_name,{"Client","Server"}},
    +         {origin_state_id,{[],[]}},
    +         {supported_vendor_id,{[],[]}},
    +         {auth_application_id,{[0],[0]}},
    +         {inband_security_id,{[],[0]}},
    +         {acct_application_id,{[],[]}},
    +         {vendor_specific_application_id,{[],[]}},
    +         {firmware_revision,{[],[]}},
    +         {avp,{[],[]}}]},
    +  {port,[{owner,<0.69.0>},
    +         {module,diameter_tcp},
    +         {socket,{{127,0,0,1},48758}},
    +         {peer,{{127,0,0,1},3868}},
    +         {statistics,[{recv_oct,656},
    +                      {recv_cnt,6},
    +                      {recv_max,148},
    +                      {recv_avg,109},
    +                      {recv_dvi,19},
    +                      {send_oct,836},
    +                      {send_cnt,6},
    +                      {send_max,184},
    +                      {send_avg,139},
    +                      {send_pend,0}]}]},
    +  {statistics,[{{{0,258,0},recv},3},
    +               {{{0,258,1},send},3},
    +               {{{0,258,0},recv,{'Result-Code',2001}},3},
    +               {{{0,257,0},recv},1},
    +               {{{0,257,1},send},1},
    +               {{{0,257,0},recv,{'Result-Code',2001}},1},
    +               {{{0,280,1},recv},2},
    +               {{{0,280,0},send},2},
    +               {{{0,280,0},send,{'Result-Code',2001}},2}]}]]

    Here ref is a transport_ref() and options /usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.epub/OEBPS/diameter_app.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.epub/OEBPS/diameter_app.xhtml 2025-05-10 20:19:06.025162498 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.epub/OEBPS/diameter_app.xhtml 2025-05-10 20:19:06.029162534 +0000 @@ -598,12 +598,12 @@ diameter:start_service/2) is determined by the Application Identifier in the header of the incoming request message, the selected module being the one whose corresponding dictionary declares itself as defining either the application in -question or the Relay application.

    The argument packet() has the following signature.

    #diameter_packet{header = #diameter_header{},
    -                 avps   = [#diameter_avp{}],
    -                 msg    = record() | undefined,
    -                 errors = [Unsigned32() | {Unsigned32(), #diameter_avp{}}],
    -                 bin    = binary(),
    -                 transport_data = term()}

    The msg field will be undefined in case the request has been received in the +question or the Relay application.

    The argument packet() has the following signature.

    #diameter_packet{header = #diameter_header{},
    +                 avps   = [#diameter_avp{}],
    +                 msg    = record() | undefined,
    +                 errors = [Unsigned32() | {Unsigned32(), #diameter_avp{}}],
    +                 bin    = binary(),
    +                 transport_data = term()}

    The msg field will be undefined in case the request has been received in the relay application. Otherwise it contains the record representing the request as outlined in diameter_dict(4).

    The errors field specifies any results codes identifying errors found while decoding the request. This is used to set Result-Code and/or Failed-AVP in a /usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.epub/OEBPS/diameter_codec.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.epub/OEBPS/diameter_codec.xhtml 2025-05-10 20:19:06.021162462 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.epub/OEBPS/diameter_codec.xhtml 2025-05-10 20:19:06.029162534 +0000 @@ -34,7 +34,7 @@ results may differ from those returned by the functions documented here, depending on configuration.

    The header() and packet() records below are defined in diameter.hrl, -which can be included as follows.

    -include_lib("diameter/include/diameter.hrl").

    Application-specific records are defined in the hrl files resulting from +which can be included as follows.

    -include_lib("diameter/include/diameter.hrl").

    Application-specific records are defined in the hrl files resulting from dictionary file compilation.

    /usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.epub/OEBPS/diameter_dict.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.epub/OEBPS/diameter_dict.xhtml 2025-05-10 20:19:06.021162462 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.epub/OEBPS/diameter_dict.xhtml 2025-05-10 20:19:06.029162534 +0000 @@ -204,14 +204,14 @@ an incoming request.

    In cases in which there is a choice between string() and binary() types for OctetString() and derived types, the representation is determined by the value of diameter:service_opt() -string_decode.

    Basic AVP Data Formats

    OctetString() = string() | binary()
    -Integer32()   = -2147483647..2147483647
    -Integer64()   = -9223372036854775807..9223372036854775807
    -Unsigned32()  = 0..4294967295
    -Unsigned64()  = 0..18446744073709551615
    -Float32()     = '-infinity' | float() | infinity
    -Float64()     = '-infinity' | float() | infinity
    -Grouped()     = record()

    On encode, an OctetString() can be specified as an iolist(), excessively large +string_decode.

    Basic AVP Data Formats

    OctetString() = string() | binary()
    +Integer32()   = -2147483647..2147483647
    +Integer64()   = -9223372036854775807..9223372036854775807
    +Unsigned32()  = 0..4294967295
    +Unsigned64()  = 0..18446744073709551615
    +Float32()     = '-infinity' | float() | infinity
    +Float64()     = '-infinity' | float() | infinity
    +Grouped()     = record()

    On encode, an OctetString() can be specified as an iolist(), excessively large floats (in absolute value) are equivalent to infinity or '-infinity' and excessively large integers result in encode failure. The records for grouped AVPs are as discussed in the previous section.

    Derived AVP Data Formats

    Address() = OctetString()
    @@ -219,14 +219,14 @@
     while an IPv6 address is parsed in any of the formats specified by section 2.2
     of RFC 2373, "Text Representation of Addresses". An IPv4 tuple() has length 4
     and contains values of type 0..255. An IPv6 tuple() has length 8 and contains
    -values of type 0..65535. The tuple representation is used on decode.

    Time() = {date(), time()}
    +values of type 0..65535. The tuple representation is used on decode.

    Time() = {date(), time()}
     
     where
     
    -  date() = {Year, Month, Day}
    -  time() = {Hour, Minute, Second}
    +  date() = {Year, Month, Day}
    +  time() = {Hour, Minute, Second}
     
    -  Year   = integer()
    +  Year   = integer()
       Month  = 1..12
       Day    = 1..31
       Hour   = 0..23
    @@ -254,8 +254,8 @@
     diameter respectively. The grammar of an OctetString-valued DiameterURI() is as
     specified in section 4.3 of RFC 6733. The record representation is used on
     decode.

    Enumerated() = Integer32()

    On encode, values can be specified using the macros defined in a dictionary's -hrl file.

    IPFilterRule()  = OctetString()
    -QoSFilterRule() = OctetString()

    Values of these types are not currently parsed by diameter.

    +hrl file.

    IPFilterRule()  = OctetString()
    +QoSFilterRule() = OctetString()

    Values of these types are not currently parsed by diameter.

    /usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.epub/OEBPS/diameterc_cmd.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.epub/OEBPS/diameterc_cmd.xhtml 2025-05-10 20:19:06.021162462 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.epub/OEBPS/diameterc_cmd.xhtml 2025-05-10 20:19:06.025162498 +0000 @@ -26,7 +26,7 @@ Synopsis

    -
    diameterc [<options>] <file>

    +
    diameterc [<options>] <file>

    /usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.html 2025-05-10 20:19:06.181163912 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.html 2025-05-10 20:19:06.205164130 +0000 @@ -229,14 +229,14 @@ containing only 0 (NO_INBAND_SECURITY). If 1 (TLS) is specified then TLS is selected if the CER/CEA received from the peer offers it.

  • {'Acct-Application-Id', [Unsigned32()]}

  • {'Vendor-Specific-Application-Id', [Grouped()]}

  • {'Firmware-Revision',Unsigned32()}

  • Note that each tuple communicates one or more AVP values. It is an error to specify duplicate tuples.

  • eval() = {M,F,A} | fun() | [eval() | A] - An expression that can be -evaluated as a function in the following sense.

    eval([{M,F,A} | T]) ->
    -    apply(M, F, T ++ A);
    -eval([[F|A] | T]) ->
    -    eval([F | T ++ A]);
    -eval([F|A]) ->
    -    apply(F, A);
    -eval(F) ->
    -    eval([F]).

    Applying an eval() E to an argument list A is meant +evaluated as a function in the following sense.

    eval([{M,F,A} | T]) ->
    +    apply(M, F, T ++ A);
    +eval([[F|A] | T]) ->
    +    eval([F | T ++ A]);
    +eval([F|A]) ->
    +    apply(F, A);
    +eval(F) ->
    +    eval([F]).

    Applying an eval() E to an argument list A is meant in the sense of eval([E|A]).

    Warning

    Beware of using fun expressions of the form fun Name/Arity in situations in which the fun is not short-lived and code is to be upgraded at runtime since any processes retaining such a fun will have a reference to old code. @@ -279,10 +279,10 @@ service_event() record. Can have one of the following types.

    • start

    • stop - The service is being started or stopped. No event precedes a start event. No event follows a stop event, and this event implies the -termination of all transport processes.

    • {up, Ref, Peer, Config, Pkt}

    • {up, Ref, Peer, Config}

    • {down, Ref, Peer, Config}

      Ref    = transport_ref()
      -Peer   = diameter_app:peer()
      -Config = {connect|listen, [transport_opt()]}
      -Pkt    = #diameter_packet{}

      The RFC 3539 watchdog state machine has transitioned into (up) or out of +termination of all transport processes.

    • {up, Ref, Peer, Config, Pkt}

    • {up, Ref, Peer, Config}

    • {down, Ref, Peer, Config}

      Ref    = transport_ref()
      +Peer   = diameter_app:peer()
      +Config = {connect|listen, [transport_opt()]}
      +Pkt    = #diameter_packet{}

      The RFC 3539 watchdog state machine has transitioned into (up) or out of (down) the OKAY state. If a #diameter_packet{} is present in an up event then there has been a capabilities exchange on a newly established transport connection and the record contains the received CER or CEA.

      Note that a single up or down event for a given peer corresponds to @@ -308,20 +308,20 @@ Pkt = #diameter_packet{}

  • An incoming CER contained errors and has been answered with the indicated result code. Caps contains values for the local node only. Pkt contains the CER in question.

  • {'CER', timeout} - An expected CER was not received within -capx_timeout of connection establishment.

  • {'CEA', Result, Caps, Pkt}

    Result = ResultCode | atom() | {capabilities_cb, CB, ResultCode|discard}
    -Caps = #diameter_caps{}
    -Pkt  = #diameter_packet{}
    -ResultCode = integer()

    An incoming CEA has been rejected for the indicated reason. An +capx_timeout of connection establishment.

  • {'CEA', Result, Caps, Pkt}

    Result = ResultCode | atom() | {capabilities_cb, CB, ResultCode|discard}
    +Caps = #diameter_caps{}
    +Pkt  = #diameter_packet{}
    +ResultCode = integer()

    An incoming CEA has been rejected for the indicated reason. An integer-valued Result indicates the result code sent by the peer. Caps contains pairs of values for the local node and remote peer. Pkt contains the CEA in question. In the case of rejection by a capabilities callback, the tuple contains the rejecting callback.

  • {'CEA', Caps, Pkt}

    Caps = #diameter_caps{}
     Pkt  = #diameter_packet{}

    An incoming CEA contained errors and has been rejected. Caps contains only values for the local node. Pkt contains the CEA in question.

  • {'CEA', timeout} - An expected CEA was not received within -capx_timeout of connection establishment.

  • {watchdog, Ref, PeerRef, {From, To}, Config}

    Ref = transport_ref()
    -PeerRef = diameter_app:peer_ref()
    +capx_timeout of connection establishment.

  • {watchdog, Ref, PeerRef, {From, To}, Config}

    Ref = transport_ref()
    +PeerRef = diameter_app:peer_ref()
     From, To = initial | okay | suspect | down | reopen
    -Config = {connect|listen, [transport_opt()]}

    An RFC 3539 watchdog state machine has changed state.

  • any/0 - For forward compatibility, a subscriber should be prepared +Config = {connect|listen, [transport_opt()]}

  • An RFC 3539 watchdog state machine has changed state.

  • any/0 - For forward compatibility, a subscriber should be prepared to receive info fields of forms other than the above.

  • service_name() = term() - Name of a service as passed to start_service/2 and with which the service is identified. There can be at most one service with a given name on a given node. Note that @@ -569,10 +569,10 @@ which a started transport process should be terminated if it has not yet established a connection. For example, the following options on a connecting transport request a connection with one peer over SCTP or another (typically -the same) over TCP.

    {transport_module, diameter_sctp}
    -{transport_config, SctpOpts, 5000}
    -{transport_module, diameter_tcp}
    -{transport_config, TcpOpts}

    To listen on both SCTP and TCP, define one transport for each.

  • {transport_module, atom()} - Module implementing +the same) over TCP.

    {transport_module, diameter_sctp}
    +{transport_config, SctpOpts, 5000}
    +{transport_module, diameter_tcp}
    +{transport_config, TcpOpts}

    To listen on both SCTP and TCP, define one transport for each.

  • {transport_module, atom()} - Module implementing a transport process as defined in diameter_transport. Defaults to diameter_tcp.

    Multiple transport_module and transport_config options are allowed. The @@ -2559,13 +2559,13 @@

    Remove previously added transports.

    Pred determines which transports to remove. An arity-3-valued Pred removes all transports for which Pred(Ref, Type, Opts) returns true, where Type and Opts are as passed to add_transport/2 and Ref is as returned by it. -The remaining forms are equivalent to an arity-3 fun as follows.

    Pred = fun(transport_ref(), list()):  fun(Ref, _, Opts) -> Pred(Ref, Opts) end
    -Pred = fun(list()):                   fun(_, _, Opts) -> Pred(Opts) end
    -Pred = transport_ref():               fun(Ref, _, _)  -> Pred == Ref end
    -Pred = list():                        fun(_, _, Opts) -> [] == Pred -- Opts end
    -Pred = true:                          fun(_, _, _) -> true end
    -Pred = false:                         fun(_, _, _) -> false end
    -Pred = {M,F,A}:  fun(Ref, Type, Opts) -> apply(M, F, [Ref, Type, Opts | A]) end

    Removing a transport causes the corresponding transport processes to be +The remaining forms are equivalent to an arity-3 fun as follows.

    Pred = fun(transport_ref(), list()):  fun(Ref, _, Opts) -> Pred(Ref, Opts) end
    +Pred = fun(list()):                   fun(_, _, Opts) -> Pred(Opts) end
    +Pred = transport_ref():               fun(Ref, _, _)  -> Pred == Ref end
    +Pred = list():                        fun(_, _, Opts) -> [] == Pred -- Opts end
    +Pred = true:                          fun(_, _, _) -> true end
    +Pred = false:                         fun(_, _, _) -> false end
    +Pred = {M,F,A}:  fun(Ref, Type, Opts) -> apply(M, F, [Ref, Type, Opts | A]) end

    Removing a transport causes the corresponding transport processes to be terminated. Whether or not a DPR message is sent to a peer is controlled by value of disconnect_cb configured on the transport.

    @@ -2609,52 +2609,52 @@ containing both configuration and information about established peer connections. An example return value with for a client service with Origin-Host "client.example.com" configured with a single transport connected -to "server.example.com" might look as follows.

    [[{ref,#Ref<0.0.0.93>},
    -  {type,connect},
    -  {options,[{transport_module,diameter_tcp},
    -            {transport_config,[{ip,{127,0,0,1}},
    -                               {raddr,{127,0,0,1}},
    -                               {rport,3868},
    -                               {reuseaddr,true}]}]},
    -  {watchdog,{<0.66.0>,-576460736368485571,okay}},
    -  {peer,{<0.67.0>,-576460736357885808}},
    -  {apps,[{0,common}]},
    -  {caps,[{origin_host,{"client.example.com","server.example.com"}},
    -         {origin_realm,{"example.com","example.com"}},
    -         {host_ip_address,{[{127,0,0,1}],[{127,0,0,1}]}},
    -         {vendor_id,{0,193}},
    -         {product_name,{"Client","Server"}},
    -         {origin_state_id,{[],[]}},
    -         {supported_vendor_id,{[],[]}},
    -         {auth_application_id,{[0],[0]}},
    -         {inband_security_id,{[],[0]}},
    -         {acct_application_id,{[],[]}},
    -         {vendor_specific_application_id,{[],[]}},
    -         {firmware_revision,{[],[]}},
    -         {avp,{[],[]}}]},
    -  {port,[{owner,<0.69.0>},
    -         {module,diameter_tcp},
    -         {socket,{{127,0,0,1},48758}},
    -         {peer,{{127,0,0,1},3868}},
    -         {statistics,[{recv_oct,656},
    -                      {recv_cnt,6},
    -                      {recv_max,148},
    -                      {recv_avg,109},
    -                      {recv_dvi,19},
    -                      {send_oct,836},
    -                      {send_cnt,6},
    -                      {send_max,184},
    -                      {send_avg,139},
    -                      {send_pend,0}]}]},
    -  {statistics,[{{{0,258,0},recv},3},
    -               {{{0,258,1},send},3},
    -               {{{0,258,0},recv,{'Result-Code',2001}},3},
    -               {{{0,257,0},recv},1},
    -               {{{0,257,1},send},1},
    -               {{{0,257,0},recv,{'Result-Code',2001}},1},
    -               {{{0,280,1},recv},2},
    -               {{{0,280,0},send},2},
    -               {{{0,280,0},send,{'Result-Code',2001}},2}]}]]

    Here ref is a transport_ref() and options +to "server.example.com" might look as follows.

    [[{ref,#Ref<0.0.0.93>},
    +  {type,connect},
    +  {options,[{transport_module,diameter_tcp},
    +            {transport_config,[{ip,{127,0,0,1}},
    +                               {raddr,{127,0,0,1}},
    +                               {rport,3868},
    +                               {reuseaddr,true}]}]},
    +  {watchdog,{<0.66.0>,-576460736368485571,okay}},
    +  {peer,{<0.67.0>,-576460736357885808}},
    +  {apps,[{0,common}]},
    +  {caps,[{origin_host,{"client.example.com","server.example.com"}},
    +         {origin_realm,{"example.com","example.com"}},
    +         {host_ip_address,{[{127,0,0,1}],[{127,0,0,1}]}},
    +         {vendor_id,{0,193}},
    +         {product_name,{"Client","Server"}},
    +         {origin_state_id,{[],[]}},
    +         {supported_vendor_id,{[],[]}},
    +         {auth_application_id,{[0],[0]}},
    +         {inband_security_id,{[],[0]}},
    +         {acct_application_id,{[],[]}},
    +         {vendor_specific_application_id,{[],[]}},
    +         {firmware_revision,{[],[]}},
    +         {avp,{[],[]}}]},
    +  {port,[{owner,<0.69.0>},
    +         {module,diameter_tcp},
    +         {socket,{{127,0,0,1},48758}},
    +         {peer,{{127,0,0,1},3868}},
    +         {statistics,[{recv_oct,656},
    +                      {recv_cnt,6},
    +                      {recv_max,148},
    +                      {recv_avg,109},
    +                      {recv_dvi,19},
    +                      {send_oct,836},
    +                      {send_cnt,6},
    +                      {send_max,184},
    +                      {send_avg,139},
    +                      {send_pend,0}]}]},
    +  {statistics,[{{{0,258,0},recv},3},
    +               {{{0,258,1},send},3},
    +               {{{0,258,0},recv,{'Result-Code',2001}},3},
    +               {{{0,257,0},recv},1},
    +               {{{0,257,1},send},1},
    +               {{{0,257,0},recv,{'Result-Code',2001}},1},
    +               {{{0,280,1},recv},2},
    +               {{{0,280,0},send},2},
    +               {{{0,280,0},send,{'Result-Code',2001}},2}]}]]

    Here ref is a transport_ref() and options /usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_app.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_app.html 2025-05-10 20:19:06.245164493 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_app.html 2025-05-10 20:19:06.245164493 +0000 @@ -719,12 +719,12 @@ diameter:start_service/2) is determined by the Application Identifier in the header of the incoming request message, the selected module being the one whose corresponding dictionary declares itself as defining either the application in -question or the Relay application.

    The argument packet() has the following signature.

    #diameter_packet{header = #diameter_header{},
    -                 avps   = [#diameter_avp{}],
    -                 msg    = record() | undefined,
    -                 errors = [Unsigned32() | {Unsigned32(), #diameter_avp{}}],
    -                 bin    = binary(),
    -                 transport_data = term()}

    The msg field will be undefined in case the request has been received in the +question or the Relay application.

    The argument packet() has the following signature.

    #diameter_packet{header = #diameter_header{},
    +                 avps   = [#diameter_avp{}],
    +                 msg    = record() | undefined,
    +                 errors = [Unsigned32() | {Unsigned32(), #diameter_avp{}}],
    +                 bin    = binary(),
    +                 transport_data = term()}

    The msg field will be undefined in case the request has been received in the relay application. Otherwise it contains the record representing the request as outlined in diameter_dict(4).

    The errors field specifies any results codes identifying errors found while decoding the request. This is used to set Result-Code and/or Failed-AVP in a @@ -1042,7 +1042,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_codec.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_codec.html 2025-05-10 20:19:06.277164783 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_codec.html 2025-05-10 20:19:06.277164783 +0000 @@ -139,7 +139,7 @@ results may differ from those returned by the functions documented here, depending on configuration.

    The header() and packet() records below are defined in diameter.hrl, -which can be included as follows.

    -include_lib("diameter/include/diameter.hrl").

    Application-specific records are defined in the hrl files resulting from +which can be included as follows.

    -include_lib("diameter/include/diameter.hrl").

    Application-specific records are defined in the hrl files resulting from dictionary file compilation.

    @@ -561,7 +561,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_dict.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_dict.html 2025-05-10 20:19:06.305165037 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_dict.html 2025-05-10 20:19:06.305165037 +0000 @@ -309,14 +309,14 @@ an incoming request.

    In cases in which there is a choice between string() and binary() types for OctetString() and derived types, the representation is determined by the value of diameter:service_opt() -string_decode.

    Basic AVP Data Formats

    OctetString() = string() | binary()
    -Integer32()   = -2147483647..2147483647
    -Integer64()   = -9223372036854775807..9223372036854775807
    -Unsigned32()  = 0..4294967295
    -Unsigned64()  = 0..18446744073709551615
    -Float32()     = '-infinity' | float() | infinity
    -Float64()     = '-infinity' | float() | infinity
    -Grouped()     = record()

    On encode, an OctetString() can be specified as an iolist(), excessively large +string_decode.

    Basic AVP Data Formats

    OctetString() = string() | binary()
    +Integer32()   = -2147483647..2147483647
    +Integer64()   = -9223372036854775807..9223372036854775807
    +Unsigned32()  = 0..4294967295
    +Unsigned64()  = 0..18446744073709551615
    +Float32()     = '-infinity' | float() | infinity
    +Float64()     = '-infinity' | float() | infinity
    +Grouped()     = record()

    On encode, an OctetString() can be specified as an iolist(), excessively large floats (in absolute value) are equivalent to infinity or '-infinity' and excessively large integers result in encode failure. The records for grouped AVPs are as discussed in the previous section.

    Derived AVP Data Formats

    Address() = OctetString()
    @@ -324,14 +324,14 @@
     while an IPv6 address is parsed in any of the formats specified by section 2.2
     of RFC 2373, "Text Representation of Addresses". An IPv4 tuple() has length 4
     and contains values of type 0..255. An IPv6 tuple() has length 8 and contains
    -values of type 0..65535. The tuple representation is used on decode.

    Time() = {date(), time()}
    +values of type 0..65535. The tuple representation is used on decode.

    Time() = {date(), time()}
     
     where
     
    -  date() = {Year, Month, Day}
    -  time() = {Hour, Minute, Second}
    +  date() = {Year, Month, Day}
    +  time() = {Hour, Minute, Second}
     
    -  Year   = integer()
    +  Year   = integer()
       Month  = 1..12
       Day    = 1..31
       Hour   = 0..23
    @@ -344,8 +344,8 @@
     UTF8String() can be specified as a binary, or as a nested list of binaries and
     codepoints.

    DiameterIdentity() = OctetString()

    A value must have length at least 1.

    DiameterURI() = OctetString()
                   | #href_anchor"" id="Enumerated">

    Enumerated() = Integer32()

    On encode, values can be specified using the macros defined in a dictionary's -hrl file.

    IPFilterRule()  = OctetString()
    -QoSFilterRule() = OctetString()

    Values of these types are not currently parsed by diameter.

    +hrl file.

    IPFilterRule()  = OctetString()
    +QoSFilterRule() = OctetString()

    Values of these types are not currently parsed by diameter.

    @@ -394,7 +394,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_examples.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_examples.html 2025-05-10 20:19:06.329165254 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_examples.html 2025-05-10 20:19:06.329165254 +0000 @@ -176,7 +176,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_intro.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_intro.html 2025-05-10 20:19:06.353165471 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_intro.html 2025-05-10 20:19:06.353165471 +0000 @@ -204,7 +204,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_make.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_make.html 2025-05-10 20:19:06.377165689 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_make.html 2025-05-10 20:19:06.377165689 +0000 @@ -537,7 +537,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_sctp.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_sctp.html 2025-05-10 20:19:06.405165943 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_sctp.html 2025-05-10 20:19:06.405165943 +0000 @@ -451,7 +451,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_service.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_service.html 2025-05-10 20:19:06.429166161 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_service.html 2025-05-10 20:19:06.429166161 +0000 @@ -220,7 +220,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_soc.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_soc.html 2025-05-10 20:19:06.481166632 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_soc.html 2025-05-10 20:19:06.481166632 +0000 @@ -190,7 +190,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_tcp.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_tcp.html 2025-05-10 20:19:06.509166886 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_tcp.html 2025-05-10 20:19:06.509166886 +0000 @@ -486,7 +486,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_transport.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_transport.html 2025-05-10 20:19:06.533167104 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_transport.html 2025-05-10 20:19:06.533167104 +0000 @@ -323,7 +323,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_using.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_using.html 2025-05-10 20:19:06.553167284 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_using.html 2025-05-10 20:19:06.557167321 +0000 @@ -176,7 +176,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameterc_cmd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameterc_cmd.html 2025-05-10 20:19:06.577167502 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameterc_cmd.html 2025-05-10 20:19:06.577167502 +0000 @@ -131,7 +131,7 @@ Synopsis

    -
    diameterc [<options>] <file>

    +
    diameterc [<options>] <file>

    @@ -202,7 +202,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/notes.html 2025-05-10 20:19:06.617167865 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/notes.html 2025-05-10 20:19:06.617167865 +0000 @@ -1362,7 +1362,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/search.html 2025-05-10 20:19:06.637168046 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/search.html 2025-05-10 20:19:06.637168046 +0000 @@ -145,7 +145,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/404.html 2025-05-10 20:19:06.657168228 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/404.html 2025-05-10 20:19:06.657168228 +0000 @@ -143,7 +143,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/api-reference.html 2025-05-10 20:19:06.677168409 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/api-reference.html 2025-05-10 20:19:06.677168409 +0000 @@ -262,7 +262,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/chapter.html 2025-05-10 20:19:06.721168808 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/chapter.html 2025-05-10 20:19:06.721168808 +0000 @@ -829,7 +829,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/doc_storage.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/doc_storage.html 2025-05-10 20:19:06.745169026 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/doc_storage.html 2025-05-10 20:19:06.745169026 +0000 @@ -236,7 +236,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc.html 2025-05-10 20:19:06.789169425 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc.html 2025-05-10 20:19:06.789169425 +0000 @@ -1407,7 +1407,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_cmd.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_cmd.html 2025-05-10 20:19:06.813169641 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_cmd.html 2025-05-10 20:19:06.813169641 +0000 @@ -187,7 +187,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_doclet.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_doclet.html 2025-05-10 20:19:06.837169859 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_doclet.html 2025-05-10 20:19:06.837169859 +0000 @@ -444,7 +444,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_doclet_chunks.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_doclet_chunks.html 2025-05-10 20:19:06.857170041 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_doclet_chunks.html 2025-05-10 20:19:06.857170041 +0000 @@ -218,7 +218,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_doclet_markdown.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_doclet_markdown.html 2025-05-10 20:19:06.881170259 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_doclet_markdown.html 2025-05-10 20:19:06.881170259 +0000 @@ -128,8 +128,8 @@
    -

    Doclet converting an edoc application to use EEP-59 and Markdown.

    This doclet has to be used together with edoc_layout_chunks.

    Example:

     1> edoc:application(example, [{preprocess, true}, {doclet, edoc_doclet_markdown},
    -       {layout, edoc_layout_chunks}]).

    It will convert the overview to Markdown and any module documentation to use -doc attributes and Markdown. Any XHTML tags in the edoc documentation that are not part of the tags supported by Erlang Documentation Format will be added as HTML tags in the Markdown.

    It does not delete the old edoc documentation.

    See also: edoc_layout_chunks.

    +

    Doclet converting an edoc application to use EEP-59 and Markdown.

    This doclet has to be used together with edoc_layout_chunks.

    Example:

     1> edoc:application(example, [{preprocess, true}, {doclet, edoc_doclet_markdown},
    +       {layout, edoc_layout_chunks}]).

    It will convert the overview to Markdown and any module documentation to use -doc attributes and Markdown. Any XHTML tags in the edoc documentation that are not part of the tags supported by Erlang Documentation Format will be added as HTML tags in the Markdown.

    It does not delete the old edoc documentation.

    See also: edoc_layout_chunks.

    @@ -219,7 +219,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_extract.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_extract.html 2025-05-10 20:19:06.913170549 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_extract.html 2025-05-10 20:19:06.913170549 +0000 @@ -653,7 +653,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_html_to_markdown.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_html_to_markdown.html 2025-05-10 20:19:06.933170730 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_html_to_markdown.html 2025-05-10 20:19:06.933170730 +0000 @@ -219,7 +219,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_layout.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_layout.html 2025-05-10 20:19:06.961170984 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_layout.html 2025-05-10 20:19:06.961170984 +0000 @@ -405,7 +405,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_layout_chunks.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_layout_chunks.html 2025-05-10 20:19:06.985171201 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_layout_chunks.html 2025-05-10 20:19:06.989171238 +0000 @@ -748,7 +748,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_lib.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_lib.html 2025-05-10 20:19:07.013171455 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_lib.html 2025-05-10 20:19:07.013171455 +0000 @@ -449,7 +449,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_run.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_run.html 2025-05-10 20:19:07.037171673 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_run.html 2025-05-10 20:19:07.037171673 +0000 @@ -358,7 +358,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/notes.html 2025-05-10 20:19:07.073171999 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/notes.html 2025-05-10 20:19:07.073171999 +0000 @@ -856,7 +856,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/search.html 2025-05-10 20:19:07.089172144 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/search.html 2025-05-10 20:19:07.089172144 +0000 @@ -141,7 +141,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/404.html 2025-05-10 20:19:07.109172326 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/404.html 2025-05-10 20:19:07.109172326 +0000 @@ -147,7 +147,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/api-reference.html 2025-05-10 20:19:07.129172507 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/api-reference.html 2025-05-10 20:19:07.129172507 +0000 @@ -185,7 +185,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/eldap.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/eldap.epub/OEBPS/content.opf 2025-05-10 20:19:07.157172760 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/eldap.epub/OEBPS/content.opf 2025-05-10 20:19:07.157172760 +0000 @@ -4,10 +4,10 @@ version="3.0"> eldap - 1.2.14 - urn:uuid:131f15de-6efa-0ac1-0c87-575ff70381a2 + urn:uuid:fa4d7fcc-18ce-3ee0-f057-bb8b5fb9d473 en - 2025-05-10T20:12:06Z + 2041-06-12T09:32:12Z /usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/eldap.epub/OEBPS/eldap.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/eldap.epub/OEBPS/eldap.xhtml 2025-05-10 20:19:07.153172724 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/eldap.epub/OEBPS/eldap.xhtml 2025-05-10 20:19:07.157172760 +0000 @@ -854,13 +854,13 @@ -

    Add an entry. The entry must not exist.

      add(Handle,
    +

    Add an entry. The entry must not exist.

      add(Handle,
           "cn=Bill Valentine, ou=people, o=Example Org, dc=example, dc=com",
    -       [{"objectclass", ["person"]},
    -        {"cn", ["Bill Valentine"]},
    -        {"sn", ["Valentine"]},
    -        {"telephoneNumber", ["545 555 00"]}]
    -     )
    +
    [{"objectclass", ["person"]}, + {"cn", ["Bill Valentine"]}, + {"sn", ["Valentine"]}, + {"telephoneNumber", ["545 555 00"]}] + )
    @@ -1172,7 +1172,7 @@ -

    Creates an extensible match filter. For example,

      eldap:extensibleMatch("Bar", [{type,"sn"}, {matchingRule,"caseExactMatch"}]))

    creates a filter which performs a caseExactMatch on the attribute sn and +

    Creates an extensible match filter. For example,

      eldap:extensibleMatch("Bar", [{type,"sn"}, {matchingRule,"caseExactMatch"}]))

    creates a filter which performs a caseExactMatch on the attribute sn and matches with the value "Bar". The default value of dnAttributes is false.

    @@ -1390,9 +1390,9 @@ -

    Modify an entry.

      modify(Handle, "cn=Bill Valentine, ou=people, o=Example Org, dc=example, dc=com",
    -         [eldap:mod_replace("telephoneNumber", ["555 555 00"]),
    -	  eldap:mod_add("description", ["LDAP Hacker"]) ])
    +

    Modify an entry.

      modify(Handle, "cn=Bill Valentine, ou=people, o=Example Org, dc=example, dc=com",
    +         [eldap:mod_replace("telephoneNumber", ["555 555 00"]),
    +	  eldap:mod_add("description", ["LDAP Hacker"]) ])
    @@ -1712,8 +1712,8 @@

    Paged results is an extension to the LDAP protocol specified by RFC2696

    This function creates a control with the specified page size for use in -search/3, for example:

    Control = eldap:paged_result_control(50),
    -{ok, SearchResults} = search(Handle, [{base, "dc=example, dc=com"}], [Control]),
    +search/3, for example:

    Control = eldap:paged_result_control(50),
    +{ok, SearchResults} = search(Handle, [{base, "dc=example, dc=com"}], [Control]),
    @@ -1746,12 +1746,12 @@

    Paged results is an extension to the LDAP protocol specified by RFC2696

    This function creates a control with the specified page size and cookie for use in search/3 to retrieve the next results page.

    For example:

    PageSize = 50,
    -Control1 = eldap:paged_result_control(PageSize),
    -{ok, SearchResults1} = search(Handle, [{base, "dc=example, dc=com"}], [Control1]),
    +Control1 = eldap:paged_result_control(PageSize),
    +{ok, SearchResults1} = search(Handle, [{base, "dc=example, dc=com"}], [Control1]),
     %% retrieve the returned cookie from the search results
    -{ok, Cookie1} = eldap:paged_result_cookie(SearchResults1),
    -Control2 = eldap:paged_result_control(PageSize, Cookie1),
    -{ok, SearchResults2} = eldap:search(Handle, [{base, "dc=example,dc=com"}], [Control2]),
    +{ok, Cookie1} = eldap:paged_result_cookie(SearchResults1),
    +Control2 = eldap:paged_result_control(PageSize, Cookie1),
    +{ok, SearchResults2} = eldap:search(Handle, [{base, "dc=example,dc=com"}], [Control2]),
     %% etc
    @@ -1871,8 +1871,8 @@

    Search the directory with the supplied the SearchOptions.

    The base and filter options must be supplied. Default values: scope is wholeSubtree/0, deref is -derefAlways/0, types_only is false and timeout is 0 (meaning infinity).

      Filter = eldap:substrings("cn", [{any,"V"}]),
    -  search(Handle, [{base, "dc=example, dc=com"}, {filter, Filter}, {attributes, ["cn"]}]),

    The timeout option in the SearchOptions is for the ldap server, while the +derefAlways/0, types_only is false and timeout is 0 (meaning infinity).

      Filter = eldap:substrings("cn", [{any,"V"}]),
    +  search(Handle, [{base, "dc=example, dc=com"}, {filter, Filter}, {attributes, ["cn"]}]),

    The timeout option in the SearchOptions is for the ldap server, while the timeout in eldap:open/2 is used for each individual request in the search operation.

    /usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/eldap.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/eldap.html 2025-05-10 20:19:07.237173486 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/eldap.html 2025-05-10 20:19:07.237173486 +0000 @@ -975,13 +975,13 @@ -

    Add an entry. The entry must not exist.

      add(Handle,
    +

    Add an entry. The entry must not exist.

      add(Handle,
           "cn=Bill Valentine, ou=people, o=Example Org, dc=example, dc=com",
    -       [{"objectclass", ["person"]},
    -        {"cn", ["Bill Valentine"]},
    -        {"sn", ["Valentine"]},
    -        {"telephoneNumber", ["545 555 00"]}]
    -     )
    +
    [{"objectclass", ["person"]}, + {"cn", ["Bill Valentine"]}, + {"sn", ["Valentine"]}, + {"telephoneNumber", ["545 555 00"]}] + )
    @@ -1293,7 +1293,7 @@ -

    Creates an extensible match filter. For example,

      eldap:extensibleMatch("Bar", [{type,"sn"}, {matchingRule,"caseExactMatch"}]))

    creates a filter which performs a caseExactMatch on the attribute sn and +

    Creates an extensible match filter. For example,

      eldap:extensibleMatch("Bar", [{type,"sn"}, {matchingRule,"caseExactMatch"}]))

    creates a filter which performs a caseExactMatch on the attribute sn and matches with the value "Bar". The default value of dnAttributes is false.

    @@ -1511,9 +1511,9 @@ -

    Modify an entry.

      modify(Handle, "cn=Bill Valentine, ou=people, o=Example Org, dc=example, dc=com",
    -         [eldap:mod_replace("telephoneNumber", ["555 555 00"]),
    -	  eldap:mod_add("description", ["LDAP Hacker"]) ])
    +

    Modify an entry.

      modify(Handle, "cn=Bill Valentine, ou=people, o=Example Org, dc=example, dc=com",
    +         [eldap:mod_replace("telephoneNumber", ["555 555 00"]),
    +	  eldap:mod_add("description", ["LDAP Hacker"]) ])
    @@ -1833,8 +1833,8 @@

    Paged results is an extension to the LDAP protocol specified by RFC2696

    This function creates a control with the specified page size for use in -search/3, for example:

    Control = eldap:paged_result_control(50),
    -{ok, SearchResults} = search(Handle, [{base, "dc=example, dc=com"}], [Control]),
    +search/3, for example:

    Control = eldap:paged_result_control(50),
    +{ok, SearchResults} = search(Handle, [{base, "dc=example, dc=com"}], [Control]),
    @@ -1867,12 +1867,12 @@

    Paged results is an extension to the LDAP protocol specified by RFC2696

    This function creates a control with the specified page size and cookie for use in search/3 to retrieve the next results page.

    For example:

    PageSize = 50,
    -Control1 = eldap:paged_result_control(PageSize),
    -{ok, SearchResults1} = search(Handle, [{base, "dc=example, dc=com"}], [Control1]),
    +Control1 = eldap:paged_result_control(PageSize),
    +{ok, SearchResults1} = search(Handle, [{base, "dc=example, dc=com"}], [Control1]),
     %% retrieve the returned cookie from the search results
    -{ok, Cookie1} = eldap:paged_result_cookie(SearchResults1),
    -Control2 = eldap:paged_result_control(PageSize, Cookie1),
    -{ok, SearchResults2} = eldap:search(Handle, [{base, "dc=example,dc=com"}], [Control2]),
    +{ok, Cookie1} = eldap:paged_result_cookie(SearchResults1),
    +Control2 = eldap:paged_result_control(PageSize, Cookie1),
    +{ok, SearchResults2} = eldap:search(Handle, [{base, "dc=example,dc=com"}], [Control2]),
     %% etc
    @@ -1992,8 +1992,8 @@

    Search the directory with the supplied the SearchOptions.

    The base and filter options must be supplied. Default values: scope is wholeSubtree/0, deref is -derefAlways/0, types_only is false and timeout is 0 (meaning infinity).

      Filter = eldap:substrings("cn", [{any,"V"}]),
    -  search(Handle, [{base, "dc=example, dc=com"}, {filter, Filter}, {attributes, ["cn"]}]),

    The timeout option in the SearchOptions is for the ldap server, while the +derefAlways/0, types_only is false and timeout is 0 (meaning infinity).

      Filter = eldap:substrings("cn", [{any,"V"}]),
    +  search(Handle, [{base, "dc=example, dc=com"}, {filter, Filter}, {attributes, ["cn"]}]),

    The timeout option in the SearchOptions is for the ldap server, while the timeout in eldap:open/2 is used for each individual request in the search operation.

    @@ -2233,7 +2233,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/notes.html 2025-05-10 20:19:07.265173740 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/notes.html 2025-05-10 20:19:07.265173740 +0000 @@ -515,7 +515,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/search.html 2025-05-10 20:19:07.285173921 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/search.html 2025-05-10 20:19:07.285173921 +0000 @@ -145,7 +145,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/404.html 2025-05-10 20:19:07.305174103 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/404.html 2025-05-10 20:19:07.305174103 +0000 @@ -135,7 +135,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei.html 2025-05-10 20:19:07.357174573 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei.html 2025-05-10 20:19:07.357174573 +0000 @@ -151,30 +151,30 @@ Data Types

    -
    • ei_term

      typedef struct {
      +
      • ei_term

        typedef struct {
             char ei_type;
             int arity;
             int size;
        -    union {
        +    union {
           long i_val;
           double d_val;
        -  char atom_name[MAXATOMLEN_UTF8];
        +  char atom_name[MAXATOMLEN_UTF8];
           erlang_pid pid;
           erlang_port port;
           erlang_ref ref;
        -    } value;
        -} ei_term;

        Structure written by ei_decode_ei_term(). The + } value; +} ei_term;

      Structure written by ei_decode_ei_term(). The ei_type field is the type of the term which equals to what ei_get_type() sets *type to.

    • ei_x_buff - A dynamically resized buffer. It is a struct with two fields of interest for the user:

      • char *buff - Pointer to the dynamically allocated buffer.

      • int index - Offset to the next byte to write which also equals the amount of bytes currently written.

      An ei_x_buff is initialized by calling either ei_x_new() or ei_x_new_with_version(). The memory used by an initialized ei_x_buff is released by calling -ei_x_free().

    • erlang_char_encoding

      typedef enum {
      +ei_x_free().

    • erlang_char_encoding

      typedef enum {
           ERLANG_ASCII = 1,
           ERLANG_LATIN1 = 2,
           ERLANG_UTF8 = 4
      -} erlang_char_encoding;

      The character encodings used for atoms. ERLANG_ASCII represents 7-bit ASCII. +} erlang_char_encoding;

    The character encodings used for atoms. ERLANG_ASCII represents 7-bit ASCII. Latin-1 and UTF-8 are different extensions of 7-bit ASCII. All 7-bit ASCII characters are valid Latin-1 and UTF-8 characters. ASCII and Latin-1 both represent each character by one byte. An UTF-8 character can consist of 1-4 @@ -190,7 +190,7 @@ ei_cmp_pids()

    -
    int ei_cmp_pids(erlang_pid *a, erlang_pid *b);

    Compare two process identifiers. The comparison is done the same way as Erlang +

    int ei_cmp_pids(erlang_pid *a, erlang_pid *b);

    Compare two process identifiers. The comparison is done the same way as Erlang does.

    Returns 0 if a and b are equal. Returns a value less than 0 if a compares as less than b. Returns a value larger than 0 if a compares as larger than b.

    Available since OTP 23.0

    @@ -199,7 +199,7 @@ ei_cmp_ports()

    -
    int ei_cmp_ports(erlang_port *a, erlang_port *b);

    Compare two port identifiers. The comparison is done the same way as Erlang +

    int ei_cmp_ports(erlang_port *a, erlang_port *b);

    Compare two port identifiers. The comparison is done the same way as Erlang does.

    Returns 0 if a and b are equal. Returns a value less than 0 if a compares as less than b. Returns a value larger than 0 if a compares as larger than b.

    Available since OTP 23.0

    @@ -208,7 +208,7 @@ ei_cmp_refs()

    -
    int ei_cmp_refs(erlang_ref *a, erlang_ref *b);

    Compare two references. The comparison is done the same way as Erlang does.

    Returns 0 if a and b are equal. Returns a value less than 0 if a +

    int ei_cmp_refs(erlang_ref *a, erlang_ref *b);

    Compare two references. The comparison is done the same way as Erlang does.

    Returns 0 if a and b are equal. Returns a value less than 0 if a compares as less than b. Returns a value larger than 0 if a compares as larger than b.

    Available since OTP 23.0

    @@ -216,15 +216,15 @@ ei_decode_atom()

    -
    int ei_decode_atom(const char *buf, int *index, char *p);

    Decodes an atom from the binary format. The NULL-terminated name of the atom +

    int ei_decode_atom(const char *buf, int *index, char *p);

    Decodes an atom from the binary format. The NULL-terminated name of the atom is placed at p. At most MAXATOMLEN bytes can be placed in the buffer.

    ei_decode_atom_as()

    -
    int ei_decode_atom_as(const char *buf, int *index, char *p, int plen,
    -  erlang_char_encoding want, erlang_char_encoding* was, erlang_char_encoding* result);

    Decodes an atom from the binary format. The NULL-terminated name of the atom +

    int ei_decode_atom_as(const char *buf, int *index, char *p, int plen,
    +  erlang_char_encoding want, erlang_char_encoding* was, erlang_char_encoding* result);

    Decodes an atom from the binary format. The NULL-terminated name of the atom is placed in buffer at p of length plen bytes.

    The wanted string encoding is specified by want. The original encoding used in the binary format (Latin-1 or UTF-8) can be obtained from *was. The encoding of the resulting string (7-bit ASCII, @@ -239,7 +239,7 @@ ei_decode_bignum() -

    int ei_decode_bignum(const char *buf, int *index, mpz_t obj);

    Decodes an integer in the binary format to a GMP mpz_t integer. To use this +

    int ei_decode_bignum(const char *buf, int *index, mpz_t obj);

    Decodes an integer in the binary format to a GMP mpz_t integer. To use this function, the ei library must be configured and compiled to use the GMP library.

    @@ -247,7 +247,7 @@ ei_decode_binary()

    -
    int ei_decode_binary(const char *buf, int *index, void *p, long *len);

    Decodes a binary from the binary format. Parameter len is set to the actual +

    int ei_decode_binary(const char *buf, int *index, void *p, long *len);

    Decodes a binary from the binary format. Parameter len is set to the actual size of the binary. Notice that ei_decode_binary() assumes that there is enough room for the binary. The size required can be fetched by ei_get_type().

    @@ -256,8 +256,8 @@ ei_decode_bitstring()

    -
    int ei_decode_bitstring(const char *buf, int *index, const char **pp,
    -  unsigned int *bitoffsp, size_t *nbitsp);

    Decodes a bit string from the binary format.

    • pp - Either NULL or *pp returns a pointer to the first byte of the +

      int ei_decode_bitstring(const char *buf, int *index, const char **pp,
      +  unsigned int *bitoffsp, size_t *nbitsp);

      Decodes a bit string from the binary format.

      • pp - Either NULL or *pp returns a pointer to the first byte of the bit string. The returned bit string is readable as long as the buffer pointed to by buf is readable and not written to.

      • bitoffsp - Either NULL or *bitoffsp returns the number of unused bits in the first byte pointed to by *pp. The value of *bitoffsp is @@ -273,14 +273,14 @@ ei_decode_boolean() -

        int ei_decode_boolean(const char *buf, int *index, int *p);

        Decodes a boolean value from the binary format. A boolean is actually an atom, +

        int ei_decode_boolean(const char *buf, int *index, int *p);

        Decodes a boolean value from the binary format. A boolean is actually an atom, true decodes 1 and false decodes 0.

        ei_decode_char()

        -
        int ei_decode_char(const char *buf, int *index, char *p);

        Decodes a char (8-bit) integer between 0-255 from the binary format. For +

        int ei_decode_char(const char *buf, int *index, char *p);

        Decodes a char (8-bit) integer between 0-255 from the binary format. For historical reasons the returned integer is of type char. Your C code is to consider the returned value to be of type unsigned char even if the C compilers and system can define char to be signed.

        @@ -289,14 +289,14 @@ ei_decode_double()

        -
        int ei_decode_double(const char *buf, int *index, double *p);

        Decodes a double-precision (64-bit) floating point number from the binary +

        int ei_decode_double(const char *buf, int *index, double *p);

        Decodes a double-precision (64-bit) floating point number from the binary format.

        ei_decode_ei_term()

        -
        int ei_decode_ei_term(const char* buf, int* index, ei_term* term);

        Decodes any term, or at least tries to. If the term pointed at by *index in +

        int ei_decode_ei_term(const char* buf, int* index, ei_term* term);

        Decodes any term, or at least tries to. If the term pointed at by *index in buf fits in the term union, it is decoded, and the appropriate field in term->value is set, and *index is incremented by the term size.

        The function returns 1 on successful decoding, -1 on error, and 0 if the term seems alright, but does not fit in the term structure. If 1 is @@ -314,7 +314,7 @@ free_fun() -

        int ei_decode_fun(const char *buf, int *index, erlang_fun *p);
        void free_fun(erlang_fun* f);

        Decodes a fun from the binary format. Parameter p is to be NULL or point to +

        int ei_decode_fun(const char *buf, int *index, erlang_fun *p);
        void free_fun(erlang_fun* f);

        Decodes a fun from the binary format. Parameter p is to be NULL or point to an erlang_fun structure. This is the only decode function that allocates memory. When the erlang_fun is no longer needed, it is to be freed with free_fun. (This has to do with the arbitrary size of the environment for a @@ -324,7 +324,7 @@ ei_decode_iodata() -

        int ei_decode_iodata(const char *buf, int *index, int *size, char *outbuf);

        Decodes a term of the type iodata(). +

        int ei_decode_iodata(const char *buf, int *index, int *size, char *outbuf);

        Decodes a term of the type iodata(). The iodata/0 term will be flattened an written into the buffer pointed to by the outbuf argument. The byte size of the iodata is written into the integer variable pointed to by the size argument. Both size and outbuf can be set @@ -345,7 +345,7 @@ ei_decode_list_header() -

        int ei_decode_list_header(const char *buf, int *index, int *arity);

        Decodes a list header from the binary format. The number of elements is returned +

        int ei_decode_list_header(const char *buf, int *index, int *arity);

        Decodes a list header from the binary format. The number of elements is returned in arity. The arity+1 elements follow (the last one is the tail of the list, normally an empty list). If arity is 0, it is an empty list.

        Notice that lists are encoded as strings if they consist entirely of integers in the range 0..255. This function do not decode such strings, use @@ -355,21 +355,21 @@ ei_decode_long() -

        int ei_decode_long(const char *buf, int *index, long *p);

        Decodes a long integer from the binary format. If the code is 64 bits, the +

        int ei_decode_long(const char *buf, int *index, long *p);

        Decodes a long integer from the binary format. If the code is 64 bits, the function ei_decode_long() is the same as ei_decode_longlong().

        ei_decode_longlong()

        -
        int ei_decode_longlong(const char *buf, int *index, long long *p);

        Decodes a GCC long long or Visual C++ __int64 (64-bit) integer from the +

        int ei_decode_longlong(const char *buf, int *index, long long *p);

        Decodes a GCC long long or Visual C++ __int64 (64-bit) integer from the binary format.

        ei_decode_map_header()

        -
        int ei_decode_map_header(const char *buf, int *index, int *arity);

        Decodes a map header from the binary format. The number of key-value pairs is +

        int ei_decode_map_header(const char *buf, int *index, int *arity);

        Decodes a map header from the binary format. The number of key-value pairs is returned in *arity. Keys and values follow in this order: K1, V1, K2, V2, ..., Kn, Vn. This makes a total of arity*2 terms. If arity /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei_connect.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei_connect.html 2025-05-10 20:19:07.413175081 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei_connect.html 2025-05-10 20:19:07.413175081 +0000 @@ -241,36 +241,36 @@

        • ei_cnode - Opaque data type representing a C-node. A ei_cnode structure is initialized by calling -ei_connect_init() or friends.

        • ei_socket_callbacks

          typedef struct {
          +ei_connect_init() or friends.

        • ei_socket_callbacks

          typedef struct {
               int flags;
          -    int (*socket)(void **ctx, void *setup_ctx);
          -    int   (*close)(void *ctx);
          -    int (*listen)(void *ctx, void *addr, int *len, int backlog);
          -    int (*accept)(void **ctx, void *addr, int *len, unsigned tmo);
          -    int (*connect)(void *ctx, void *addr, int len, unsigned tmo);
          -    int (*writev)(void *ctx, const void *iov, int iovcnt, ssize_t *len, unsigned tmo);
          -    int (*write)(void *ctx, const char *buf, ssize_t *len, unsigned tmo);
          -    int (*read)(void *ctx, char *buf, ssize_t *len, unsigned tmo);
          -    int (*handshake_packet_header_size)(void *ctx, int *sz);
          -    int (*connect_handshake_complete)(void *ctx);
          -    int (*accept_handshake_complete)(void *ctx);
          -    int (*get_fd)(void *ctx, int *fd);
          -} ei_socket_callbacks;

          Callbacks functions for a + int (*socket)(void **ctx, void *setup_ctx); + int (*close)(void *ctx); + int (*listen)(void *ctx, void *addr, int *len, int backlog); + int (*accept)(void **ctx, void *addr, int *len, unsigned tmo); + int (*connect)(void *ctx, void *addr, int len, unsigned tmo); + int (*writev)(void *ctx, const void *iov, int iovcnt, ssize_t *len, unsigned tmo); + int (*write)(void *ctx, const char *buf, ssize_t *len, unsigned tmo); + int (*read)(void *ctx, char *buf, ssize_t *len, unsigned tmo); + int (*handshake_packet_header_size)(void *ctx, int *sz); + int (*connect_handshake_complete)(void *ctx); + int (*accept_handshake_complete)(void *ctx); + int (*get_fd)(void *ctx, int *fd); +} ei_socket_callbacks;

  • Callbacks functions for a User Supplied Socket Implementation. Documentation of each field can be -found in the User Supplied Socket Implementation section above.

  • ErlConnect

    typedef struct {
    -    char ipadr[4]; /* Ip v4 address in network byte order */
    -    char nodename[MAXNODELEN];
    -} ErlConnect;

    IP v4 address and nodename.

  • Erl_IpAddr

    typedef struct {
    +found in the User Supplied Socket Implementation section above.

  • ErlConnect

    typedef struct {
    +    char ipadr[4]; /* Ip v4 address in network byte order */
    +    char nodename[MAXNODELEN];
    +} ErlConnect;

    IP v4 address and nodename.

  • Erl_IpAddr

    typedef struct {
         unsigned s_addr; /* Ip v4 address in network byte order */
    -} Erl_IpAddr;

    IP v4 address.

  • erlang_msg

    typedef struct {
    +} Erl_IpAddr;

    IP v4 address.

  • erlang_msg

    typedef struct {
         long msgtype;
         erlang_pid from;
         erlang_pid to;
    -    char toname[MAXATOMLEN+1];
    -    char cookie[MAXATOMLEN+1];
    +    char toname[MAXATOMLEN+1];
    +    char cookie[MAXATOMLEN+1];
         erlang_trace token;
    -} erlang_msg;

    Information about a message received via +} erlang_msg;

  • Information about a message received via ei_receive_msg() or friends.

    @@ -295,15 +295,15 @@ ei_gethostbyname_r()

    -
    struct hostent * ei_gethostbyaddr(const char *addr, int len, int type);
    struct hostent * ei_gethostbyaddr_r(const char *addr, int length,  int type,
    -  struct hostent *hostp, char *buffer,   int buflen,  int *h_errnop);
    struct hostent * ei_gethostbyname(const char *name);
    struct hostent * ei_gethostbyname_r(const char *name,  struct hostent *hostp,
    -  char *buffer,  int buflen,  int *h_errnop);

    Convenience functions for some common name lookup functions.

    +
    struct hostent * ei_gethostbyaddr(const char *addr, int len, int type);
    struct hostent * ei_gethostbyaddr_r(const char *addr, int length,  int type,
    +  struct hostent *hostp, char *buffer,   int buflen,  int *h_errnop);
    struct hostent * ei_gethostbyname(const char *name);
    struct hostent * ei_gethostbyname_r(const char *name,  struct hostent *hostp,
    +  char *buffer,  int buflen,  int *h_errnop);

    Convenience functions for some common name lookup functions.

    ei_accept()

    -
    int ei_accept(ei_cnode *ec, int listensock, ErlConnect *conp);

    Used by a server process to accept a connection from a client process.

    • ec is the C-node structure.
    • listensock is an open socket descriptor on which listen() has previously +
      int ei_accept(ei_cnode *ec, int listensock, ErlConnect *conp);

      Used by a server process to accept a connection from a client process.

      • ec is the C-node structure.
      • listensock is an open socket descriptor on which listen() has previously been called.
      • conp is a pointer to an ErlConnect struct.

      On success, conp is filled in with the address and node name of the connecting client and a file descriptor is returned. On failure, ERL_ERROR is returned and erl_errno is set to EIO.

      @@ -312,14 +312,14 @@ ei_accept_tmo()

      -
      int ei_accept_tmo(ei_cnode *ec, int listensock, ErlConnect *conp, unsigned timeout_ms);

      Equivalent to ei_accept with an optional time-out argument, see the +

      int ei_accept_tmo(ei_cnode *ec, int listensock, ErlConnect *conp, unsigned timeout_ms);

      Equivalent to ei_accept with an optional time-out argument, see the description at the beginning of this manual page.

      ei_close_connection()

      -
      int ei_close_connection(int fd);

      Closes a previously opened connection or listen socket.

      Available since OTP 21.3

      +
      int ei_close_connection(int fd);

      Closes a previously opened connection or listen socket.

      Available since OTP 21.3

      @@ -343,7 +343,7 @@ ei_xconnect_host_port()

      -
      int ei_connect(ei_cnode* ec, char *nodename);
      int ei_xconnect(ei_cnode* ec, Erl_IpAddr adr, char *alivename);
      int ei_connect_host_port(ei_cnode* ec, char *hostname, int port);
      int ei_xconnect_host_port(ei_cnode* ec, Erl_IpAddr adr, int port);

      Sets up a connection to an Erlang node.

      ei_xconnect() requires the IP address of the remote host and the alive name of +

      int ei_connect(ei_cnode* ec, char *nodename);
      int ei_xconnect(ei_cnode* ec, Erl_IpAddr adr, char *alivename);
      int ei_connect_host_port(ei_cnode* ec, char *hostname, int port);
      int ei_xconnect_host_port(ei_cnode* ec, Erl_IpAddr adr, int port);

      Sets up a connection to an Erlang node.

      ei_xconnect() requires the IP address of the remote host and the alive name of the remote node to be specified. ei_connect() provides an alternative interface and determines the information from the node name provided. The ei_xconnect_host_port() function provides yet another alternative that will @@ -359,12 +359,12 @@ #define IP_ADDR "150.236.14.75" /*** Variant 1 ***/ -int fd = ei_connect(&ec, NODE); +int fd = ei_connect(&ec, NODE); /*** Variant 2 ***/ struct in_addr addr; -addr.s_addr = inet_addr(IP_ADDR); -fd = ei_xconnect(&ec, &addr, ALIVE);

    Available since OTP 23.0

    +addr.s_addr = inet_addr(IP_ADDR); +fd = ei_xconnect(&ec, &addr, ALIVE);

    Available since OTP 23.0

    @@ -388,11 +388,11 @@ ei_connect_xinit_ussi()

    -
    int ei_connect_init(ei_cnode* ec, const char* this_node_name, const char *cookie, unsigned creation);
    int ei_connect_init_ussi(ei_cnode* ec, const char* this_node_name, const char *cookie,
    -  unsigned creation, ei_socket_callbacks *cbs, int cbs_sz, void *setup_context);
    int ei_connect_xinit(ei_cnode* ec, const char *thishostname, const char *thisalivename,
    -  const char *thisnodename, Erl_IpAddr thisipaddr, const char *cookie, unsigned creation);
    int ei_connect_xinit_ussi(ei_cnode* ec, const char *thishostname, const char *thisalivename,
    +
    int ei_connect_init(ei_cnode* ec, const char* this_node_name, const char *cookie, unsigned creation);
    int ei_connect_init_ussi(ei_cnode* ec, const char* this_node_name, const char *cookie,
    +  unsigned creation, ei_socket_callbacks *cbs, int cbs_sz, void *setup_context);
    int ei_connect_xinit(ei_cnode* ec, const char *thishostname, const char *thisalivename,
    +  const char *thisnodename, Erl_IpAddr thisipaddr, const char *cookie, unsigned creation);
    int ei_connect_xinit_ussi(ei_cnode* ec, const char *thishostname, const char *thisalivename,
       const char *thisnodename, Erl_IpAddr thisipaddr, const char *cookie, unsigned creation,
    -  ei_socket_callbacks *cbs, int cbs_sz, void *setup_context);

    Initializes the ec structure, to identify the node name and cookie of the + ei_socket_callbacks *cbs, int cbs_sz, void *setup_context);

    Initializes the ec structure, to identify the node name and cookie of the server. One of them must be called before other functions that works on the ei_cnode type or a file descriptor associated with a connection to another node is used.

    • ec is a structure containing information about the C-node. It is used in @@ -415,20 +415,20 @@ see the relevant system documentation.

      These functions return a negative value indicating that an error occurred.

      Example 1:

      unsigned n = 0;
       struct in_addr addr;
       ei_cnode ec;
      -addr.s_addr = inet_addr("150.236.14.75");
      -if (ei_connect_xinit(&ec,
      +addr.s_addr = inet_addr("150.236.14.75");
      +if (ei_connect_xinit(&ec,
                            "chivas",
                            "madonna",
                            "madonna@chivas.du.etx.ericsson.se",
                            &addr;
                            "cookie...",
      -                     n++) < 0) {
      -    fprintf(stderr,"ERROR when initializing: %d",erl_errno);
      -    exit(-1);
      -}

      Example 2:

      if (ei_connect_init(&ec, "madonna", "cookie...", n++) < 0) {
      -    fprintf(stderr,"ERROR when initializing: %d",erl_errno);
      -    exit(-1);
      -}

      Available since OTP 21.3

      + n++) < 0) { + fprintf(stderr,"ERROR when initializing: %d",erl_errno); + exit(-1); +}

    Example 2:

    if (ei_connect_init(&ec, "madonna", "cookie...", n++) < 0) {
    +    fprintf(stderr,"ERROR when initializing: %d",erl_errno);
    +    exit(-1);
    +}

    Available since OTP 21.3

    @@ -452,7 +452,7 @@ ei_xconnect_host_port_tmo()

    -
    int ei_connect_tmo(ei_cnode* ec, char *nodename, unsigned timeout_ms);
    int ei_xconnect_tmo(ei_cnode* ec, Erl_IpAddr adr, char *alivename, unsigned timeout_ms);
    int ei_connect_host_port_tmo(ei_cnode* ec, char *hostname, int port, unsigned ms);
    int ei_xconnect_host_port_tmo(ei_cnode* ec, Erl_IpAddr adr, int port, unsigned ms);

    Equivalent to ei_connect, ei_xconnect, ei_connect_host_port and +

    int ei_connect_tmo(ei_cnode* ec, char *nodename, unsigned timeout_ms);
    int ei_xconnect_tmo(ei_cnode* ec, Erl_IpAddr adr, char *alivename, unsigned timeout_ms);
    int ei_connect_host_port_tmo(ei_cnode* ec, char *hostname, int port, unsigned ms);
    int ei_xconnect_host_port_tmo(ei_cnode* ec, Erl_IpAddr adr, int port, unsigned ms);

    Equivalent to ei_connect, ei_xconnect, ei_connect_host_port and ei_xconnect_host_port with an optional time-out argument, see the description at the beginning of this manual page.

    Available since OTP 23.0

    @@ -466,7 +466,7 @@ ei_set_tracelevel()

    -
    int ei_get_tracelevel(void);
    void ei_set_tracelevel(int level);

    Used to set tracing on the distribution. The levels are different verbosity +

    int ei_get_tracelevel(void);
    void ei_set_tracelevel(int level);

    Used to set tracing on the distribution. The levels are different verbosity levels. A higher level means more information. See also section Debug Information.

    These functions are not thread safe.

    Available since OTP R13B04

    @@ -480,7 +480,7 @@ ei_xlisten()

    -
    int ei_listen(ei_cnode *ec, int *port, int backlog);
    int ei_xlisten(ei_cnode *ec, Erl_IpAddr adr, int *port, int backlog);

    Used by a server process to setup a listen socket which later can be used for +

    int ei_listen(ei_cnode *ec, int *port, int backlog);
    int ei_xlisten(ei_cnode *ec, Erl_IpAddr adr, int *port, int backlog);

    Used by a server process to setup a listen socket which later can be used for accepting connections from client processes.

    • ec is the C-node structure.
    • adr is local interface to bind to.
    • port is a pointer to an integer containing the port number to bind to. If *port equals 0 when calling ei_listen(), the socket will be bound to an ephemeral port. On success, ei_listen() will update the value of *port to @@ -495,7 +495,7 @@ ei_make_pid() /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei_global.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei_global.html 2025-05-10 20:19:07.437175299 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei_global.html 2025-05-10 20:19:07.437175299 +0000 @@ -132,7 +132,7 @@ ei_global_names() -
      char **ei_global_names(ei_cnode *ec, int fd, int *count);

      Retrieves a list of all known global names.

      • ec is the ei_cnode representing the current cnode.
      • fd is an open descriptor to an Erlang connection.
      • count is the address of an integer, or NULL. If count is not NULL, it +
        char **ei_global_names(ei_cnode *ec, int fd, int *count);

        Retrieves a list of all known global names.

        • ec is the ei_cnode representing the current cnode.
        • fd is an open descriptor to an Erlang connection.
        • count is the address of an integer, or NULL. If count is not NULL, it is set by the function to the number of names found.

        On success, the function returns an array of strings, each containing a single registered name, and sets count to the number of names found. The array is terminated by a single NULL pointer. On failure, the function returns NULL @@ -144,20 +144,20 @@ ei_global_register() -

        int ei_global_register(int fd, const char *name, erlang_pid *self);

        Registers a name in global.

        • fd is an open descriptor to an Erlang connection.
        • name is the name to register in global.
        • pid is the pid that is to be associated with name. This value is returned +
          int ei_global_register(int fd, const char *name, erlang_pid *self);

          Registers a name in global.

          • fd is an open descriptor to an Erlang connection.
          • name is the name to register in global.
          • pid is the pid that is to be associated with name. This value is returned by global when processes request the location of name.

          Returns 0 on success, otherwise -1.

          Available since OTP 23.0

          ei_global_unregister()

          -
          int ei_global_unregister(ei_cnode *ec, int fd, const char *name);

          Unregisters a name from global.

          • ec is the ei_cnode representing the current cnode.
          • fd is an open descriptor to an Erlang connection.
          • name is the name to unregister from global.

          Returns 0 on success, otherwise -1.

          Available since OTP 23.0

          +
          int ei_global_unregister(ei_cnode *ec, int fd, const char *name);

          Unregisters a name from global.

          • ec is the ei_cnode representing the current cnode.
          • fd is an open descriptor to an Erlang connection.
          • name is the name to unregister from global.

          Returns 0 on success, otherwise -1.

          Available since OTP 23.0

          ei_global_whereis()

          -
          int ei_global_whereis(ei_cnode *ec, int fd, const char *name, erlang_pid* pid, char *node);

          Looks up a name in global.

          • ec is the ei_cnode representing the current cnode.
          • fd is an open descriptor to an Erlang connection.
          • name is the name that is to be looked up in global.

          The pid parameter is a pointer to a erlang_pid that the function will update +

          int ei_global_whereis(ei_cnode *ec, int fd, const char *name, erlang_pid* pid, char *node);

          Looks up a name in global.

          • ec is the ei_cnode representing the current cnode.
          • fd is an open descriptor to an Erlang connection.
          • name is the name that is to be looked up in global.

          The pid parameter is a pointer to a erlang_pid that the function will update with the pid associated with the global name, if successful.

          If node is not NULL, it is a pointer to a buffer where the function can fill in the name of the node where name is found. node can be passed directly to ei_connect() if necessary.

          On success, the function returns 0, updates the erlang_pid pointed to by the @@ -204,7 +204,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei_users_guide.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei_users_guide.html 2025-05-10 20:19:07.473175626 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei_users_guide.html 2025-05-10 20:19:07.473175626 +0000 @@ -180,11 +180,11 @@ Erlang.

          The Erl_Interface library supports this activity. It has several C functions that create and manipulate Erlang data structures. The following example shows how to create and encode an Erlang tuple {tobbe,3928}:

          ei_x_buff buf;
          -ei_x_new(&buf);
          +ei_x_new(&buf);
           int i = 0;
          -ei_x_encode_tuple_header(&buf, 2);
          -ei_x_encode_atom(&buf, "tobbe");
          -ei_x_encode_long(&buf, 3928);

          For a complete description, see the ei module.

          +ei_x_encode_tuple_header(&buf, 2); +ei_x_encode_atom(&buf, "tobbe"); +ei_x_encode_long(&buf, 3928);

    For a complete description, see the ei module.

    @@ -193,18 +193,18 @@

    The previous example can be simplified by using the ei_x_format_wo_ver function to create an Erlang term:

    ei_x_buff buf;
    -ei_x_new(&buf);
    -ei_x_format_wo_ver(&buf, "{~a,~i}", "tobbe", 3928);

    For a complete description of the different format directives, see the the +ei_x_new(&buf); +ei_x_format_wo_ver(&buf, "{~a,~i}", "tobbe", 3928);

    For a complete description of the different format directives, see the the ei_x_format_wo_ver function.

    The following example is more complex:

    ei_x_buff buf;
     int i = 0;
    -ei_x_new(&buf);
    -ei_x_format_wo_ver(&buf,
    +ei_x_new(&buf);
    +ei_x_format_wo_ver(&buf,
                        "[{name,~a},{age,~i},{data,[{adr,~s,~i}]}]",
                        "madonna",
                        21,
    -                  "E-street", 42);
    -ei_print_term(stdout, buf.buff, &i);
    -ei_x_free(&buf);

    As in the previous examples, it is your responsibility to free the memory + "E-street", 42); +ei_print_term(stdout, buf.buff, &i); +ei_x_free(&buf);

    As in the previous examples, it is your responsibility to free the memory allocated for Erlang terms. In this example, ei_x_free() ensures that the data pointed to by buf is released.

    @@ -220,18 +220,18 @@ char *cookie="a secret cookie string"; /* An example */ const char* node_name = "einode@durin"; const char *cookie = NULL; -short creation = time(NULL) + 1; +short creation = time(NULL) + 1; ei_cnode ec; -ei_connect_init(&ec, +ei_connect_init(&ec, node_name, cookie, - creation);

    For more information, see the ei_connect module.

    After initialization, you set up the connection to the Erlang node. To specify + creation);

    For more information, see the ei_connect module.

    After initialization, you set up the connection to the Erlang node. To specify the Erlang node you want to connect to, use the ei_connect_*() family of functions. The following example sets up the connection and is to result in a valid socket file descriptor:

    int sockfd;
     const char* node_name = "einode@durin"; /* An example */
    -if ((sockfd = ei_connect(&ec, nodename)) < 0)
    -  fprintf(stderr, "ERROR: ei_connect failed");

    +if ((sockfd = ei_connect(&ec, nodename)) < 0) + fprintf(stderr, "ERROR: ei_connect failed");

    @@ -246,7 +246,7 @@ connection is first made to epmd and, if the node is known, a connection is then made to the Erlang node.

    C nodes can also register themselves with epmd if they want other nodes in the system to be able to find and connect to them.

    Before registering with epmd, you must first create a listen socket and bind -it to a port. Then:

    int pub = ei_publish(&ec, port);

    pub is a file descriptor now connected to epmd. epmd monitors the other +it to a port. Then:

    int pub = ei_publish(&ec, port);

    pub is a file descriptor now connected to epmd. epmd monitors the other end of the connection. If it detects that the connection has been closed, the node becomes unregistered. So, if you explicitly close the descriptor or if your node fails, it becomes unregistered from epmd.

    Notice that on some systems a failed node is not detected by this mechanism, as @@ -269,13 +269,13 @@

    In the following example, {Pid, hello_world} is sent to a registered process my_server:

    ei_x_buff buf;
    -ei_x_new_with_version(&buf);
    +ei_x_new_with_version(&buf);
     
    -ei_x_encode_tuple_header(&buf, 2);
    -ei_x_encode_pid(&buf, ei_self(ec));
    -ei_x_encode_atom(&buf, "Hello world");
    +ei_x_encode_tuple_header(&buf, 2);
    +ei_x_encode_pid(&buf, ei_self(ec));
    +ei_x_encode_atom(&buf, "Hello world");
     
    -ei_reg_send(&ec, fd, "my_server", buf.buff, buf.index);

    The first element of the tuple that is sent is your own pid. This enables +ei_reg_send(&ec, fd, "my_server", buf.buff, buf.index);

    The first element of the tuple that is sent is your own pid. This enables my_server to reply. For more information about the primitives, see the ei_connect module.

    @@ -289,24 +289,24 @@ int arity = 0; erlang_pid pid; ei_x_buff buf; -ei_x_new(&buf); -for (;;) { - int got = ei_xreceive_msg(fd, &msg, &x); - if (got == ERL_TICK) +ei_x_new(&buf); +for (;;) { + int got = ei_xreceive_msg(fd, &msg, &x); + if (got == ERL_TICK) continue; - if (got == ERL_ERROR) { - fprintf(stderr, "ei_xreceive_msg, got==%d", got); - exit(1); - } + if (got == ERL_ERROR) { + fprintf(stderr, "ei_xreceive_msg, got==%d", got); + exit(1); + } break; -} -ei_decode_version(buf.buff, &index, &version); -ei_decode_tuple_header(buf.buff, &index, &arity); -if (arity != 2) { - fprintf(stderr, "got wrong message"); - exit(1); -} -ei_decode_pid(buf.buff, &index, &pid);

    To provide robustness, a distributed Erlang node occasionally polls all its +} +ei_decode_version(buf.buff, &index, &version); +ei_decode_tuple_header(buf.buff, &index, &arity); +if (arity != 2) { + fprintf(stderr, "got wrong message"); + exit(1); +} +ei_decode_pid(buf.buff, &index, &pid);

    To provide robustness, a distributed Erlang node occasionally polls all its connected neighbors in an attempt to detect failed nodes or communication links. A node that receives such a message is expected to respond immediately with an ERL_TICK message. This is done automatically by ei_xreceive_msg(). However, @@ -324,19 +324,19 @@ a remote node and is called a remote procedure call.

    The following example checks if a specific Erlang process is alive:

    int index = 0, is_alive;
     ei_x_buff args, result;
     
    -ei_x_new(&result);
    -ei_x_new(&args);
    -ei_x_encode_list_header(&args, 1);
    -ei_x_encode_pid(&args, &check_pid);
    -ei_x_encode_empty_list(&args);
    -
    -if (ei_rpc(&ec, fd, "erlang", "is_process_alive",
    -           args.buff, args.index, &result) < 0)
    -    handle_error();
    -
    -if (ei_decode_version(result.buff, &index) < 0
    -    || ei_decode_bool(result.buff, &index, &is_alive) < 0)
    -    handle_error();

    For more information about ei_rpc() and its companions ei_rpc_to() and +ei_x_new(&result); +ei_x_new(&args); +ei_x_encode_list_header(&args, 1); +ei_x_encode_pid(&args, &check_pid); +ei_x_encode_empty_list(&args); + +if (ei_rpc(&ec, fd, "erlang", "is_process_alive", + args.buff, args.index, &result) < 0) + handle_error(); + +if (ei_decode_version(result.buff, &index) < 0 + || ei_decode_bool(result.buff, &index, &is_alive) < 0) + handle_error();

    For more information about ei_rpc() and its companions ei_rpc_to() and ei_rpc_from(), see the ei_connect module.

    @@ -353,32 +353,32 @@ int count; int i; -names = ei_global_names(&ec,fd,&count); +names = ei_global_names(&ec,fd,&count); -if (names) - for (i=0; i<count; i++) - printf("%s\n",names[i]); +if (names) + for (i=0; i<count; i++) + printf("%s\n",names[i]); -free(names);

    ei_global_names allocates and returns a buffer +free(names);

    ei_global_names allocates and returns a buffer containing all the names known to the global module in Kernel. count is initialized to indicate the number of names in the array. The array of strings in names is terminated by a NULL pointer, so it is not necessary to use count to determine when the last name is reached.

    It is the caller's responsibility to free the array. ei_global_names allocates the array and all the strings using a single call to malloc(), so free(names) is all that is necessary.

    To look up one of the names:

    ETERM *pid;
    -char node[256];
    +char node[256];
     erlang_pid the_pid;
     
    -if (ei_global_whereis(&ec,fd,"schedule",&the_pid,node) < 0)
    -   fprintf(stderr, "ei_global_whereis error\n");

    If "schedule" is known to the global module in Kernel, an Erlang pid is +if (ei_global_whereis(&ec,fd,"schedule",&the_pid,node) < 0) + fprintf(stderr, "ei_global_whereis error\n");

    If "schedule" is known to the global module in Kernel, an Erlang pid is /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/erl_call_cmd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/erl_call_cmd.html 2025-05-10 20:19:07.497175843 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/erl_call_cmd.html 2025-05-10 20:19:07.501175880 +0000 @@ -251,8 +251,8 @@ {<madonna@chivas.du.etx.ericsson.se,38,0>, []}]

    To forward standard output without printing the result term (again, the input ends with EOF (Control-D)):

    erl_call -s -e -sname madonna -fetch_stdout -no_result_term
    -io:format("Number of schedulers: ~p~n", [erlang:system_info(schedulers)]),
    -io:format("Number of logical cores: ~p~n", [erlang:system_info(logical_processors_available)]).
    +io:format("Number of schedulers: ~p~n", [erlang:system_info(schedulers)]),
    +io:format("Number of logical cores: ~p~n", [erlang:system_info(logical_processors_available)]).
     ^D
     Number of schedulers: 8
     Number of logical cores: 8
    @@ -306,7 +306,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/erl_interface.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/erl_interface.epub/OEBPS/content.opf 2025-05-10 20:19:07.525176097 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/erl_interface.epub/OEBPS/content.opf 2025-05-10 20:19:07.529176133 +0000 @@ -4,10 +4,10 @@ version="3.0"> erl_interface - 5.5.2 - urn:uuid:c7b4cce4-95f4-c5a7-9e0f-13897b262ff1 + urn:uuid:6fbee9d5-3005-6469-a9fc-440e680278c6 en - 2025-05-10T20:10:57Z + 2041-06-12T09:31:10Z /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/erl_interface.epub/OEBPS/ei.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/erl_interface.epub/OEBPS/ei.xhtml 2025-05-10 20:19:07.525176097 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/erl_interface.epub/OEBPS/ei.xhtml 2025-05-10 20:19:07.529176133 +0000 @@ -56,30 +56,30 @@ Data Types -
    • ei_term

      typedef struct {
      +
      • ei_term

        typedef struct {
             char ei_type;
             int arity;
             int size;
        -    union {
        +    union {
           long i_val;
           double d_val;
        -  char atom_name[MAXATOMLEN_UTF8];
        +  char atom_name[MAXATOMLEN_UTF8];
           erlang_pid pid;
           erlang_port port;
           erlang_ref ref;
        -    } value;
        -} ei_term;

        Structure written by ei_decode_ei_term(). The + } value; +} ei_term;

      Structure written by ei_decode_ei_term(). The ei_type field is the type of the term which equals to what ei_get_type() sets *type to.

    • ei_x_buff - A dynamically resized buffer. It is a struct with two fields of interest for the user:

      • char *buff - Pointer to the dynamically allocated buffer.

      • int index - Offset to the next byte to write which also equals the amount of bytes currently written.

      An ei_x_buff is initialized by calling either ei_x_new() or ei_x_new_with_version(). The memory used by an initialized ei_x_buff is released by calling -ei_x_free().

    • erlang_char_encoding

      typedef enum {
      +ei_x_free().

    • erlang_char_encoding

      typedef enum {
           ERLANG_ASCII = 1,
           ERLANG_LATIN1 = 2,
           ERLANG_UTF8 = 4
      -} erlang_char_encoding;

      The character encodings used for atoms. ERLANG_ASCII represents 7-bit ASCII. +} erlang_char_encoding;

    The character encodings used for atoms. ERLANG_ASCII represents 7-bit ASCII. Latin-1 and UTF-8 are different extensions of 7-bit ASCII. All 7-bit ASCII characters are valid Latin-1 and UTF-8 characters. ASCII and Latin-1 both represent each character by one byte. An UTF-8 character can consist of 1-4 @@ -95,7 +95,7 @@ ei_cmp_pids() -

    int ei_cmp_pids(erlang_pid *a, erlang_pid *b);

    Compare two process identifiers. The comparison is done the same way as Erlang +

    int ei_cmp_pids(erlang_pid *a, erlang_pid *b);

    Compare two process identifiers. The comparison is done the same way as Erlang does.

    Returns 0 if a and b are equal. Returns a value less than 0 if a compares as less than b. Returns a value larger than 0 if a compares as larger than b.

    Available since OTP 23.0

    @@ -104,7 +104,7 @@ ei_cmp_ports()

    -
    int ei_cmp_ports(erlang_port *a, erlang_port *b);

    Compare two port identifiers. The comparison is done the same way as Erlang +

    int ei_cmp_ports(erlang_port *a, erlang_port *b);

    Compare two port identifiers. The comparison is done the same way as Erlang does.

    Returns 0 if a and b are equal. Returns a value less than 0 if a compares as less than b. Returns a value larger than 0 if a compares as larger than b.

    Available since OTP 23.0

    @@ -113,7 +113,7 @@ ei_cmp_refs()

    -
    int ei_cmp_refs(erlang_ref *a, erlang_ref *b);

    Compare two references. The comparison is done the same way as Erlang does.

    Returns 0 if a and b are equal. Returns a value less than 0 if a +

    int ei_cmp_refs(erlang_ref *a, erlang_ref *b);

    Compare two references. The comparison is done the same way as Erlang does.

    Returns 0 if a and b are equal. Returns a value less than 0 if a compares as less than b. Returns a value larger than 0 if a compares as larger than b.

    Available since OTP 23.0

    @@ -121,15 +121,15 @@ ei_decode_atom()

    -
    int ei_decode_atom(const char *buf, int *index, char *p);

    Decodes an atom from the binary format. The NULL-terminated name of the atom +

    int ei_decode_atom(const char *buf, int *index, char *p);

    Decodes an atom from the binary format. The NULL-terminated name of the atom is placed at p. At most MAXATOMLEN bytes can be placed in the buffer.

    ei_decode_atom_as()

    -
    int ei_decode_atom_as(const char *buf, int *index, char *p, int plen,
    -  erlang_char_encoding want, erlang_char_encoding* was, erlang_char_encoding* result);

    Decodes an atom from the binary format. The NULL-terminated name of the atom +

    int ei_decode_atom_as(const char *buf, int *index, char *p, int plen,
    +  erlang_char_encoding want, erlang_char_encoding* was, erlang_char_encoding* result);

    Decodes an atom from the binary format. The NULL-terminated name of the atom is placed in buffer at p of length plen bytes.

    The wanted string encoding is specified by want. The original encoding used in the binary format (Latin-1 or UTF-8) can be obtained from *was. The encoding of the resulting string (7-bit ASCII, @@ -144,7 +144,7 @@ ei_decode_bignum() -

    int ei_decode_bignum(const char *buf, int *index, mpz_t obj);

    Decodes an integer in the binary format to a GMP mpz_t integer. To use this +

    int ei_decode_bignum(const char *buf, int *index, mpz_t obj);

    Decodes an integer in the binary format to a GMP mpz_t integer. To use this function, the ei library must be configured and compiled to use the GMP library.

    @@ -152,7 +152,7 @@ ei_decode_binary()

    -
    int ei_decode_binary(const char *buf, int *index, void *p, long *len);

    Decodes a binary from the binary format. Parameter len is set to the actual +

    int ei_decode_binary(const char *buf, int *index, void *p, long *len);

    Decodes a binary from the binary format. Parameter len is set to the actual size of the binary. Notice that ei_decode_binary() assumes that there is enough room for the binary. The size required can be fetched by ei_get_type().

    @@ -161,8 +161,8 @@ ei_decode_bitstring()

    -
    int ei_decode_bitstring(const char *buf, int *index, const char **pp,
    -  unsigned int *bitoffsp, size_t *nbitsp);

    Decodes a bit string from the binary format.

    • pp - Either NULL or *pp returns a pointer to the first byte of the +

      int ei_decode_bitstring(const char *buf, int *index, const char **pp,
      +  unsigned int *bitoffsp, size_t *nbitsp);

      Decodes a bit string from the binary format.

      • pp - Either NULL or *pp returns a pointer to the first byte of the bit string. The returned bit string is readable as long as the buffer pointed to by buf is readable and not written to.

      • bitoffsp - Either NULL or *bitoffsp returns the number of unused bits in the first byte pointed to by *pp. The value of *bitoffsp is @@ -178,14 +178,14 @@ ei_decode_boolean() -

        int ei_decode_boolean(const char *buf, int *index, int *p);

        Decodes a boolean value from the binary format. A boolean is actually an atom, +

        int ei_decode_boolean(const char *buf, int *index, int *p);

        Decodes a boolean value from the binary format. A boolean is actually an atom, true decodes 1 and false decodes 0.

        ei_decode_char()

        -
        int ei_decode_char(const char *buf, int *index, char *p);

        Decodes a char (8-bit) integer between 0-255 from the binary format. For +

        int ei_decode_char(const char *buf, int *index, char *p);

        Decodes a char (8-bit) integer between 0-255 from the binary format. For historical reasons the returned integer is of type char. Your C code is to consider the returned value to be of type unsigned char even if the C compilers and system can define char to be signed.

        @@ -194,14 +194,14 @@ ei_decode_double()

        -
        int ei_decode_double(const char *buf, int *index, double *p);

        Decodes a double-precision (64-bit) floating point number from the binary +

        int ei_decode_double(const char *buf, int *index, double *p);

        Decodes a double-precision (64-bit) floating point number from the binary format.

        ei_decode_ei_term()

        -
        int ei_decode_ei_term(const char* buf, int* index, ei_term* term);

        Decodes any term, or at least tries to. If the term pointed at by *index in +

        int ei_decode_ei_term(const char* buf, int* index, ei_term* term);

        Decodes any term, or at least tries to. If the term pointed at by *index in buf fits in the term union, it is decoded, and the appropriate field in term->value is set, and *index is incremented by the term size.

        The function returns 1 on successful decoding, -1 on error, and 0 if the term seems alright, but does not fit in the term structure. If 1 is @@ -219,7 +219,7 @@ free_fun() -

        int ei_decode_fun(const char *buf, int *index, erlang_fun *p);
        void free_fun(erlang_fun* f);

        Decodes a fun from the binary format. Parameter p is to be NULL or point to +

        int ei_decode_fun(const char *buf, int *index, erlang_fun *p);
        void free_fun(erlang_fun* f);

        Decodes a fun from the binary format. Parameter p is to be NULL or point to an erlang_fun structure. This is the only decode function that allocates memory. When the erlang_fun is no longer needed, it is to be freed with free_fun. (This has to do with the arbitrary size of the environment for a @@ -229,7 +229,7 @@ ei_decode_iodata() -

        int ei_decode_iodata(const char *buf, int *index, int *size, char *outbuf);

        Decodes a term of the type iodata(). +

        int ei_decode_iodata(const char *buf, int *index, int *size, char *outbuf);

        Decodes a term of the type iodata(). The iodata/0 term will be flattened an written into the buffer pointed to by the outbuf argument. The byte size of the iodata is written into the integer variable pointed to by the size argument. Both size and outbuf can be set @@ -250,7 +250,7 @@ ei_decode_list_header() -

        int ei_decode_list_header(const char *buf, int *index, int *arity);

        Decodes a list header from the binary format. The number of elements is returned +

        int ei_decode_list_header(const char *buf, int *index, int *arity);

        Decodes a list header from the binary format. The number of elements is returned in arity. The arity+1 elements follow (the last one is the tail of the list, normally an empty list). If arity is 0, it is an empty list.

        Notice that lists are encoded as strings if they consist entirely of integers in the range 0..255. This function do not decode such strings, use @@ -260,21 +260,21 @@ ei_decode_long() -

        int ei_decode_long(const char *buf, int *index, long *p);

        Decodes a long integer from the binary format. If the code is 64 bits, the +

        int ei_decode_long(const char *buf, int *index, long *p);

        Decodes a long integer from the binary format. If the code is 64 bits, the function ei_decode_long() is the same as ei_decode_longlong().

        ei_decode_longlong()

        -
        int ei_decode_longlong(const char *buf, int *index, long long *p);

        Decodes a GCC long long or Visual C++ __int64 (64-bit) integer from the +

        int ei_decode_longlong(const char *buf, int *index, long long *p);

        Decodes a GCC long long or Visual C++ __int64 (64-bit) integer from the binary format.

        ei_decode_map_header()

        -
        int ei_decode_map_header(const char *buf, int *index, int *arity);

        Decodes a map header from the binary format. The number of key-value pairs is +

        int ei_decode_map_header(const char *buf, int *index, int *arity);

        Decodes a map header from the binary format. The number of key-value pairs is returned in *arity. Keys and values follow in this order: K1, V1, K2, V2, ..., Kn, Vn. This makes a total of arity*2 terms. If arity /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/erl_interface.epub/OEBPS/ei_connect.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/erl_interface.epub/OEBPS/ei_connect.xhtml 2025-05-10 20:19:07.525176097 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/erl_interface.epub/OEBPS/ei_connect.xhtml 2025-05-10 20:19:07.529176133 +0000 @@ -146,36 +146,36 @@

        • ei_cnode - Opaque data type representing a C-node. A ei_cnode structure is initialized by calling -ei_connect_init() or friends.

        • ei_socket_callbacks

          typedef struct {
          +ei_connect_init() or friends.

        • ei_socket_callbacks

          typedef struct {
               int flags;
          -    int (*socket)(void **ctx, void *setup_ctx);
          -    int   (*close)(void *ctx);
          -    int (*listen)(void *ctx, void *addr, int *len, int backlog);
          -    int (*accept)(void **ctx, void *addr, int *len, unsigned tmo);
          -    int (*connect)(void *ctx, void *addr, int len, unsigned tmo);
          -    int (*writev)(void *ctx, const void *iov, int iovcnt, ssize_t *len, unsigned tmo);
          -    int (*write)(void *ctx, const char *buf, ssize_t *len, unsigned tmo);
          -    int (*read)(void *ctx, char *buf, ssize_t *len, unsigned tmo);
          -    int (*handshake_packet_header_size)(void *ctx, int *sz);
          -    int (*connect_handshake_complete)(void *ctx);
          -    int (*accept_handshake_complete)(void *ctx);
          -    int (*get_fd)(void *ctx, int *fd);
          -} ei_socket_callbacks;

          Callbacks functions for a + int (*socket)(void **ctx, void *setup_ctx); + int (*close)(void *ctx); + int (*listen)(void *ctx, void *addr, int *len, int backlog); + int (*accept)(void **ctx, void *addr, int *len, unsigned tmo); + int (*connect)(void *ctx, void *addr, int len, unsigned tmo); + int (*writev)(void *ctx, const void *iov, int iovcnt, ssize_t *len, unsigned tmo); + int (*write)(void *ctx, const char *buf, ssize_t *len, unsigned tmo); + int (*read)(void *ctx, char *buf, ssize_t *len, unsigned tmo); + int (*handshake_packet_header_size)(void *ctx, int *sz); + int (*connect_handshake_complete)(void *ctx); + int (*accept_handshake_complete)(void *ctx); + int (*get_fd)(void *ctx, int *fd); +} ei_socket_callbacks;

    Callbacks functions for a User Supplied Socket Implementation. Documentation of each field can be -found in the User Supplied Socket Implementation section above.

  • ErlConnect

    typedef struct {
    -    char ipadr[4]; /* Ip v4 address in network byte order */
    -    char nodename[MAXNODELEN];
    -} ErlConnect;

    IP v4 address and nodename.

  • Erl_IpAddr

    typedef struct {
    +found in the User Supplied Socket Implementation section above.

  • ErlConnect

    typedef struct {
    +    char ipadr[4]; /* Ip v4 address in network byte order */
    +    char nodename[MAXNODELEN];
    +} ErlConnect;

    IP v4 address and nodename.

  • Erl_IpAddr

    typedef struct {
         unsigned s_addr; /* Ip v4 address in network byte order */
    -} Erl_IpAddr;

    IP v4 address.

  • erlang_msg

    typedef struct {
    +} Erl_IpAddr;

    IP v4 address.

  • erlang_msg

    typedef struct {
         long msgtype;
         erlang_pid from;
         erlang_pid to;
    -    char toname[MAXATOMLEN+1];
    -    char cookie[MAXATOMLEN+1];
    +    char toname[MAXATOMLEN+1];
    +    char cookie[MAXATOMLEN+1];
         erlang_trace token;
    -} erlang_msg;

    Information about a message received via +} erlang_msg;

    Information about a message received via ei_receive_msg() or friends.

  • @@ -200,15 +200,15 @@ ei_gethostbyname_r()

    -
    struct hostent * ei_gethostbyaddr(const char *addr, int len, int type);
    struct hostent * ei_gethostbyaddr_r(const char *addr, int length,  int type,
    -  struct hostent *hostp, char *buffer,   int buflen,  int *h_errnop);
    struct hostent * ei_gethostbyname(const char *name);
    struct hostent * ei_gethostbyname_r(const char *name,  struct hostent *hostp,
    -  char *buffer,  int buflen,  int *h_errnop);

    Convenience functions for some common name lookup functions.

    +
    struct hostent * ei_gethostbyaddr(const char *addr, int len, int type);
    struct hostent * ei_gethostbyaddr_r(const char *addr, int length,  int type,
    +  struct hostent *hostp, char *buffer,   int buflen,  int *h_errnop);
    struct hostent * ei_gethostbyname(const char *name);
    struct hostent * ei_gethostbyname_r(const char *name,  struct hostent *hostp,
    +  char *buffer,  int buflen,  int *h_errnop);

    Convenience functions for some common name lookup functions.

    ei_accept()

    -
    int ei_accept(ei_cnode *ec, int listensock, ErlConnect *conp);

    Used by a server process to accept a connection from a client process.

    @@ -284,15 +284,15 @@
    • {alias, {Alias, RealName}}
      Alias = string() and RealName = string(). alias allows documents to be stored in the local file system instead of the document_root location. URLs with a path beginning with url-path is mapped to local files beginning with -directory-filename, for example:

      {alias, {"/image", "/ftp/pub/image"}}

      Access to http://your.server.org/image/foo.gif would refer to the file +directory-filename, for example:

      {alias, {"/image", "/ftp/pub/image"}}

      Access to http://your.server.org/image/foo.gif would refer to the file /ftp/pub/image/foo.gif.

    • {re_write, {Re, Replacement}}
      Re = string() and Replacement = string(). re_write allows documents to be stored in the local file system instead of the document_root location. URLs are rewritten by re:replace/3 to produce a path in the local -file-system, for example:

      {re_write, {"^/[~]([^/]+)(.*)$", "/home/\\1/public\\2"}}

      Access to http://your.server.org/~bob/foo.gif would refer to the file +file-system, for example:

      {re_write, {"^/[~]([^/]+)(.*)$", "/home/\\1/public\\2"}}

      Access to http://your.server.org/~bob/foo.gif would refer to the file /home/bob/public/foo.gif.

    • {directory_index, [string()]}
      directory_index specifies a list of resources to look for if a client requests a directory using a / at the end of the directory name. file depicts the name of a file in the directory. Several files can be given, in -which case the server returns the first it finds, for example:

      {directory_index, ["index.html", "welcome.html"]}

      Access to http://your.server.org/docs/ would return +which case the server returns the first it finds, for example:

      {directory_index, ["index.html", "welcome.html"]}

      Access to http://your.server.org/docs/ would return http://your.server.org/docs/index.html or http://your.server.org/docs/welcome.html if index.html does not exist.

    @@ -320,7 +320,7 @@ method. The method is either GET or POST, as defined in RFC 1945. It propagates the URL and file path of the requested document using the standard CGI PATH_INFO and -PATH_TRANSLATED environment variables.

    Example:

    {script, {"PUT", "/cgi-bin/put"}}

    +PATH_TRANSLATED environment variables.

    Example:

    {script, {"PUT", "/cgi-bin/put"}}

    @@ -328,7 +328,7 @@

    • {erl_script_alias, {URLPath, [AllowedModule]}}
      URLPath = string() and AllowedModule = atom(). erl_script_alias marks all URLs matching url-path as erl scheme scripts. A matching URL is mapped -into a specific module and function, for example:

      {erl_script_alias, {"/cgi-bin/example", [httpd_example]}}

      A request to http://your.server.org/cgi-bin/example/httpd_example:yahoo would +into a specific module and function, for example:

      {erl_script_alias, {"/cgi-bin/example", [httpd_example]}}

      A request to http://your.server.org/cgi-bin/example/httpd_example:yahoo would refer to httpd_example:yahoo/3 or, if that does not exist, httpd_example:yahoo/2 and http://your.server.org/cgi-bin/example/other:yahoo would not be allowed to execute.

    • {erl_script_nocache, boolean()}
      If erl_script_nocache is set to true, the server adds HTTP header fields @@ -378,7 +378,7 @@ Authentication Properties - Requires mod_auth

    -

    {directory, {path(), [{property(), term()}]}}

    The properties for directories are as follows:

    • {allow_from, all | [RegxpHostString]}
      Defines a set of hosts to be granted access to a given directory, for example:

      {allow_from, ["123.34.56.11", "150.100.23"]}

      The host 123.34.56.11 and all machines on the 150.100.23 subnet are +

      {directory, {path(), [{property(), term()}]}}

      The properties for directories are as follows:

      • {allow_from, all | [RegxpHostString]}
        Defines a set of hosts to be granted access to a given directory, for example:

        {allow_from, ["123.34.56.11", "150.100.23"]}

        The host 123.34.56.11 and all machines on the 150.100.23 subnet are allowed access.

      • {deny_from, all | [RegxpHostString]}
        Defines a set of hosts to be denied access to a given directory, for example:

        {deny_from, ["123.34.56.11", "150.100.23"]}

        The host 123.34.56.11 and all machines on the 150.100.23 subnet are not allowed access.

      • {auth_type, plain | dets | mnesia}
        Sets the type of authentication database that is used for the directory. The key difference between the different methods is that dynamic data can be saved @@ -413,7 +413,7 @@ Security Properties - Requires mod_security -

        {security_directory, {path(), [{property(), term()}]}}

        The properties for the security directories are as follows:

        • {data_file, path()}
          Name of the security data file. The filename can either be absolute or +

          {security_directory, {path(), [{property(), term()}]}}

          The properties for the security directories are as follows:

          • {data_file, path()}
            Name of the security data file. The filename can either be absolute or relative to the server_root. This file is used to store persistent data for module mod_security.

          • {max_retries, integer()}
            Specifies the maximum number of attempts to authenticate a user before the user is blocked out. If a user successfully authenticates while blocked, the @@ -430,10 +430,10 @@ Web server API data types -

            The Erlang web server API data types are as follows:

            ModData = #mod{}
            +

            The Erlang web server API data types are as follows:

            ModData = #mod{}
             
            --record(mod, {
            -    data = [],
            +-record(mod, {
            +    data = [],
                 socket_type = ip_comm,
                 socket,
                 config_db,
            @@ -442,10 +442,10 @@
                 request_uri,
                 http_version,
                 request_line,
            -    parsed_header = [],
            +    parsed_header = [],
                 entity_body,
                 connection
            -}).

            To access the record in your callback-module use:

            -include_lib("inets/include/httpd.hrl").

            The fields of record mod have the following meaning:

            • data - Type [{InteractionKey,InteractionValue}] is used to propagate +}).

            To access the record in your callback-module use:

            -include_lib("inets/include/httpd.hrl").

            The fields of record mod have the following meaning:

            • data - Type [{InteractionKey,InteractionValue}] is used to propagate data between modules. Depicted interaction_data() in function type declarations.

            • socket_type - socket_type() indicates whether it is an IP socket or an ssl socket.

            • socket - The socket, in format ip_comm or ssl, depending on @@ -1376,7 +1376,7 @@ Erlang programming language

              -

              Copyright © 1996-2025 Ericsson AB

              +

              Copyright © 1996-2041 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/httpd_custom_api.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/httpd_custom_api.html 2025-05-10 20:19:08.845188064 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/httpd_custom_api.html 2025-05-10 20:19:08.849188101 +0000 @@ -319,7 +319,7 @@ Erlang programming language

              -

              Copyright © 1996-2025 Ericsson AB

              +

              Copyright © 1996-2041 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/httpd_socket.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/httpd_socket.html 2025-05-10 20:19:08.869188282 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/httpd_socket.html 2025-05-10 20:19:08.873188317 +0000 @@ -321,7 +321,7 @@ Erlang programming language

              -

              Copyright © 1996-2025 Ericsson AB

              +

              Copyright © 1996-2041 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/httpd_util.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/httpd_util.html 2025-05-10 20:19:08.901188571 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/httpd_util.html 2025-05-10 20:19:08.909188645 +0000 @@ -989,7 +989,7 @@ Erlang programming language

              -

              Copyright © 1996-2025 Ericsson AB

              +

              Copyright © 1996-2041 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/inets.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/inets.epub/OEBPS/content.opf 2025-05-10 20:19:08.937188898 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/inets.epub/OEBPS/content.opf 2025-05-10 20:19:08.941188935 +0000 @@ -4,10 +4,10 @@ version="3.0"> inets - 9.3.2 - urn:uuid:7633cd3d-cd89-1325-31cf-eacd6f060f1e + urn:uuid:8290138d-450d-159a-3145-a9a534851886 en - 2025-05-10T20:10:35Z + 2041-06-12T09:30:48Z /usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/inets.epub/OEBPS/http_client.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/inets.epub/OEBPS/http_client.xhtml 2025-05-10 20:19:08.937188898 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/inets.epub/OEBPS/http_client.xhtml 2025-05-10 20:19:08.941188935 +0000 @@ -33,32 +33,32 @@ handle each request, unless a persistent connection can be used with or without pipelining. The client adds a host header and an empty te header if there are no such headers present in the request.

              The client supports IPv6 as long as the underlying mechanisms also do so.

              The following is to be put in the Erlang node application configuration file to -start a profile at application startup:

              [{inets, [{services, [{httpc, PropertyList}]}]}]

              For valid properties, see httpc.

              +start a profile at application startup:

              [{inets, [{services, [{httpc, PropertyList}]}]}]

              For valid properties, see httpc.

              Getting Started

              -

              Start Inets:

              1> inets:start().
              +

              Start Inets:

              1> inets:start().
               ok

              The following calls use the default client profile. Use the proxy "www-proxy.mycompany.com:8000", except from requests to localhost. This -applies to all the following requests.

              Example:

              2> httpc:set_options([{proxy, {{"www-proxy.mycompany.com", 8000},
              -["localhost"]}}]).
              -ok

              The following is an ordinary synchronous request:

              3> {ok, {{Version, 200, ReasonPhrase}, Headers, Body}} =
              -.. httpc:request(get, {"http://www.erlang.org", []}, [], []).

              With all the default values presented, a get request can also be written as -follows:

              4> {ok, {{Version, 200, ReasonPhrase}, Headers, Body}} =
              -.. httpc:request("http://www.erlang.org").

              The following is a https request and with verification of the host:

              5> {ok, {{Version, 200, ReasonPhrase}, Headers, Body}} =
              -.. httpc:request(get, {"https://www.erlang.org", []}, [{ssl, httpc:ssl_verify_host_options(true)}], []).

              The following is an ordinary asynchronous request:

              6> {ok, RequestId} =
              -.. httpc:request(get, {"http://www.erlang.org", []}, [], [{sync, false}]).

              The result is sent to the calling process as {http, {ReqestId, Result}}.

              In this case, the calling process is the shell, so the following result is -received:

              7> receive {http, {RequestId, Result}} -> ok after 500 -> error end.
              -ok

              This sends a request with a specified connection header:

              8> {ok, {{NewVersion, 200, NewReasonPhrase}, NewHeaders, NewBody}} =
              -.. httpc:request(get, {"http://www.erlang.org", [{"connection", "close"}]},
              -.. [], []).

              This sends an HTTP request over a unix domain socket (experimental):

              9> httpc:set_options([{ipfamily, local}, {unix_socket,"/tmp/unix_socket/consul_http.sock"}]).
              -10> {ok, {{NewVersion, 200, NewReasonPhrase}, NewHeaders, NewBody}} =
              - .. httpc:request(put, {"http:///v1/kv/foo", [], [], "hello"}, [], []).

              Start an HTTP client profile:

              10> {ok, Pid} = inets:start(httpc, [{profile, foo}]).
              -{ok, <0.45.0>}

              The new profile has no proxy settings, so the connection is refused:

              11> httpc:request("http://www.erlang.org", foo).
              -{error, econnrefused}

              Stop the HTTP client profile:

              12> inets:stop(httpc, foo).
              -ok

              Alternative way to stop the HTTP client profile:

              13> inets:stop(httpc, Pid).
              +applies to all the following requests.

              Example:

              2> httpc:set_options([{proxy, {{"www-proxy.mycompany.com", 8000},
              +["localhost"]}}]).
              +ok

              The following is an ordinary synchronous request:

              3> {ok, {{Version, 200, ReasonPhrase}, Headers, Body}} =
              +.. httpc:request(get, {"http://www.erlang.org", []}, [], []).

              With all the default values presented, a get request can also be written as +follows:

              4> {ok, {{Version, 200, ReasonPhrase}, Headers, Body}} =
              +.. httpc:request("http://www.erlang.org").

              The following is a https request and with verification of the host:

              5> {ok, {{Version, 200, ReasonPhrase}, Headers, Body}} =
              +.. httpc:request(get, {"https://www.erlang.org", []}, [{ssl, httpc:ssl_verify_host_options(true)}], []).

              The following is an ordinary asynchronous request:

              6> {ok, RequestId} =
              +.. httpc:request(get, {"http://www.erlang.org", []}, [], [{sync, false}]).

              The result is sent to the calling process as {http, {ReqestId, Result}}.

              In this case, the calling process is the shell, so the following result is +received:

              7> receive {http, {RequestId, Result}} -> ok after 500 -> error end.
              +ok

              This sends a request with a specified connection header:

              8> {ok, {{NewVersion, 200, NewReasonPhrase}, NewHeaders, NewBody}} =
              +.. httpc:request(get, {"http://www.erlang.org", [{"connection", "close"}]},
              +.. [], []).

              This sends an HTTP request over a unix domain socket (experimental):

              9> httpc:set_options([{ipfamily, local}, {unix_socket,"/tmp/unix_socket/consul_http.sock"}]).
              +10> {ok, {{NewVersion, 200, NewReasonPhrase}, NewHeaders, NewBody}} =
              + .. httpc:request(put, {"http:///v1/kv/foo", [], [], "hello"}, [], []).

              Start an HTTP client profile:

              10> {ok, Pid} = inets:start(httpc, [{profile, foo}]).
              +{ok, <0.45.0>}

              The new profile has no proxy settings, so the connection is refused:

              11> httpc:request("http://www.erlang.org", foo).
              +{error, econnrefused}

              Stop the HTTP client profile:

              12> inets:stop(httpc, foo).
              +ok

              Alternative way to stop the HTTP client profile:

              13> inets:stop(httpc, Pid).
               ok
              /usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/inets.epub/OEBPS/http_server.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/inets.epub/OEBPS/http_server.xhtml 2025-05-10 20:19:08.933188862 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/inets.epub/OEBPS/http_server.xhtml 2025-05-10 20:19:08.941188935 +0000 @@ -36,20 +36,20 @@ server API, which is described in the Erlang Web Server API. This API can be used to enhance the core server functionality, for example with custom logging and authentication.

              The following is to be put in the Erlang node application configuration file to -start an HTTP server at application startup:

              [{inets, [{services, [{httpd, [{proplist_file,
              -           "/var/tmp/server_root/conf/8888_props.conf"}]},
              -          {httpd, [{proplist_file,
              -           "/var/tmp/server_root/conf/8080_props.conf"}]}]}]}].

              The server is configured using an Erlang property list. For the available -properties, see httpd.

              The available configuration properties are as follows:

              httpd_service() -> {httpd, httpd()}
              -httpd()         -> [httpd_config()]
              -httpd_config()  -> {proplist_file, file()}
              -                   {debug, debug()} |
              -                   {accept_timeout, integer()}
              -debug()         -> disable | [debug_options()]
              -debug_options() -> {all_functions, modules()} |
              -                   {exported_functions, modules()} |
              -                   {disable, modules()}
              -modules()       -> [atom()]

              Here:

              In all of these cases, ReplyInfo has the following structure:

               {RequestId, saved_to_file}
              - {RequestId, {error, Reason}}
              - {RequestId, Result}
              - {RequestId, stream_start, Headers}
              - {RequestId, stream_start, Headers, HandlerPid}
              - {RequestId, stream, BinBodyPart}
              - {RequestId, stream_end, Headers}

              Default is the pid of the process calling the request function (self/0).

            • ipv6_host_with_brackets - Defines when parsing the Host-Port part of an +apply(Module, Function, [ReplyInfo | Args]).

            In all of these cases, ReplyInfo has the following structure:

             {RequestId, saved_to_file}
            + {RequestId, {error, Reason}}
            + {RequestId, Result}
            + {RequestId, stream_start, Headers}
            + {RequestId, stream_start, Headers, HandlerPid}
            + {RequestId, stream, BinBodyPart}
            + {RequestId, stream_end, Headers}

            Default is the pid of the process calling the request function (self/0).

          • ipv6_host_with_brackets - Defines when parsing the Host-Port part of an URI with an IPv6 address with brackets, if those brackets are to be retained (true) or stripped (false).

            Default is false.

          /usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/inets.epub/OEBPS/httpd.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/inets.epub/OEBPS/httpd.xhtml 2025-05-10 20:19:08.933188862 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.3.2/doc/html/inets.epub/OEBPS/httpd.xhtml 2025-05-10 20:19:08.941188935 +0000 @@ -131,36 +131,36 @@ level error under the hierarchical logger domain: [otp, inets, httpd, ServerID, error] The built in logger formatting function produces log entries from the error -reports:

          #{server_name => string()
          +reports:

          #{server_name => string()
             protocol => internal | 'TCP' | 'TLS' | 'HTTP',
             transport => "TCP" | "TLS", %% Present when protocol = 'HTTP'
          -  uri => string(), %% Present when protocol = 'HTTP' and URI is valid
          -  peer => inet:peername(),
          -  host => inet:hostname(),
          -  reason => term()
          -}

          An example of a log entry with only default settings of logger

          =ERROR REPORT==== 9-Oct-2019::09:33:27.350235 ===
          +  uri => string(), %% Present when protocol = 'HTTP' and URI is valid
          +  peer => inet:peername(),
          +  host => inet:hostname(),
          +  reason => term()
          +}

          An example of a log entry with only default settings of logger

          =ERROR REPORT==== 9-Oct-2019::09:33:27.350235 ===
              Server: My Server
            Protocol: HTTP
           Transport: TLS
                 URI: /not_there
                Host: 127.0.1.1:80
                Peer: 127.0.0.1:45253
          -   Reason: [{statuscode,404},{description,"Object Not Found"}]

          Using this option makes mod_log and mod_disk_log error logs redundant.

          Add the filter

          {fun logger_filters:domain/2,
          -    {log,equal,[otp,inets, httpd, ServerID, error]}

          to appropriate logger handler to handle the events. For example to write the + Reason: [{statuscode,404},{description,"Object Not Found"}]

          Using this option makes mod_log and mod_disk_log error logs redundant.

          Add the filter

          {fun logger_filters:domain/2,
          +    {log,equal,[otp,inets, httpd, ServerID, error]}

          to appropriate logger handler to handle the events. For example to write the error log from an httpd server with a ServerID of my_server to a file -you can use the following sys.config:

          [{kernel,
          - [{logger,
          -  [{handler, http_error_test, logger_std_h,
          -    #{config => #{ file => "log/http_error.log" },
          -      filters => [{inets_httpd, {fun logger_filters:domain/2,
          -                                 {log, equal,
          -                                  [otp, inets, httpd, my_server, error]
          -                                 }}}],
          -      filter_default => stop }}]}]}].

          or if you want to add it to the default logger via an API:

          logger:add_handler_filter(default,
          +you can use the following sys.config:

          [{kernel,
          + [{logger,
          +  [{handler, http_error_test, logger_std_h,
          +    #{config => #{ file => "log/http_error.log" },
          +      filters => [{inets_httpd, {fun logger_filters:domain/2,
          +                                 {log, equal,
          +                                  [otp, inets, httpd, my_server, error]
          +                                 }}}],
          +      filter_default => stop }}]}]}].

          or if you want to add it to the default logger via an API:

          logger:add_handler_filter(default,
                                     inets_httpd,
          -                          {fun logger_filters:domain/2,
          -                           {log, equal,
          -                            [otp, inets, httpd, my_server, error]}}).
      • {log_format, common | combined}
        Defines if access logs are to be written according to the common log format + {fun logger_filters:domain/2, + {log, equal, + [otp, inets, httpd, my_server, error]}}).

    • {log_format, common | combined}
      Defines if access logs are to be written according to the common log format or the extended common log format. The common format is one line looking like this: remotehost rfc931 authuser [date] "request" status bytes.

      Here:

      • remotehost - Remote.

      • rfc931 - The remote username of the client (RFC 931).

      • authuser - The username used for authentication.

      • [date] - Date and time of the request @@ -170,7 +170,7 @@ remotehost rfc931 authuser [date] "request" status bytes "referer" "user_agent"

        In addition to the earlier:

        • "referer" - The URL the client was on before requesting the URL (if it could not be determined, a minus sign is placed in this field).

        • "user_agent" - The software the client claims to be using (if it could not be determined, a minus sign is placed in this field).

        This affects the access logs written by mod_log and mod_disk_log.

      • {error_log_format, pretty | compact}
        Default is pretty. If the error log is meant to be read directly by a human, -pretty is the best option.

        pretty has a format corresponding to:

        io:format("[~s] ~s, reason: ~n ~p ~n~n", [Date, Msg, Reason]).

        compact has a format corresponding to:

        io:format("[~s] ~s, reason: ~w ~n", [Date, Msg, Reason]).

        This affects the error logs written by mod_log and mod_disk_log.

      +pretty is the best option.

      pretty has a format corresponding to:

      io:format("[~s] ~s, reason: ~n ~p ~n~n", [Date, Msg, Reason]).

      compact has a format corresponding to:

      io:format("[~s] ~s, reason: ~w ~n", [Date, Msg, Reason]).

      This affects the error logs written by mod_log and mod_disk_log.

    @@ -179,15 +179,15 @@
    • {alias, {Alias, RealName}}
      Alias = string() and RealName = string(). alias allows documents to be stored in the local file system instead of the document_root location. URLs with a path beginning with url-path is mapped to local files beginning with -directory-filename, for example:

      {alias, {"/image", "/ftp/pub/image"}}

      Access to http://your.server.org/image/foo.gif would refer to the file +directory-filename, for example:

      {alias, {"/image", "/ftp/pub/image"}}

      Access to http://your.server.org/image/foo.gif would refer to the file /ftp/pub/image/foo.gif.

    • {re_write, {Re, Replacement}}
      Re = string() and Replacement = string(). re_write allows documents to be stored in the local file system instead of the document_root location. URLs are rewritten by re:replace/3 to produce a path in the local -file-system, for example:

      {re_write, {"^/[~]([^/]+)(.*)$", "/home/\\1/public\\2"}}

      Access to http://your.server.org/~bob/foo.gif would refer to the file +file-system, for example:

      {re_write, {"^/[~]([^/]+)(.*)$", "/home/\\1/public\\2"}}

      Access to http://your.server.org/~bob/foo.gif would refer to the file /home/bob/public/foo.gif.

    • {directory_index, [string()]}
      directory_index specifies a list of resources to look for if a client requests a directory using a / at the end of the directory name. file depicts the name of a file in the directory. Several files can be given, in -which case the server returns the first it finds, for example:

      {directory_index, ["index.html", "welcome.html"]}

      Access to http://your.server.org/docs/ would return +which case the server returns the first it finds, for example:

      {directory_index, ["index.html", "welcome.html"]}

      Access to http://your.server.org/docs/ would return http://your.server.org/docs/index.html or http://your.server.org/docs/welcome.html if index.html does not exist.

    @@ -215,7 +215,7 @@ method. The method is either GET or POST, as defined in RFC 1945. It propagates the URL and file path of the requested document using the standard CGI PATH_INFO and -PATH_TRANSLATED environment variables.

    Example:

    {script, {"PUT", "/cgi-bin/put"}}

    +PATH_TRANSLATED environment variables.

    Example:

    {script, {"PUT", "/cgi-bin/put"}}

    @@ -223,7 +223,7 @@

    • {erl_script_alias, {URLPath, [AllowedModule]}}
      URLPath = string() and AllowedModule = atom(). erl_script_alias marks all URLs matching url-path as erl scheme scripts. A matching URL is mapped -into a specific module and function, for example:

      {erl_script_alias, {"/cgi-bin/example", [httpd_example]}}

      A request to http://your.server.org/cgi-bin/example/httpd_example:yahoo would +into a specific module and function, for example:

      {erl_script_alias, {"/cgi-bin/example", [httpd_example]}}

      A request to http://your.server.org/cgi-bin/example/httpd_example:yahoo would refer to httpd_example:yahoo/3 or, if that does not exist, httpd_example:yahoo/2 and http://your.server.org/cgi-bin/example/other:yahoo would not be allowed to execute.

    • {erl_script_nocache, boolean()}
      If erl_script_nocache is set to true, the server adds HTTP header fields @@ -273,7 +273,7 @@ Authentication Properties - Requires mod_auth

    -

    {directory, {path(), [{property(), term()}]}}

    The properties for directories are as follows:

  • {sctp_events, #sctp_event_subscribe{}}

    #sctp_event_subscribe{
    +Sockets API Extensions for SCTP.

  • {sctp_events, #sctp_event_subscribe{}}

    #sctp_event_subscribe{
             data_io_event          = true | false,
             association_event      = true | false,
             address_event          = true | false,
    @@ -183,42 +183,42 @@
             shutdown_event         = true | false,
             partial_delivery_event = true | false,
             adaptation_layer_event = true | false
    -}

    This option determines which SCTP Events that are to be +}

    This option determines which SCTP Events that are to be received (through recv/*) along with the data. The only exception is data_io_event, which enables or disables receiving of #sctp_sndrcvinfo{} ancillary data, not events. By default, all flags except adaptation_layer_event are enabled, although sctp_data_io_event and association_event are used by the driver -itself and not exported to the user level.

  • {sctp_delayed_ack_time, #sctp_assoc_value{}}

    #sctp_assoc_value{
    -      assoc_id    = assoc_id(),
    -      assoc_value = integer()
    -}

    Rarely used. Determines the ACK time (specified by assoc_value, in +itself and not exported to the user level.

  • {sctp_delayed_ack_time, #sctp_assoc_value{}}

    #sctp_assoc_value{
    +      assoc_id    = assoc_id(),
    +      assoc_value = integer()
    +}

    Rarely used. Determines the ACK time (specified by assoc_value, in milliseconds) for the specified association or the whole endpoint if -assoc_value = 0 (default).

  • {sctp_status, #sctp_status{}}

    #sctp_status{
    -      assoc_id            = assoc_id(),
    -      state               = atom(),
    -      rwnd                = integer(),
    -      unackdata           = integer(),
    -      penddata            = integer(),
    -      instrms             = integer(),
    -      outstrms            = integer(),
    -      fragmentation_point = integer(),
    -      primary             = #sctp_paddrinfo{}
    -}

    This option is read-only. It determines the status of the SCTP association +assoc_value = 0 (default).

  • {sctp_status, #sctp_status{}}

    #sctp_status{
    +      assoc_id            = assoc_id(),
    +      state               = atom(),
    +      rwnd                = integer(),
    +      unackdata           = integer(),
    +      penddata            = integer(),
    +      instrms             = integer(),
    /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/gen_tcp.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/gen_tcp.xhtml	2025-05-10 20:19:10.517203223 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/gen_tcp.xhtml	2025-05-10 20:19:10.541203440 +0000
    @@ -25,27 +25,27 @@
           

    Interface to TCP/IP sockets.

    This module provides functions for communicating over TCP/IP protocol sockets.

    The following code fragment is a simple example of a client connecting to a -server at port 5678, transferring a binary, and closing the connection:

    client() ->
    +server at port 5678, transferring a binary, and closing the connection:

    client() ->
         SomeHostInNet = "localhost", % to make it runnable on one machine
    -    {ok, Sock} = gen_tcp:connect(SomeHostInNet, 5678,
    -                                 [binary, {packet, 0}]),
    -    ok = gen_tcp:send(Sock, "Some Data"),
    -    ok = gen_tcp:close(Sock).

    At the other end, a server is listening on port 5678, accepts the connection, -and receives the binary:

    server() ->
    -    {ok, LSock} = gen_tcp:listen(5678, [binary, {packet, 0},
    -                                        {active, false}]),
    -    {ok, Sock} = gen_tcp:accept(LSock),
    -    {ok, Bin} = do_recv(Sock, []),
    -    ok = gen_tcp:close(Sock),
    -    ok = gen_tcp:close(LSock),
    +    {ok, Sock} = gen_tcp:connect(SomeHostInNet, 5678,
    +                                 [binary, {packet, 0}]),
    +    ok = gen_tcp:send(Sock, "Some Data"),
    +    ok = gen_tcp:close(Sock).

    At the other end, a server is listening on port 5678, accepts the connection, +and receives the binary:

    server() ->
    +    {ok, LSock} = gen_tcp:listen(5678, [binary, {packet, 0},
    +                                        {active, false}]),
    +    {ok, Sock} = gen_tcp:accept(LSock),
    +    {ok, Bin} = do_recv(Sock, []),
    +    ok = gen_tcp:close(Sock),
    +    ok = gen_tcp:close(LSock),
         Bin.
     
    -do_recv(Sock, Bs) ->
    -    case gen_tcp:recv(Sock, 0) of
    -        {ok, B} ->
    -            do_recv(Sock, [Bs, B]);
    -        {error, closed} ->
    -            {ok, list_to_binary(Bs)}
    +do_recv(Sock, Bs) ->
    +    case gen_tcp:recv(Sock, 0) of
    +        {ok, B} ->
    +            do_recv(Sock, [Bs, B]);
    +        {error, closed} ->
    +            {ok, list_to_binary(Bs)}
         end.

    For more examples, see section Examples.

    Note

    Functions that create sockets can take an optional option; {inet_backend, Backend} that, if specified, has to be the first option. This selects the implementation backend towards the platform's socket API.

    This is a temporary option that will be ignored in a future release.

    The default is Backend = inet that selects the traditional inet_drv.c @@ -84,48 +84,48 @@ a single listening socket. Function start/2 takes the number of worker processes and the port number on which to listen for incoming connections. If LPort is specified as 0, an ephemeral port number is used, which is why the -start function returns the actual port number allocated:

    start(Num,LPort) ->
    -    case gen_tcp:listen(LPort,[{active, false},{packet,2}]) of
    -        {ok, ListenSock} ->
    -            start_servers(Num,ListenSock),
    -            {ok, Port} = inet:port(ListenSock),
    +start function returns the actual port number allocated:

    start(Num,LPort) ->
    +    case gen_tcp:listen(LPort,[{active, false},{packet,2}]) of
    +        {ok, ListenSock} ->
    +            start_servers(Num,ListenSock),
    +            {ok, Port} = inet:port(ListenSock),
                 Port;
    -        {error,Reason} ->
    -            {error,Reason}
    +        {error,Reason} ->
    +            {error,Reason}
         end.
     
    -start_servers(0,_) ->
    +start_servers(0,_) ->
         ok;
    -start_servers(Num,LS) ->
    -    spawn(?MODULE,server,[LS]),
    -    start_servers(Num-1,LS).
    +start_servers(Num,LS) ->
    +    spawn(?MODULE,server,[LS]),
    +    start_servers(Num-1,LS).
     
    -server(LS) ->
    -    case gen_tcp:accept(LS) of
    -        {ok,S} ->
    -            loop(S),
    -            server(LS);
    +server(LS) ->
    +    case gen_tcp:accept(LS) of
    +        {ok,S} ->
    +            loop(S),
    +            server(LS);
             Other ->
    -            io:format("accept returned ~w - goodbye!~n",[Other]),
    +            io:format("accept returned ~w - goodbye!~n",[Other]),
                 ok
         end.
     
    -loop(S) ->
    -    inet:setopts(S,[{active,once}]),
    +loop(S) ->
    +    inet:setopts(S,[{active,once}]),
         receive
    -        {tcp,S,Data} ->
    -            Answer = process(Data), % Not implemented in this example
    -            gen_tcp:send(S,Answer),
    -            loop(S);
    -        {tcp_closed,S} ->
    -            io:format("Socket ~w closed [~w]~n",[S,self()]),
    +        {tcp,S,Data} ->
    +            Answer = process(Data), % Not implemented in this example
    +            gen_tcp:send(S,Answer),
    +            loop(S);
    +        {tcp_closed,S} ->
    +            io:format("Socket ~w closed [~w]~n",[S,self()]),
                 ok
    -    end.

    Example of a simple client:

    client(PortNo,Message) ->
    -    {ok,Sock} = gen_tcp:connect("localhost",PortNo,[{active,false},
    -                                                    {packet,2}]),
    -    gen_tcp:send(Sock,Message),
    -    A = gen_tcp:recv(Sock,0),
    -    gen_tcp:close(Sock),
    +    end.

    Example of a simple client:

    client(PortNo,Message) ->
    +    {ok,Sock} = gen_tcp:connect("localhost",PortNo,[{active,false},
    +                                                    {packet,2}]),
    +    gen_tcp:send(Sock,Message),
    +    A = gen_tcp:recv(Sock,0),
    +    gen_tcp:close(Sock),
         A.

    The send call does not accept a time-out option because time-outs on send is handled through socket option send_timeout. The behavior of a send operation with no receiver is mainly defined by the underlying TCP stack and the network @@ -135,32 +135,32 @@ does not get any acknowledge for each message it sends, but has to rely on the send time-out option to detect that the other end is unresponsive. Option send_timeout can be used when connecting:

    ...
    -{ok,Sock} = gen_tcp:connect(HostAddress, Port,
    -                            [{active,false},
    -                             {send_timeout, 5000},
    -                             {packet,2}]),
    -                loop(Sock), % See below
    -...

    In the loop where requests are handled, send time-outs can now be detected:

    loop(Sock) ->
    +{ok,Sock} = gen_tcp:connect(HostAddress, Port,
    +                            [{active,false},
    +                             {send_timeout, 5000},
    +                             {packet,2}]),
    +                loop(Sock), % See below
    +...

    In the loop where requests are handled, send time-outs can now be detected:

    loop(Sock) ->
         receive
    -        {Client, send_data, Binary} ->
    -            case gen_tcp:send(Sock,[Binary]) of
    -                {error, timeout} ->
    -                    io:format("Send timeout, closing!~n",
    -                              []),
    -                    handle_send_timeout(), % Not implemented here
    -                    Client ! {self(),{error_sending, timeout}},
    +        {Client, send_data, Binary} ->
    +            case gen_tcp:send(Sock,[Binary]) of
    +                {error, timeout} ->
    +                    io:format("Send timeout, closing!~n",
    +                              []),
    +                    handle_send_timeout(), % Not implemented here
    +                    Client ! {self(),{error_sending, timeout}},
                         %% Usually, it's a good idea to give up in case of a
                         %% send timeout, as you never know how much actually
                         %% reached the server, maybe only a packet header?!
    -                    gen_tcp:close(Sock);
    -                {error, OtherSendError} ->
    -                    io:format("Some other error on socket (~p), closing",
    -                              [OtherSendError]),
    -                    Client ! {self(),{error_sending, OtherSendError}},
    -                    gen_tcp:close(Sock);
    +                    gen_tcp:close(Sock);
    +                {error, OtherSendError} ->
    +                    io:format("Some other error on socket (~p), closing",
    +                              [OtherSendError]),
    +                    Client ! {self(),{error_sending, OtherSendError}},
    +                    gen_tcp:close(Sock);
                     ok ->
    -                    Client ! {self(), data_sent},
    -                    loop(Sock)
    +                    Client ! {self(), data_sent},
    +                    loop(Sock)
                 end
         end.

    Usually it suffices to detect time-outs on receive, as most protocols include some sort of acknowledgment from the server, but if the protocol is strictly one /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/gen_udp.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/gen_udp.xhtml 2025-05-10 20:19:10.517203223 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/gen_udp.xhtml 2025-05-10 20:19:10.541203440 +0000 @@ -839,8 +839,8 @@ Leaves a multicast group.

  • option/0 - See inet:setopts/2.

  • UDP packets are sent with this socket using send(Socket, ...). When UDP packets arrive to the Socket's UDP port, and the socket is in an active mode, the packets are delivered as messages to the -controlling process (socket owner):

    {udp, Socket, PeerIP, PeerPort, Packet} % Without ancillary data
    -{udp, Socket, PeerIP, PeerPort, AncData, Packet} % With ancillary data

    PeerIP and PeerPort are the address from which Packet was sent. +controlling process (socket owner):

    {udp, Socket, PeerIP, PeerPort, Packet} % Without ancillary data
    +{udp, Socket, PeerIP, PeerPort, AncData, Packet} % With ancillary data

    PeerIP and PeerPort are the address from which Packet was sent. Packet is a list of bytes ([byte/0] if option list is active and a binary/0 if option binaryis active (they are mutually exclusive).

    The message contains an AncData field only if any of the socket @@ -848,8 +848,8 @@ recvtclass or recvttl are active.

    When a socket in {active, N} mode (see inet:setopts/2 for details), transitions to passive ({active, false}) mode (N counts down to 0), -the controlling process is notified by a message on this form:

    {udp_passive, Socket}

    If the OS protocol stack reports an error for the socket, the following -message is sent to the controlling process:

    {udp_error, Socket, Reason}

    Reason is mostly a POSIX Error Code.

    If the socket is in passive mode (not in an active mode), received data +the controlling process is notified by a message on this form:

    {udp_passive, Socket}

    If the OS protocol stack reports an error for the socket, the following +message is sent to the controlling process:

    {udp_error, Socket, Reason}

    Reason is mostly a POSIX Error Code.

    If the socket is in passive mode (not in an active mode), received data can be retrieved with therecv/2,3](recv/2) calls. Note that incoming UDP packets that are longer than the receive buffer option specifies can be truncated without warning.

    The default value for the receive buffer option is {recbuf, 8192}.

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/global_group.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/global_group.xhtml 2025-05-10 20:19:10.517203223 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/global_group.xhtml 2025-05-10 20:19:10.541203440 +0000 @@ -27,7 +27,7 @@ groups. Each global group has its own global namespace, see global.

    The main advantage of dividing systems into global groups is that the background load decreases while the number of nodes to be updated is reduced when manipulating globally registered names.

    The Kernel configuration parameter global_groups -defines the global groups:

    {global_groups, [GroupTuple :: group_tuple()]}

    For the processes and nodes to run smoothly using the global group +defines the global groups:

    {global_groups, [GroupTuple :: group_tuple()]}

    For the processes and nodes to run smoothly using the global group functionality, the following criteria must be met:

    • An instance of the global group server, global_group, must be running on each node. The processes are automatically started and synchronized when a node is started.
    • All involved nodes must agree on the global group definition, otherwise the /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/inet.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/inet.xhtml 2025-05-10 20:19:10.517203223 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/inet.xhtml 2025-05-10 20:19:10.541203440 +0000 @@ -46,19 +46,19 @@ or as a tuple {150, 236, 20, 73}.

      IPv4 address examples:

      Address          ip_address()
       -------          ------------
       127.0.0.1        {127,0,0,1}
      -192.168.42.2     {192,168,42,2}

      IPv6 address examples:

      Address          ip_address()
      +192.168.42.2     {192,168,42,2}

      IPv6 address examples:

      Address          ip_address()
       -------          ------------
      -::1             {0,0,0,0,0,0,0,1}
      -::192.168.42.2  {0,0,0,0,0,0,(192 bsl 8) bor 168,(42 bsl 8) bor 2}
      +::1             {0,0,0,0,0,0,0,1}
      +::192.168.42.2  {0,0,0,0,0,0,(192 bsl 8) bor 168,(42 bsl 8) bor 2}
       ::FFFF:192.168.42.2
      -                {0,0,0,0,0,16#FFFF,(192 bsl 8) bor 168,(42 bsl 8) bor 2}
      +                {0,0,0,0,0,16#FFFF,(192 bsl 8) bor 168,(42 bsl 8) bor 2}
       3ffe:b80:1f8d:2:204:acff:fe17:bf38
      -                {16#3ffe,16#b80,16#1f8d,16#2,16#204,16#acff,16#fe17,16#bf38}
      +                {16#3ffe,16#b80,16#1f8d,16#2,16#204,16#acff,16#fe17,16#bf38}
       fe80::204:acff:fe17:bf38
      -                {16#fe80,0,0,0,16#204,16#acff,16#fe17,16#bf38}

      Function parse_address/1 can be useful:

      1> inet:parse_address("192.168.42.2").
      -{ok,{192,168,42,2}}
      -2> inet:parse_address("::FFFF:192.168.42.2").
      -{ok,{0,0,0,0,0,65535,49320,10754}}

      + {16#fe80,0,0,0,16#204,16#acff,16#fe17,16#bf38}

      Function parse_address/1 can be useful:

      1> inet:parse_address("192.168.42.2").
      +{ok,{192,168,42,2}}
      +2> inet:parse_address("::FFFF:192.168.42.2").
      +{ok,{0,0,0,0,0,65535,49320,10754}}

      @@ -849,7 +849,7 @@

      A record describing a host; name and address.

      Corresponds to the C: struct hostent as returned by for example -gethostbyname(3).

      The record is defined in the Kernel include file "inet.hrl".

      Add the following directive to the module:

      -include_lib("kernel/include/inet.hrl").
      +gethostbyname(3).

      The record is defined in the Kernel include file "inet.hrl".

      Add the following directive to the module:

      -include_lib("kernel/include/inet.hrl").
      @@ -2001,8 +2001,8 @@ this information, you need to know the following:

      • The numeric value of protocol level IPPROTO_TCP
      • The numeric value of option TCP_INFO
      • The size of struct tcp_info
      • The size and offset of the specific field

      By inspecting the headers or writing a small C program, it is found that IPPROTO_TCP is 6, TCP_INFO is 11, the structure size is 92 (bytes), the offset of tcpi_sacked is 28 bytes, and the value is a 32-bit integer. The -following code can be used to retrieve the value:

      get_tcpi_sacked(Sock) ->
      -    {ok,[{raw,_,_,Info}]} = inet:getopts(Sock,[{raw,6,11,92}]),
      +following code can be used to retrieve the value:

      get_tcpi_sacked(Sock) ->
      +    {ok,[{raw,_,_,Info}]} = inet:getopts(Sock,[{raw,6,11,92}]),
           <<_:28/binary,TcpiSacked:32/native,_/binary>> = Info,
           TcpiSacked.

      Preferably, you would check the machine type, the operating system, and the Kernel version before executing anything similar to this code.

      @@ -2354,7 +2354,7 @@

      Start a socket monitor.

      If the Socket to monitor doesn't exist or when the monitor is triggered, -a 'DOWN' message is sent that has the following pattern:

      	    {'DOWN', MonitorRef, Type, Object, Info}
      • MonitorRef - The return value from this function.

      • Type - The type of socket, can be one of the following +a 'DOWN' message is sent that has the following pattern:

        	    {'DOWN', MonitorRef, Type, Object, Info}
        • MonitorRef - The return value from this function.

        • Type - The type of socket, can be one of the following atom/0s: port or socket.

        • Object - The monitored entity, the socket, which triggered the event.

        • Info - Either the termination reason of the socket or nosock (the Socket did not exist when this function was called).

        Making several calls to inet:monitor/1 for the same Socket is not an error; one monitor is created per call.

        The monitor is triggered when the socket is closed in any way such as /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/inet_res.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/inet_res.xhtml 2025-05-10 20:19:10.517203223 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/inet_res.xhtml 2025-05-10 20:19:10.537203404 +0000 @@ -74,15 +74,15 @@ Example

      This access functions example shows how lookup/3 can be implemented using -resolve/3 from outside the module:

      example_lookup(Name, Class, Type) ->
      -    case inet_res:resolve(Name, Class, Type) of
      -        {ok,Msg} ->
      -            [inet_dns:rr(RR, data)
      -             || RR <- inet_dns:msg(Msg, anlist),
      -                 inet_dns:rr(RR, type) =:= Type,
      -                 inet_dns:rr(RR, class) =:= Class];
      -        {error,_} ->
      -            []
      +resolve/3 from outside the module:

      example_lookup(Name, Class, Type) ->
      +    case inet_res:resolve(Name, Class, Type) of
      +        {ok,Msg} ->
      +            [inet_dns:rr(RR, data)
      +             || RR <- inet_dns:msg(Msg, anlist),
      +                 inet_dns:rr(RR, type) =:= Type,
      +                 inet_dns:rr(RR, class) =:= Class];
      +        {error,_} ->
      +            []
            end.
      @@ -478,57 +478,57 @@

      A DNS message.

      This is the start of a hierarchy of opaque data structures that can be examined with access functions in inet_dns, which return lists of {Field,Value} tuples. The arity 2 functions return the value -for a specified field.

      dns_msg() = DnsMsg
      -    inet_dns:msg(DnsMsg) ->
      -        [ {header, dns_header()}
      -        | {qdlist, dns_query()}
      -        | {anlist, dns_rr()}
      -        | {nslist, dns_rr()}
      -        | {arlist, dns_rr()} ]
      -    inet_dns:msg(DnsMsg, header) -> dns_header() % for example
      -    inet_dns:msg(DnsMsg, Field) -> Value
      -
      -dns_header() = DnsHeader
      -    inet_dns:header(DnsHeader) ->
      -        [ {id, integer()}
      -        | {qr, boolean()}
      -        | {opcode, query | iquery | status | integer()}
      -        | {aa, boolean()}
      -        | {tc, boolean()}
      -        | {rd, boolean()}
      -        | {ra, boolean()}
      -        | {pr, boolean()}
      -        | {rcode, integer(0..16)} ]
      -    inet_dns:header(DnsHeader, Field) -> Value
      -
      -query_type() = axfr | mailb | maila | any | dns_rr_type()
      -
      -dns_query() = DnsQuery
      -    inet_dns:dns_query(DnsQuery) ->
      -        [ {domain, dns_name()}
      -        | {type, query_type()}
      -        | {class, dns_class()} ]
      -    inet_dns:dns_query(DnsQuery, Field) -> Value
      -
      -dns_rr() = DnsRr
      -    inet_dns:rr(DnsRr) -> DnsRrFields | DnsRrOptFields
      -    DnsRrFields = [ {domain, dns_name()}
      -                  | {type, dns_rr_type()}
      -                  | {class, dns_class()}
      -                  | {ttl, integer()}
      -                  | {data, dns_data()} ]
      -    DnsRrOptFields = [ {domain, dns_name()}
      -                     | {type, opt}
      -                     | {udp_payload_size, integer()}
      -                     | {ext_rcode, integer()}
      -                     | {version, integer()}
      -                     | {z, integer()}
      -                     | {data, dns_data()} ]
      -    inet_dns:rr(DnsRr, Field) -> Value

      There is an information function for the types above:

      inet_dns:record_type(dns_msg()) -> msg;
      -inet_dns:record_type(dns_header()) -> header;
      -inet_dns:record_type(dns_query()) -> dns_query;
      -inet_dns:record_type(dns_rr()) -> rr;
      -inet_dns:record_type(_) -> undefined.

      So, inet_dns:(inet_dns:record_type(X))(X) converts any of these data +for a specified field.

      dns_msg() = DnsMsg
      +    inet_dns:msg(DnsMsg) ->
      +        [ {header, dns_header()}
      +        | {qdlist, dns_query()}
      +        | {anlist, dns_rr()}
      +        | {nslist, dns_rr()}
      +        | {arlist, dns_rr()} ]
      +    inet_dns:msg(DnsMsg, header) -> dns_header() % for example
      +    inet_dns:msg(DnsMsg, Field) -> Value
      +
      +dns_header() = DnsHeader
      +    inet_dns:header(DnsHeader) ->
      +        [ {id, integer()}
      +        | {qr, boolean()}
      +        | {opcode, query | iquery | status | integer()}
      +        | {aa, boolean()}
      +        | {tc, boolean()}
      +        | {rd, boolean()}
      +        | {ra, boolean()}
      +        | {pr, boolean()}
      +        | {rcode, integer(0..16)} ]
      +    inet_dns:header(DnsHeader, Field) -> Value
      +
      +query_type() = axfr | mailb | maila | any | dns_rr_type()
      +
      +dns_query() = DnsQuery
      +    inet_dns:dns_query(DnsQuery) ->
      +        [ {domain, dns_name()}
      +        | {type, query_type()}
      +        | {class, dns_class()} ]
      +    inet_dns:dns_query(DnsQuery, Field) -> Value
      +
      +dns_rr() = DnsRr
      +    inet_dns:rr(DnsRr) -> DnsRrFields | DnsRrOptFields
      +    DnsRrFields = [ {domain, dns_name()}
      +                  | {type, dns_rr_type()}
      +                  | {class, dns_class()}
      +                  | {ttl, integer()}
      +                  | {data, dns_data()} ]
      +    DnsRrOptFields = [ {domain, dns_name()}
      +                     | {type, opt}
      +                     | {udp_payload_size, integer()}
      +                     | {ext_rcode, integer()}
      +                     | {version, integer()}
      +                     | {z, integer()}
      +                     | {data, dns_data()} ]
      +    inet_dns:rr(DnsRr, Field) -> Value

      There is an information function for the types above:

      inet_dns:record_type(dns_msg()) -> msg;
      +inet_dns:record_type(dns_header()) -> header;
      +inet_dns:record_type(dns_query()) -> dns_query;
      +inet_dns:record_type(dns_rr()) -> rr;
      +inet_dns:record_type(_) -> undefined.

      So, inet_dns:(inet_dns:record_type(X))(X) converts any of these data structures into a {Field,Value} list.

      /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/logger.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/logger.xhtml 2025-05-10 20:19:10.517203223 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/logger.xhtml 2025-05-10 20:19:10.537203404 +0000 @@ -25,18 +25,18 @@

      API module for Logger, the standard logging facility in Erlang/OTP.

      This module implements the main API for logging in Erlang/OTP. To create a log event, use the API functions or the log -macros, for example:

      ?LOG_ERROR("error happened because: ~p", [Reason]).   % With macro
      -logger:error("error happened because: ~p", [Reason]). % Without macro

      To configure the Logger backend, use +macros, for example:

      ?LOG_ERROR("error happened because: ~p", [Reason]).   % With macro
      +logger:error("error happened because: ~p", [Reason]). % Without macro

      To configure the Logger backend, use Kernel configuration parameters or configuration functions in the Logger API.

      By default, the Kernel application installs one log handler at system start. This handler is named default. It receives and processes standard log events produced by the Erlang runtime system, standard behaviours and different Erlang/OTP applications. The log events are by default printed to the terminal.

      If you want your systems logs to be printed to a file instead, you must configure the default handler to do so. The simplest way is to include the -following in your sys.config:

      [{kernel,
      -  [{logger,
      -    [{handler, default, logger_std_h,
      -      #{config => #{file => "path/to/file.log"}}}]}]}].

      For more information about:

      Equivalent to log(Level, FormatOrFun, Args, #{}) if called as log(Level, FormatOrFun, Args).

      @@ -2310,12 +2310,12 @@ useful in scenarios when the message/metadata is very expensive to compute. This is because the fun is only evaluated when the message/metadata is actually needed, which may be not at all if the log event is not to be logged. Examples:

      %% A plain string with expensive metadata
      -1> logger:info(fun([]) -> {"Hello World", #{ meta => expensive() }} end,[]).
      +1> logger:info(fun([]) -> {"Hello World", #{ meta => expensive() }} end,[]).
       %% An expensive report
      -2> logger:debug(fun(What) -> #{ what => What, cause => expensive() } end,roof).
      +2> logger:debug(fun(What) -> #{ what => What, cause => expensive() } end,roof).
       %% A plain string with expensive metadata and normal metadata
      -3> logger:debug(fun([]) -> {"Hello World", #{ meta => expensive() }} end,[],
      -               #{ meta => data }).

      When metadata is given both as an argument and returned from the fun they are +3> logger:debug(fun([]) -> {"Hello World", #{ meta => expensive() }} end,[], + #{ meta => data }).

      When metadata is given both as an argument and returned from the fun they are merged. If equal keys exists the values are taken from the metadata returned by the fun.

      @@ -2633,26 +2633,26 @@ consistent no matter which handler the system uses. Normal usage is to add a call to logger:add_handlers/1 just after the processes that the handler needs are started, and pass the application's logger configuration as the argument. -For example:

      -behaviour(application).
      -start(_, []) ->
      -    case supervisor:start_link({local, my_sup}, my_sup, []) of
      -        {ok, Pid} ->
      -            ok = logger:add_handlers(my_app),
      -            {ok, Pid, []};
      +For example:

      -behaviour(application).
      +start(_, []) ->
      +    case supervisor:start_link({local, my_sup}, my_sup, []) of
      +        {ok, Pid} ->
      +            ok = logger:add_handlers(my_app),
      +            {ok, Pid, []};
               Error -> Error
            end.

      This reads the logger configuration parameter from the my_app application and starts the configured handlers. The contents of the configuration use the same rules as the logger handler configuration.

      If the handler is meant to replace the default handler, the Kernel's default handler have to be disabled before the new handler is added. A sys.config file -that disables the Kernel handler and adds a custom handler could look like this:

      [{kernel,
      -  [{logger,
      +that disables the Kernel handler and adds a custom handler could look like this:

      [{kernel,
      +  [{logger,
           %% Disable the default Kernel handler
      -    [{handler, default, undefined}]}]},
      - {my_app,
      -  [{logger,
      +    [{handler, default, undefined}]}]},
      + {my_app,
      +  [{logger,
           %% Enable this handler as the default
      -    [{handler, default, my_handler, #{}}]}]}].
      +
      [{handler, default, my_handler, #{}}]}]}].
      @@ -3607,8 +3607,8 @@ -

      Update the formatter configuration for the specified handler.

      The new configuration is merged with the existing formatter configuration.

      To overwrite the existing configuration without any merge, use

      set_handler_config(HandlerId, formatter,
      -	      {FormatterModule, FormatterConfig}).
      +

      Update the formatter configuration for the specified handler.

      The new configuration is merged with the existing formatter configuration.

      To overwrite the existing configuration without any merge, use

      set_handler_config(HandlerId, formatter,
      +	      {FormatterModule, FormatterConfig}).
      @@ -3671,8 +3671,8 @@

      Update configuration data for the specified handler. This function behaves as if -it was implemented as follows:

      {ok, {_, Old}} = logger:get_handler_config(HandlerId),
      -logger:set_handler_config(HandlerId, maps:merge(Old, Config)).

      To overwrite the existing configuration without any merge, use +it was implemented as follows:

      {ok, {_, Old}} = logger:get_handler_config(HandlerId),
      +logger:set_handler_config(HandlerId, maps:merge(Old, Config)).

      To overwrite the existing configuration without any merge, use set_handler_config/2 .

      @@ -3765,8 +3765,8 @@

      Update primary configuration data for Logger. This function behaves as if it was -implemented as follows:

      Old = logger:get_primary_config(),
      -logger:set_primary_config(maps:merge(Old, Config)).

      To overwrite the existing configuration without any merge, use +implemented as follows:

      Old = logger:get_primary_config(),
      +logger:set_primary_config(maps:merge(Old, Config)).

      To overwrite the existing configuration without any merge, use set_primary_config/1 .

      @@ -3798,7 +3798,7 @@

      Set or update metadata to use when logging from current process

      If process metadata exists for the current process, this function behaves as if -it was implemented as follows:

      logger:set_process_metadata(maps:merge(logger:get_process_metadata(), Meta)).

      If no process metadata exists, the function behaves as +it was implemented as follows:

      logger:set_process_metadata(maps:merge(logger:get_process_metadata(), Meta)).

      If no process metadata exists, the function behaves as set_process_metadata/1 .

      @@ -3830,8 +3830,8 @@

      Update configuration data for the Logger proxy. This function behaves as if it -was implemented as follows:

      Old = logger:get_proxy_config(),
      -logger:set_proxy_config(maps:merge(Old, Config)).

      To overwrite the existing configuration without any merge, use +was implemented as follows:

      Old = logger:get_proxy_config(),
      +logger:set_proxy_config(maps:merge(Old, Config)).

      To overwrite the existing configuration without any merge, use set_proxy_config/1 .

      For more information about the proxy, see section Logger Proxy in the Kernel User's Guide.

      /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/logger_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/logger_chapter.xhtml 2025-05-10 20:19:10.513203186 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/logger_chapter.xhtml 2025-05-10 20:19:10.537203404 +0000 @@ -85,7 +85,7 @@

      The API for logging consists of a set of macros, and a set of functions on the form logger:Level/1,2,3, which are all shortcuts for logger:log(Level,Arg1[,Arg2[,Arg3]]).

      The macros are defined in logger.hrl, which is included in a module with the -directive

      -include_lib("kernel/include/logger.hrl").

      The difference between using the macros and the exported functions is that +directive

      -include_lib("kernel/include/logger.hrl").

      The difference between using the macros and the exported functions is that macros add location (originator) information to the metadata, and performs lazy evaluation by wrapping the logger call in a case statement, so it is only evaluated if the log level of the event passes the primary log level check.

      @@ -107,23 +107,23 @@

      The log message contains the information to be logged. The message can consist of a format string and arguments (given as two separate parameters in the Logger -API), a string or a report.

      Example, format string and arguments:

      logger:error("The file does not exist: ~ts",[Filename])

      Example, string:

      logger:notice("Something strange happened!")

      A report, which is either a map or a key-value list, is the preferred way to log +API), a string or a report.

      Example, format string and arguments:

      logger:error("The file does not exist: ~ts",[Filename])

      Example, string:

      logger:notice("Something strange happened!")

      A report, which is either a map or a key-value list, is the preferred way to log using Logger as it makes it possible for different backends to filter and format -the log event as it needs to.

      Example, report:

      ?LOG_ERROR(#{ user => joe, filename => Filename, reason => enoent })

      Reports can be accompanied by a report callback specified in the log event's +the log event as it needs to.

      Example, report:

      ?LOG_ERROR(#{ user => joe, filename => Filename, reason => enoent })

      Reports can be accompanied by a report callback specified in the log event's metadata. The report callback is a convenience function that the formatter can use to convert the report to a format string and arguments, or directly to a string. The formatter can also use its own conversion function, if no callback is provided, or if a customized formatting is desired.

      The report callback must be a fun with one or two arguments. If it takes one argument, this is the report itself, and the fun returns a format string and -arguments:

      fun((logger:report()) -> {io:format(),[term()]})

      If it takes two arguments, the first is the report, and the second is a map -containing extra data that allows direct conversion to a string:

      fun((logger:report(),logger:report_cb_config()) -> unicode:chardata())

      The fun must obey the depth and chars_limit parameters provided in the +arguments:

      fun((logger:report()) -> {io:format(),[term()]})

      If it takes two arguments, the first is the report, and the second is a map +containing extra data that allows direct conversion to a string:

      fun((logger:report(),logger:report_cb_config()) -> unicode:chardata())

      The fun must obey the depth and chars_limit parameters provided in the second argument, as the formatter cannot do anything useful of these parameters with the returned string. The extra data also contains a field named single_line, indicating if the printed log message may contain line breaks or not. This variant is used when the formatting of the report depends on the size -or single line parameters.

      Example, report, and metadata with report callback:

      logger:debug(#{got => connection_request, id => Id, state => State},
      -             #{report_cb => fun(R) -> {"~p",[R]} end})

      The log message can also be provided through a fun for lazy evaluation. The fun +or single line parameters.

      Example, report, and metadata with report callback:

      logger:debug(#{got => connection_request, id => Id, state => State},
      +             #{report_cb => fun(R) -> {"~p",[R]} end})

      The log message can also be provided through a fun for lazy evaluation. The fun is only evaluated if the primary log level check passes, and is therefore recommended if it is expensive to generate the message. The lazy fun must return a string, a report, or a tuple with format string and arguments.

      @@ -311,14 +311,14 @@ allows another application to add its own default handler.

      Only one entry of this type is allowed.

    • {handler, HandlerId, Module, HandlerConfig} - If HandlerId is default, then this entry modifies the default handler, equivalent to calling

              logger:remove_handler(default)
      -

      followed by

              logger:add_handler(default, Module, HandlerConfig)
      +

      followed by

              logger:add_handler(default, Module, HandlerConfig)
       

      For all other values of HandlerId, this entry adds a new handler, -equivalent to calling

              logger:add_handler(HandlerId, Module, HandlerConfig)
      +equivalent to calling

              logger:add_handler(HandlerId, Module, HandlerConfig)
       

      Multiple entries of this type are allowed.

    • {filters, FilterDefault, [Filter]} - Adds the specified primary -filters.

      • FilterDefault = log | stop

      • Filter = {FilterId, {FilterFun, FilterConfig}}

      Equivalent to calling

              logger:add_primary_filter(FilterId, {FilterFun, FilterConfig})
      +filters.

      • FilterDefault = log | stop

      • Filter = {FilterId, {FilterFun, FilterConfig}}

      Equivalent to calling

              logger:add_primary_filter(FilterId, {FilterFun, FilterConfig})
       

      for each Filter.

      FilterDefault specifies the behaviour if all primary filters return ignore, see section Filters.

      Only one entry of this type is allowed.

    • {module_level, Level, [Module]} - Sets module log level for the given -modules. Equivalent to calling

              logger:set_module_level(Module, Level)

      for each Module.

      Multiple entries of this type are allowed.

    • {proxy, ProxyConfig} - Sets the proxy configuration, equivalent to +modules. Equivalent to calling

              logger:set_module_level(Module, Level)

      for each Module.

      Multiple entries of this type are allowed.

    • {proxy, ProxyConfig} - Sets the proxy configuration, equivalent to calling

              logger:set_proxy_config(ProxyConfig)
       

      Only one entry of this type is allowed.

    See section Configuration Examples for examples using the logger parameter for system configuration.

  • logger_metadata = map() - Specifies the primary @@ -341,31 +341,31 @@ file. See the config(4) manual page for more information about this file.

    Each of the following examples shows a simple system configuration file that configures Logger according to the description.

    Modify the default handler to print to a file instead of -standard_io:

    [{kernel,
    -  [{logger,
    -    [{handler, default, logger_std_h,  % {handler, HandlerId, Module,
    -      #{config => #{file => "log/erlang.log"}}}  % Config}
    -    ]}]}].

    Modify the default handler to print each log event as a single line:

    [{kernel,
    -  [{logger,
    -    [{handler, default, logger_std_h,
    -      #{formatter => {logger_formatter, #{single_line => true}}}}
    -    ]}]}].

    Modify the default handler to print the pid of the logging process for each log -event:

    [{kernel,
    -  [{logger,
    -    [{handler, default, logger_std_h,
    -      #{formatter => {logger_formatter,
    -                        #{template => [time," ",pid," ",msg,"\n"]}}}}
    -    ]}]}].

    Modify the default handler to only print errors and more severe log events to +standard_io:

    [{kernel,
    +  [{logger,
    +    [{handler, default, logger_std_h,  % {handler, HandlerId, Module,
    +      #{config => #{file => "log/erlang.log"}}}  % Config}
    +    ]}]}].

    Modify the default handler to print each log event as a single line:

    [{kernel,
    +  [{logger,
    +    [{handler, default, logger_std_h,
    +      #{formatter => {logger_formatter, #{single_line => true}}}}
    +    ]}]}].

    Modify the default handler to print the pid of the logging process for each log +event:

    [{kernel,
    +  [{logger,
    +    [{handler, default, logger_std_h,
    +      #{formatter => {logger_formatter,
    +                        #{template => [time," ",pid," ",msg,"\n"]}}}}
    +    ]}]}].

    Modify the default handler to only print errors and more severe log events to "log/erlang.log", and add another handler to print all log events to -"log/debug.log".

    [{kernel,
    -  [{logger,
    -    [{handler, default, logger_std_h,
    -      #{level => error,
    -        config => #{file => "log/erlang.log"}}},
    -     {handler, info, logger_std_h,
    -      #{level => debug,
    -        config => #{file => "log/debug.log"}}}
    -    ]}]}].

    +"log/debug.log".

    [{kernel,
    +  [{logger,
    +    [{handler, default, logger_std_h,
    +      #{level => error,
    +        config => #{file => "log/erlang.log"}}},
    +     {handler, info, logger_std_h,
    +      #{level => debug,
    +        config => #{file => "log/debug.log"}}}
    +    ]}]}].

    @@ -406,9 +406,9 @@ This field can be used by filters to stop or allow the log events.

    See section SASL User's Guide for more information about the old SASL error logging functionality.

  • Legacy Event Handlers
    To use event handlers written for error_logger, just add your event handler with

    error_logger:add_report_handler/1,2.

    This automatically starts the error logger event manager, and adds -error_logger as a handler to Logger, with the following configuration:

    #{level => info,
    +error_logger as a handler to Logger, with the following configuration:

    #{level => info,
       filter_default => log,
    -  filters => []}.

    Note

    This handler ignores events that do not originate from the error_logger + filters => []}.

    Note

    This handler ignores events that do not originate from the error_logger API, or from within OTP. This means that if your code uses the Logger API for logging, then your log events will be discarded by this handler.

    The handler is not overload protected.

  • @@ -434,19 +434,19 @@ level notice or more severe, are logged to the terminal via the default handler. To also log info events, you can either change the primary log level to info:

    1> logger:set_primary_config(level, info).
    -ok

    or set the level for one or a few modules only:

    2> logger:set_module_level(mymodule, info).
    +ok

    or set the level for one or a few modules only:

    2> logger:set_module_level(mymodule, info).
     ok

    This allows info events to pass through to the default handler, and be printed to the terminal as well. If there are many info events, it can be useful to print these to a file instead.

    First, set the log level of the default handler to notice, preventing it from -printing info events to the terminal:

    3> logger:set_handler_config(default, level, notice).
    +printing info events to the terminal:

    3> logger:set_handler_config(default, level, notice).
     ok

    Then, add a new handler which prints to file. You can use the handler module -logger_std_h, and configure it to log to file:

    4> Config = #{config => #{file => "./info.log"}, level => info}.
    -#{config => #{file => "./info.log"},level => info}
    -5> logger:add_handler(myhandler, logger_std_h, Config).
    +logger_std_h, and configure it to log to file:

    4> Config = #{config => #{file => "./info.log"}, level => info}.
    +#{config => #{file => "./info.log"},level => info}
    +5> logger:add_handler(myhandler, logger_std_h, Config).
     ok

    Since filter_default defaults to log, this handler now receives all log events. If you want info events only in the file, you must add a filter to stop -all non-info events. The built-in filter logger_filters:level/2 can do this:

    6> logger:add_handler_filter(myhandler, stop_non_info,
    -                             {fun logger_filters:level/2, {stop, neq, info}}).
    +all non-info events. The built-in filter logger_filters:level/2 can do this:

    6> logger:add_handler_filter(myhandler, stop_non_info,
    +                             {fun logger_filters:level/2, {stop, neq, info}}).
     ok

    See section Filters for more information about the filters and the filter_default configuration parameter.

    @@ -471,48 +471,48 @@ database.

    When logger:get_config/0 or logger:get_handler_config/0,1 is called, Logger calls HModule:filter_config(Config). This function must return the -handler configuration where internal data is removed.

    A simple handler that prints to the terminal can be implemented as follows:

    -module(myhandler1).
    --export([log/2]).
    +handler configuration where internal data is removed.

    A simple handler that prints to the terminal can be implemented as follows:

    -module(myhandler1).
    +-export([log/2]).
     
    -log(LogEvent, #{formatter := {FModule, FConfig}}) ->
    -    io:put_chars(FModule:format(LogEvent, FConfig)).

    Notice that the above handler does not have any overload protection, and all log +log(LogEvent, #{formatter := {FModule, FConfig}}) -> + io:put_chars(FModule:format(LogEvent, FConfig)).

    Notice that the above handler does not have any overload protection, and all log events are printed directly from the client process.

    For information and examples of overload protection, please refer to section Protecting the Handler from Overload, and the implementation of logger_std_h and logger_disk_log_h .

    The following is a simpler example of a handler which logs to a file through one -single process:

    -module(myhandler2).
    --export([adding_handler/1, removing_handler/1, log/2]).
    --export([init/1, handle_call/3, handle_cast/2, terminate/2]).
    +single process:

    -module(myhandler2).
    +-export([adding_handler/1, removing_handler/1, log/2]).
    +-export([init/1, handle_call/3, handle_cast/2, terminate/2]).
     
    -adding_handler(Config) ->
    -    MyConfig = maps:get(config,Config,#{file => "myhandler2.log"}),
    -    {ok, Pid} = gen_server:start(?MODULE, MyConfig, []),
    -    {ok, Config#{config => MyConfig#{pid => Pid}}}.
    +adding_handler(Config) ->
    +    MyConfig = maps:get(config,Config,#{file => "myhandler2.log"}),
    +    {ok, Pid} = gen_server:start(?MODULE, MyConfig, []),
    +    {ok, Config#{config => MyConfig#{pid => Pid}}}.
     
    -removing_handler(#{config := #{pid := Pid}}) ->
    -    gen_server:stop(Pid).
    +removing_handler(#{config := #{pid := Pid}}) ->
    +    gen_server:stop(Pid).
     
    -log(LogEvent,#{config := #{pid := Pid}} = Config) ->
    -    gen_server:cast(Pid, {log, LogEvent, Config}).
    +log(LogEvent,#{config := #{pid := Pid}} = Config) ->
    +    gen_server:cast(Pid, {log, LogEvent, Config}).
     
    -init(#{file := File}) ->
    -    {ok, Fd} = file:open(File, [append, {encoding, utf8}]),
    /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/logger_cookbook.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/logger_cookbook.xhtml	2025-05-10 20:19:10.513203186 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/logger_cookbook.xhtml	2025-05-10 20:19:10.537203404 +0000
    @@ -39,19 +39,19 @@
       
       Print the primary Logger configurations.
     

    -
    1> logger:i(primary).
    +
    1> logger:i(primary).
     Primary configuration:
         Level: notice
         Filter Default: log
         Filters:
    -        (none)

    It is also possible to fetch the configuration using + (none)

    It is also possible to fetch the configuration using logger:get_primary_config().

    See also

    -
    2> logger:i(handlers).
    +
    2> logger:i(handlers).
     Handler configuration:
         Id: default
             Module: logger_std_h
    @@ -68,10 +68,10 @@
                     Arg: stop
                 Id: domain
                     Fun: fun logger_filters:domain/2
    -                Arg: {log,super,[otp,sasl]}
    +                Arg: {log,super,[otp,sasl]}
                 Id: no_domain
                     Fun: fun logger_filters:domain/2
    -                Arg: {log,undefined,[]}
    +                Arg: {log,undefined,[]}
             Handler Config:
                 burst_limit_enable: true
                 burst_limit_max_count: 500
    @@ -110,7 +110,7 @@
     =PROGRESS REPORT==== 4-Nov-2019::16:33:11.746546 ===
         application: stdlib
         started_at: nonode@nohost
    -Eshell V10.5.3  (abort with ^G)
    +Eshell V10.5.3  (abort with ^G)
     1>

    @@ -128,17 +128,17 @@

    Since single line logging is the default of the built-in formatter you only have to provide the empty map as the configuration. The example below uses the sys.config to change the formatter configuration.

    $ cat sys.config
    -[{kernel,
    -  [{logger,
    -    [{handler, default, logger_std_h,
    -      #{ formatter => {logger_formatter, #{ }}}}]}]}].
    +[{kernel,
    +  [{logger,
    +    [{handler, default, logger_std_h,
    +      #{ formatter => {logger_formatter, #{ }}}}]}]}].
     $ erl -config sys
    -Eshell V10.5.1  (abort with ^G)
    -1> logger:error("Oh noes, an error").
    +Eshell V10.5.1  (abort with ^G)
    +1> logger:error("Oh noes, an error").
     1962-10-03T11:07:47.466763-04:00 error: Oh noes, an error

    However, if you just want to change it for the current session you can also do -that.

    1> logger:set_handler_config(default, formatter, {logger_formatter, #{}}).
    +that.

    1> logger:set_handler_config(default, formatter, {logger_formatter, #{}}).
     ok
    -2> logger:error("Oh noes, another error").
    +2> logger:error("Oh noes, another error").
     1962-10-04T15:34:02.648713-04:00 error: Oh noes, another error

    See also

    @@ -146,14 +146,14 @@ Add file and line number to log entries

    You can change what is printed to the log by using the formatter template:

    $ cat sys.config
    -[{kernel,
    -  [{logger,
    -    [{handler, default, logger_std_h,
    -      #{ formatter => {logger_formatter,
    -        #{ template => [time," ", file,":",line," ",level,": ",msg,"\n"] }}}}]}]}].
    +[{kernel,
    +  [{logger,
    +    [{handler, default, logger_std_h,
    +      #{ formatter => {logger_formatter,
    +        #{ template => [time," ", file,":",line," ",level,": ",msg,"\n"] }}}}]}]}].
     $ erl -config sys
    -Eshell V10.5.1  (abort with ^G)
    -1> logger:error("Oh noes, more errors",#{ file => "shell.erl", line => 1 }).
    +Eshell V10.5.1  (abort with ^G)
    +1> logger:error("Oh noes, more errors",#{ file => "shell.erl", line => 1 }).
     1962-10-05T07:37:44.104241+02:00 shell.erl:1 error: Oh noes, more errors

    Note that file and line have to be added in the metadata by the caller of logger:log/3 as otherwise Logger will not know from where it was called. The file and line number are automatically added if you use the ?LOG_ERROR macros @@ -170,18 +170,18 @@ Print logs to a file

    Instead of printing the logs to stdout we print them to a rotating file log.

    $ cat sys.config
    -[{kernel,
    -  [{logger,
    -    [{handler, default, logger_std_h,
    -      #{ config => #{ file => "log/erlang.log",
    +[{kernel,
    +  [{logger,
    +    [{handler, default, logger_std_h,
    +      #{ config => #{ file => "log/erlang.log",
                           max_no_bytes => 4096,
    -                      max_no_files => 5},
    -         formatter => {logger_formatter, #{}}}}]}]}].
    +                      max_no_files => 5},
    +         formatter => {logger_formatter, #{}}}}]}]}].
     $ erl -config sys
    -Eshell V10.5.1  (abort with ^G)
    -1> logger:error("Oh noes, even more errors").
    +Eshell V10.5.1  (abort with ^G)
    +1> logger:error("Oh noes, even more errors").
     ok
    -2> erlang:halt().
    +2> erlang:halt().
     $ cat log/erlang.log
     2019-10-07T11:47:16.837958+02:00 error: Oh noes, even more errors

    See also

    @@ -191,24 +191,24 @@

    Add a handler that prints debug log events to a file, while the default handler prints only up to notice level events to standard out.

    $ cat sys.config
    -[{kernel,
    -  [{logger_level, all},
    -   {logger,
    -    [{handler, default, logger_std_h,
    -      #{ level => notice }},
    -     {handler, debug, logger_std_h,
    -      #{ filters => [{debug,{fun logger_filters:level/2, {stop, neq, debug}}}],
    -         config => #{ file => "log/debug.log" } }}
    -    ]}]}].
    +[{kernel,
    +  [{logger_level, all},
    +   {logger,
    +    [{handler, default, logger_std_h,
    +      #{ level => notice }},
    +     {handler, debug, logger_std_h,
    +      #{ filters => [{debug,{fun logger_filters:level/2, {stop, neq, debug}}}],
    +         config => #{ file => "log/debug.log" } }}
    +    ]}]}].
     $ erl -config sys
    -Eshell V10.5.1  (abort with ^G)
    -1> logger:error("Oh noes, even more errors").
    +Eshell V10.5.1  (abort with ^G)
    +1> logger:error("Oh noes, even more errors").
     =ERROR REPORT==== 9-Oct-2019::14:40:54.784162 ===
     Oh noes, even more errors
     ok
    -2> logger:debug("A debug event").
    +2> logger:debug("A debug event").
     ok
    -3> erlang:halt().
    +3> erlang:halt().
     $ cat log/debug.log
     2019-10-09T14:41:03.680541+02:00 debug: A debug event

    In the configuration above we first raise the primary log level to max in order for the debug log events to get to the handlers. Then we configure the default @@ -216,13 +216,13 @@ is all. Then the debug handler is configured with a filter to stop any log message that is not a debug level message.

    It is also possible to do the same changes in an already running system using the logger module. Then you do like this:

    $ erl
    -1> logger:set_handler_config(default, level, notice).
    +1> logger:set_handler_config(default, level, notice).
     ok
    -2> logger:add_handler(debug, logger_std_h, #{
    -  filters => [{debug,{fun logger_filters:level/2, {stop, neq, debug}}}],
    -  config => #{ file => "log/debug.log" } }).
    +2> logger:add_handler(debug, logger_std_h, #{
    +  filters => [{debug,{fun logger_filters:level/2, {stop, neq, debug}}}],
    +  config => #{ file => "log/debug.log" } }).
     ok
    -3> logger:set_primary_config(level, all).
    +3> logger:set_primary_config(level, all).
     ok

    It is important that you do not raise the primary log level before adjusting the default handler's level as otherwise your standard out may be flooded by debug log messages.

    See also

    @@ -238,7 +238,7 @@ What to log and how

    The simplest way to log something is by using the Logger macros and give a -report to the macro. For example if you want to log an error:

    ?LOG_ERROR(#{ what => http_error, status => 418, src => ClientIP, dst => ServerIP }).

    This will print the following in the default log:

    =ERROR REPORT==== 10-Oct-2019::12:13:10.089073 ===
    +report to the macro. For example if you want to log an error:

    ?LOG_ERROR(#{ what => http_error, status => 418, src => ClientIP, dst => ServerIP }).

    This will print the following in the default log:

    =ERROR REPORT==== 10-Oct-2019::12:13:10.089073 ===
         dst: {8,8,4,4}
         src: {8,8,8,8}
         status: 418
    @@ -250,14 +250,14 @@
     

    If you want to do structured logging, but still want to have some control of how the final log message is formatted you can give a report_cb as part of the -metadata with your log event.

    Load the dyntrace module.

    1> l(dyntrace).
    +{module,dyntrace}

    All tracepoints via dyntrace are now visible and can be listed through lttng list -u.

    Enable the process_register LTTng tracepoint for Erlang.

    $ lttng enable-event -u org_erlang_dyntrace:process_register
    -UST event org_erlang_dyntrace:process_register created in channel channel0

    Enable process tracing for new processes and use dyntrace as tracer backend.

    2> erlang:trace(new,true,[procs,{tracer,dyntrace,[]}]).
    +UST event org_erlang_dyntrace:process_register created in channel channel0

    Enable process tracing for new processes and use dyntrace as tracer backend.

    2> erlang:trace(new,true,[procs,{tracer,dyntrace,[]}]).
     0

    Start LTTng tracing.

    $ lttng start
     Tracing started for session erlang-demo

    Start the os_mon application in Erlang.

    3> application:ensure_all_started(os_mon).
     {ok,[sasl,os_mon]}

    Stop LTTng tracing and view the result.

    $ lttng stop
    @@ -275,7 +275,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/msacc.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/msacc.html 2025-05-10 20:19:16.113253956 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/msacc.html 2025-05-10 20:19:16.125254065 +0000 @@ -131,9 +131,9 @@

    Convenience functions for microstate accounting

    This module implements some convenience functions for analyzing microstate accounting data. For details about how to use the basic API and what the different states represent, see -erlang:statistics(microstate_accounting).

    Basic Scenario

    1> msacc:start(1000).
    +erlang:statistics(microstate_accounting).

    Basic Scenario

    1> msacc:start(1000).
     ok
    -2> msacc:print().
    +2> msacc:print().
     Average thread real-time    : 1000513 us
     Accumulated system run-time :    2213 us
     Average scheduler run-time  :    1076 us
    @@ -141,11 +141,11 @@
             Thread      aux check_io emulator       gc    other     port    sleep
     
     Stats per thread:
    -     async( 0)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    -     async( 1)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    -       aux( 1)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%   99.99%
    - scheduler( 1)    0.00%    0.03%    0.13%    0.00%    0.01%    0.00%   99.82%
    - scheduler( 2)    0.00%    0.00%    0.00%    0.00%    0.03%    0.00%   99.97%
    +     async( 0)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    +     async( 1)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    +       aux( 1)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%   99.99%
    + scheduler( 1)    0.00%    0.03%    0.13%    0.00%    0.01%    0.00%   99.82%
    + scheduler( 2)    0.00%    0.00%    0.00%    0.00%    0.03%    0.00%   99.97%
     
     Stats per type:
              async    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    @@ -945,7 +945,7 @@
     this can be verbose. See the top of this reference manual for a brief
     description of what the fields mean.

    It is possible to print more specific types of statistics by first manipulating the DataOrStats using stats/2. For instance if you want to print the -percentage of run-time for each thread you can do:

    msacc:print(msacc:stats(runtime, msacc:stats())).

    If you want to only print run-time per thread type you can do:

    msacc:print(msacc:stats(type, msacc:stats(runtime, msacc:stats()))).

    Options

    • system - Print percentage of time spent in each state out of system time +percentage of run-time for each thread you can do:

      msacc:print(msacc:stats(runtime, msacc:stats())).

      If you want to only print run-time per thread type you can do:

      msacc:print(msacc:stats(type, msacc:stats(runtime, msacc:stats()))).

      Options

      • system - Print percentage of time spent in each state out of system time as well as thread time. Default: false.
      @@ -1236,7 +1236,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/notes.html 2025-05-10 20:19:16.157254355 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/notes.html 2025-05-10 20:19:16.165254428 +0000 @@ -1279,7 +1279,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub/OEBPS/content.opf 2025-05-10 20:19:16.197254718 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub/OEBPS/content.opf 2025-05-10 20:19:16.201254754 +0000 @@ -4,10 +4,10 @@ version="3.0"> runtime_tools - 2.1.1 - urn:uuid:9e193957-b1a7-2dfd-f081-b8d16f6a4c3c + urn:uuid:7e9dcc32-bd10-fc13-b353-2091526c7a17 en - 2025-05-10T20:10:32Z + 2041-06-12T09:30:44Z /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub/OEBPS/dbg.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub/OEBPS/dbg.xhtml 2025-05-10 20:19:16.197254718 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub/OEBPS/dbg.xhtml 2025-05-10 20:19:16.201254754 +0000 @@ -26,16 +26,16 @@

      The Text Based Trace Facility

      This module implements a text based interface to the trace:process/4, trace:port/4, and trace:function/4 BIFs, simplifying tracing of functions, processes, ports, and messages.

      To quickly get started on tracing function calls you can use the -following code in the Erlang shell:

      1> dbg:tracer().  % Start the default trace message receiver
      -{ok,<0.90.0>}
      -2> dbg:p(all, c). % Set upp call tracing on all processes
      -{ok,[{matched,nonode@nohost,49}]}
      -3> dbg:tp(lists, seq, cx). %  Set up call and exception tracing on lists:seq/2,3
      -{ok,[{matched,nonode@nohost,2},{saved,cx}]}
      -4> lists:seq(1, 10).
      -(<0.88.0>) call lists:seq(1,10) ({erl_eval,do_apply,7,{"erl_eval.erl",904}})
      -[1,2,3,4,5,6,7,8,9,10]
      -(<0.88.0>) returned from lists:seq/2 -> [1,2,3,4,5,6,7,8,9,10]

      The utilities are also suitable to use in system testing on large systems, where +following code in the Erlang shell:

      1> dbg:tracer().  % Start the default trace message receiver
      +{ok,<0.90.0>}
      +2> dbg:p(all, c). % Set upp call tracing on all processes
      +{ok,[{matched,nonode@nohost,49}]}
      +3> dbg:tp(lists, seq, cx). %  Set up call and exception tracing on lists:seq/2,3
      +{ok,[{matched,nonode@nohost,2},{saved,cx}]}
      +4> lists:seq(1, 10).
      +(<0.88.0>) call lists:seq(1,10) ({erl_eval,do_apply,7,{"erl_eval.erl",904}})
      +[1,2,3,4,5,6,7,8,9,10]
      +(<0.88.0>) returned from lists:seq/2 -> [1,2,3,4,5,6,7,8,9,10]

      The utilities are also suitable to use in system testing on large systems, where other tools have too severe impact on the system performance. Some primitive support for sequential tracing is also included; see the advanced topics section.

      @@ -47,36 +47,36 @@

      To trace a call to a function with minimal fuss, call dbg:c(Module, Name, Arguments). dbg:c/3 starts a temporary trace receiver, enables all trace flags, and calls the designated function from a temporary process. For example, here is how to trace a call -to application:which_applications/0:

      1> dbg:c(application, which_applications, []).
      -(<0.92.0>) <0.45.0> ! {'$gen_call',{<0.92.0>,
      -                                    [alias|
      -                                     #Ref<0.0.11779.270031856.1478295555.230456>]},
      -                                   which_applications} (Timestamp: {1710,
      +to application:which_applications/0:

      1> dbg:c(application, which_applications, []).
      +(<0.92.0>) <0.45.0> ! {'$gen_call',{<0.92.0>,
      +                                    [alias|
      +                                     #Ref<0.0.11779.270031856.1478295555.230456>]},
      +                                   which_applications} (Timestamp: {1710,
                                                                           847802,
      -                                                                    479222})
      -(<0.92.0>) out {gen,do_call,4} (Timestamp: {1710,847802,479231})
      -(<0.92.0>) in {gen,do_call,4} (Timestamp: {1710,847802,479271})
      -(<0.92.0>) << {[alias|#Ref<0.0.11779.270031856.1478295555.230456>],
      -               [{stdlib,"ERTS  CXC 138 10","5.2.1"},
      -                {kernel,"ERTS  CXC 138 10","9.2.2"}]} (Timestamp: {1710,
      +                                                                    479222})
      +(<0.92.0>) out {gen,do_call,4} (Timestamp: {1710,847802,479231})
      +(<0.92.0>) in {gen,do_call,4} (Timestamp: {1710,847802,479271})
      +(<0.92.0>) << {[alias|#Ref<0.0.11779.270031856.1478295555.230456>],
      +               [{stdlib,"ERTS  CXC 138 10","5.2.1"},
      +                {kernel,"ERTS  CXC 138 10","9.2.2"}]} (Timestamp: {1710,
                                                                          847802,
      -                                                                   479274})
      -[{stdlib,"ERTS  CXC 138 10","5.2.1"},
      - {kernel,"ERTS  CXC 138 10","9.2.2"}]

      Four trace events are generated:

      • A send event (!) for the sending of a request from the current process + 479274}) +[{stdlib,"ERTS CXC 138 10","5.2.1"}, + {kernel,"ERTS CXC 138 10","9.2.2"}]

      Four trace events are generated:

      • A send event (!) for the sending of a request from the current process to the application_controller process.
      • A schedule-out event (out) when the current process schedules out while waiting in a receive for the reply to arrive.
      • A schedule-in event (in) when the current process is scheduled in when reply has arrived.
      • A receive event (<<) when the current process retrieves the reply from the application_controller process.

      The dbg:c/4 function has a fourth argument for specifying the trace flags. -Here is how to only show message sending and receiving:

      2> dbg:c(application, which_applications, [], m).
      -(<0.96.0>) <0.45.0> ! {'$gen_call',{<0.96.0>,
      -                                    [alias|
      -                                     #Ref<0.0.12291.270031856.1478295555.230496>]},
      -                                   which_applications}
      -(<0.96.0>) << {[alias|#Ref<0.0.12291.270031856.1478295555.230496>],
      -               [{stdlib,"ERTS  CXC 138 10","5.2.1"},
      -                {kernel,"ERTS  CXC 138 10","9.2.2"}]}
      -[{stdlib,"ERTS  CXC 138 10","5.2.1"},
      - {kernel,"ERTS  CXC 138 10","9.2.2"}]

      +Here is how to only show message sending and receiving:

      2> dbg:c(application, which_applications, [], m).
      +(<0.96.0>) <0.45.0> ! {'$gen_call',{<0.96.0>,
      +                                    [alias|
      +                                     #Ref<0.0.12291.270031856.1478295555.230496>]},
      +                                   which_applications}
      +(<0.96.0>) << {[alias|#Ref<0.0.12291.270031856.1478295555.230496>],
      +               [{stdlib,"ERTS  CXC 138 10","5.2.1"},
      +                {kernel,"ERTS  CXC 138 10","9.2.2"}]}
      +[{stdlib,"ERTS  CXC 138 10","5.2.1"},
      + {kernel,"ERTS  CXC 138 10","9.2.2"}]

      @@ -84,35 +84,35 @@

      Another way of tracing from the shell is to explicitly start a tracer and set the trace flags of your choice on the processes you want to trace. -For example, here is how to trace messages and process events:

      1> Pid = spawn(fun() -> receive {From,Msg} -> From ! Msg end end).
      +For example, here is how to trace messages and process events:

      1> Pid = spawn(fun() -> receive {From,Msg} -> From ! Msg end end).
       <0.90.0>
      -2> dbg:tracer().
      -{ok,<0.92.0>}
      -3> dbg:p(Pid, [m,procs]).
      -{ok,[{matched,nonode@nohost,1}]}
      -4> Pid ! {self(),hello}.
      -(<0.90.0>) << {<0.88.0>,hello}
      -{<0.88.0>,hello}
      -(<0.90.0>) <0.88.0> ! hello
      -(<0.90.0>) exit normal
      -5> flush().
      +2> dbg:tracer().
      +{ok,<0.92.0>}
      +3> dbg:p(Pid, [m,procs]).
      +{ok,[{matched,nonode@nohost,1}]}
      +4> Pid ! {self(),hello}.
      +(<0.90.0>) << {<0.88.0>,hello}
      +{<0.88.0>,hello}
      +(<0.90.0>) <0.88.0> ! hello
      +(<0.90.0>) exit normal
      +5> flush().
       Shell got hello
       ok

      In order to trace functions call, in addition to enabling the call trace flag for the process, it is also necessary to set a trace pattern for the functions -to trace.

      Example:

      1> dbg:tracer().
      -{ok,<0.90.0>}
      -2> dbg:p(all, call).
      -{ok,[{matched,nonode@nohost,49}]}
      -3> dbg:tp(lists, last, 1, []).
      -{ok,[{matched,nonode@nohost,1}]}
      -4> lists:last([a,b,c,d,e]).
      -(<0.88.0>) call lists:last([a,b,c,d,e])
      +to trace.

      Example:

      1> dbg:tracer().
      +{ok,<0.90.0>}
      +2> dbg:p(all, call).
      +{ok,[{matched,nonode@nohost,49}]}
      +3> dbg:tp(lists, last, 1, []).
      +{ok,[{matched,nonode@nohost,1}]}
      +4> lists:last([a,b,c,d,e]).
      +(<0.88.0>) call lists:last([a,b,c,d,e])
       e
      -5> dbg:tp(lists, last, 1, [{'_',[],[{return_trace}]}]).
      -{ok,[{matched,nonode@nohost,1},{saved,1}]}
      -6> lists:last([a,b,c,d,e]).
      -(<0.88.0>) call lists:last([a,b,c,d,e])
      -(<0.88.0>) returned from lists:last/1 -> e
      +5> dbg:tp(lists, last, 1, [{'_',[],[{return_trace}]}]).
      +{ok,[{matched,nonode@nohost,1},{saved,1}]}
      +6> lists:last([a,b,c,d,e]).
      +(<0.88.0>) call lists:last([a,b,c,d,e])
      +(<0.88.0>) returned from lists:last/1 -> e
       e

      @@ -126,21 +126,21 @@ seq_trace and the same tracer function for both types of tracing can be used. The seq_trace messages can also be sent to a trace port for further analysis.

      As a match specification can turn on sequential tracing, the combination of dbg and seq_trace can be powerful. This brief example shows a session -where sequential tracing is used to trace the dbg module and the trace itself:

      1> dbg:tracer().
      -{ok,<0.30.0>}
      -2> {ok, Tracer} = dbg:get_tracer().
      -{ok,<0.31.0>}
      -3> seq_trace:set_system_tracer(Tracer).
      +where sequential tracing is used to trace the dbg module and the trace itself:

      1> dbg:tracer().
      +{ok,<0.30.0>}
      +2> {ok, Tracer} = dbg:get_tracer().
      +{ok,<0.31.0>}
      +3> seq_trace:set_system_tracer(Tracer).
       false
      -4> dbg:tp(dbg, get_tracer, 0, [{[],[],[{set_seq_token, send, true}]}]).
      -{ok,[{matched,nonode@nohost,1},{saved,1}]}
      -5> dbg:p(all,call).
      -{ok,[{matched,nonode@nohost,22}]}
      -6> dbg:get_tracer(), seq_trace:set_token([]).
      -(<0.25.0>) call dbg:get_tracer()
      -SeqTrace [0]: (<0.25.0>) <0.30.0> ! {<0.25.0>,get_tracer} [Serial: {2,4}]
      -SeqTrace [0]: (<0.30.0>) <0.25.0> ! {dbg,{ok,<0.31.0>}} [Serial: {4,5}]
      -{1,0,5,<0.30.0>,4}

      This session sets the system_tracer to the same process as the +4> dbg:tp(dbg, get_tracer, 0, [{[],[],[{set_seq_token, send, true}]}]). +{ok,[{matched,nonode@nohost,1},{saved,1}]} +5> dbg:p(all,call). +{ok,[{matched,nonode@nohost,22}]} +6> dbg:get_tracer(), seq_trace:set_token([]). +(<0.25.0>) call dbg:get_tracer() +SeqTrace [0]: (<0.25.0>) <0.30.0> ! {<0.25.0>,get_tracer} [Serial: {2,4}] +SeqTrace [0]: (<0.30.0>) <0.25.0> ! {dbg,{ok,<0.31.0>}} [Serial: {4,5}] +{1,0,5,<0.30.0>,4}

      This session sets the system_tracer to the same process as the ordinary tracer process (i. e. <0.31.0>) and sets the trace pattern for the function dbg:get_tracer to one that has the action of setting a sequential token. When the function is called by a traced @@ -162,20 +162,20 @@ trace handler prints to the tty using an io function such as format/2. Note that when dbg:p(all, call) is called, IO processes are also traced. Here is an example:

      %% Using a default line editing shell
      -1> dbg:tracer(process, {fun(Msg,_) -> io:format("~p~n", [Msg]), 0 end, 0}).
      -{ok,<0.37.0>}
      -2> dbg:p(all, [call]).
      -{ok,[{matched,nonode@nohost,25}]}
      -3> dbg:tp(mymod,[{'_',[],[]}]).
      -{ok,[{matched,nonode@nohost,0},{saved,1}]}
      +1> dbg:tracer(process, {fun(Msg,_) -> io:format("~p~n", [Msg]), 0 end, 0}).
      +{ok,<0.37.0>}
      +2> dbg:p(all, [call]).
      +{ok,[{matched,nonode@nohost,25}]}
      /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub/OEBPS/dyntrace.xhtml differs (HTML document, ASCII text, with very long lines)
      --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub/OEBPS/dyntrace.xhtml	2025-05-10 20:19:16.193254681 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub/OEBPS/dyntrace.xhtml	2025-05-10 20:19:16.197254718 +0000
      @@ -736,14 +736,14 @@
       

      Restores the previous state of user tags and their spreading as it was before a call to spread_tag/1.

      Note that the restoring is not limited to the same process; one can utilize this to turn off spreding in one process and restore it in a -newly created process that is is actually going to send messages:

      f() ->
      -    TagData = dyntrace:spread_tag(false),
      -    spawn(fun() ->
      -             dyntrace:restore_tag(TagData),
      -             do_something()
      -          end),
      -    do_something_else(),
      -    dyntrace:restore_tag(TagData).

      Correctly handling user tags and their spreading might take some effort, as +newly created process that is is actually going to send messages:

      f() ->
      +    TagData = dyntrace:spread_tag(false),
      +    spawn(fun() ->
      +             dyntrace:restore_tag(TagData),
      +             do_something()
      +          end),
      +    do_something_else(),
      +    dyntrace:restore_tag(TagData).

      Correctly handling user tags and their spreading might take some effort, as Erlang programs tend to send and receive messages so that sometimes the user tag gets lost due to various things, like double receives or communication with a port (ports do not handle user tags, in the same way as they do not handle @@ -790,12 +790,12 @@ later call to restore_tag/1.

      The file module already spreads tags, so there is no need to manually call this function to get user tags spread to the efile driver through that module.

      The most use of this function would be if one, for example, uses the io module to communicate with an I/O-server for a regular file, such as in the following -example:

      f() ->
      -   {ok, F} = file:open("test.tst", [write]),
      -   Saved = dyntrace:spread_tag(true),
      -   io:format(F, "Hello world!", []),
      -   dyntrace:restore_tag(Saved),
      -   file:close(F).

      In this example, any user tag set in the calling process will be spread to the +example:

      f() ->
      +   {ok, F} = file:open("test.tst", [write]),
      +   Saved = dyntrace:spread_tag(true),
      +   io:format(F, "Hello world!", []),
      +   dyntrace:restore_tag(Saved),
      +   file:close(F).

      In this example, any user tag set in the calling process will be spread to the I/O-server when the io:format/3 call is done.

      /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub/OEBPS/instrument.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub/OEBPS/instrument.xhtml 2025-05-10 20:19:16.193254681 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub/OEBPS/instrument.xhtml 2025-05-10 20:19:16.197254718 +0000 @@ -239,8 +239,8 @@ the one before it.

      The upper bound of the first interval is provided by the function that returned the histogram, and the last interval has no upper bound.

      For example, the histogram below has 40 (message) blocks between 128-256 bytes in size, 78 blocks between 256-512 bytes,2 blocks between 512-1024 bytes, and 2 -blocks between 1-2KB.

      > instrument:allocations(#{ histogram_start => 128, histogram_width => 15 }).
      -{ok, {128, 0, #{ message => {0,40,78,2,2,0,0,0,0,0,0,0,0,0,0}, ... } }}
      +blocks between 1-2KB.

      > instrument:allocations(#{ histogram_start => 128, histogram_width => 15 }).
      +{ok, {128, 0, #{ message => {0,40,78,2,2,0,0,0,0,0,0,0,0,0,0}, ... } }}
      @@ -375,30 +375,30 @@ block size histograms. Defaults to 128.

    • histogram_width - The number of intervals in the allocated block size histograms. Defaults to 18.

    • flags - Controls how to group the output, for example showing allocations on a per-process basis (when possible) rather than only a -NIF/driver-basis. Defaults to [].

    Example:

    > instrument:allocations(#{ histogram_start => 128, histogram_width => 15 }).
    -{ok,{128,0,
    -     #{udp_inet =>
    -           #{driver_event_state => {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}},
    +NIF/driver-basis. Defaults to [].

    Example:

    > instrument:allocations(#{ histogram_start => 128, histogram_width => 15 }).
    +{ok,{128,0,
    +     #{udp_inet =>
    +           #{driver_event_state => {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}},
            system =>
    -           #{heap => {0,0,0,0,20,4,2,2,2,3,0,1,0,0,1},
    -             db_term => {271,3,1,52,80,1,0,0,0,0,0,0,0,0,0},
    -             code => {0,0,0,5,3,6,11,22,19,20,10,2,1,0,0},
    -             binary => {18,0,0,0,7,0,0,1,0,0,0,0,0,0,0},
    -             message => {0,40,78,2,2,0,0,0,0,0,0,0,0,0,0},
    -             ... }
    +           #{heap => {0,0,0,0,20,4,2,2,2,3,0,1,0,0,1},
    +             db_term => {271,3,1,52,80,1,0,0,0,0,0,0,0,0,0},
    +             code => {0,0,0,5,3,6,11,22,19,20,10,2,1,0,0},
    +             binary => {18,0,0,0,7,0,0,1,0,0,0,0,0,0,0},
    +             message => {0,40,78,2,2,0,0,0,0,0,0,0,0,0,0},
    +             ... }
            spawn_forker =>
    -           #{driver_select_data_state =>
    -                 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}},
    -       ram_file_drv => #{drv_binary => {0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}},
    +           #{driver_select_data_state =>
    +                 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}},
    +       ram_file_drv => #{drv_binary => {0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}},
            prim_file =>
    -           #{process_specific_data => {2,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    -             nif_trap_export_entry => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0},
    -             monitor_extended => {0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
    -             drv_binary => {0,0,0,0,0,0,1,0,3,5,0,0,0,1,0},
    -             binary => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}},
    +           #{process_specific_data => {2,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    +             nif_trap_export_entry => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0},
    +             monitor_extended => {0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
    +             drv_binary => {0,0,0,0,0,0,1,0,3,5,0,0,0,1,0},
    +             binary => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}},
            prim_buffer =>
    -           #{nif_internal => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0},
    -             binary => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}}}}}
    +
    #{nif_internal => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}, + binary => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}}}}}
    @@ -475,15 +475,15 @@ tied to any particular scheduler. Defaults to all schedulers and the global instance.

  • histogram_start - The upper bound of the first interval in the free block size histograms. Defaults to 512.

  • histogram_width - The number of intervals in the free block size -histograms. Defaults to 14.

  • Example:

    > instrument:carriers(#{ histogram_start => 512, histogram_width => 8 }).
    -{ok,{512,
    -     [{driver_alloc,false,262144,0,
    -                    [{driver_alloc,1,32784}],
    -                    {0,0,0,0,0,0,0,1}},
    -      {binary_alloc,false,32768,0,
    -                    [{binary_alloc,15,4304}],
    -                    {3,0,0,0,1,0,0,0}},
    -      {...}|...]}}
    +histograms. Defaults to 14.

    Example:

    > instrument:carriers(#{ histogram_start => 512, histogram_width => 8 }).
    +{ok,{512,
    +     [{driver_alloc,false,262144,0,
    +                    [{driver_alloc,1,32784}],
    +                    {0,0,0,0,0,0,0,1}},
    +      {binary_alloc,false,32768,0,
    +                    [{binary_alloc,15,4304}],
    +                    {3,0,0,0,1,0,0,0}},
    +      {...}|...]}}
    /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub/OEBPS/lttng.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub/OEBPS/lttng.xhtml 2025-05-10 20:19:16.193254681 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub/OEBPS/lttng.xhtml 2025-05-10 20:19:16.197254718 +0000 @@ -45,42 +45,42 @@ Dyntrace Tracepoints

    All tracepoints are in the domain of org_erlang_dyntrace

    All Erlang types are the string equivalent in LTTng.

    process_spawn

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • parent : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"

    Available through erlang:trace/3 with trace flag procs and -{tracer,dyntrace,[]} as tracer module.

    Example:

    process_spawn: { cpu_id = 3 }, { pid = "<0.131.0>", parent = "<0.130.0>", entry = "erlang:apply/2" }

    process_link

    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • from : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • type : string :: "link" | "unlink"

    Available through erlang:trace/3 with trace flag procs and +{tracer,dyntrace,[]} as tracer module.

    Example:

    process_spawn: { cpu_id = 3 }, { pid = "<0.131.0>", parent = "<0.130.0>", entry = "erlang:apply/2" }

    process_link

    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • from : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • type : string :: "link" | "unlink"

    Available through erlang:trace/3 with trace flag procs and {tracer,dyntrace,[]} as tracer module.

    Example:

    process_link: { cpu_id = 3 }, { from = "<0.130.0>", to = "<0.131.0>", type = "link" }

    process_exit

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • reason : string :: Exit reason. Ex. "normal"

    Available through erlang:trace/3 with trace flag procs and -{tracer,dyntrace,[]} as tracer module.

    Example:

    process_exit: { cpu_id = 3 }, { pid = "<0.130.0>", reason = "normal" }

    process_register

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • name : string :: Registered name. Ex. "logger"
    • type : string :: "register" | "unregister"

    Example:

    process_register: { cpu_id = 0 }, { pid = "<0.128.0>", name = "dyntrace_lttng_SUITE" type = "register" }

    process_scheduled

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • type : string :: +{tracer,dyntrace,[]} as tracer module.

      Example:

      process_exit: { cpu_id = 3 }, { pid = "<0.130.0>", reason = "normal" }

      process_register

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • name : string :: Registered name. Ex. "logger"
      • type : string :: "register" | "unregister"

      Example:

      process_register: { cpu_id = 0 }, { pid = "<0.128.0>", name = "dyntrace_lttng_SUITE" type = "register" }

      process_scheduled

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • entry : string :: Code Location. Ex. "lists:sort/1"
      • type : string :: "in" | "out" | "in_exiting" | "out_exiting" | "out_exited"

      Available through erlang:trace/3 with trace flag running and -{tracer,dyntrace,[]} as tracer module.

      Example:

      process_scheduled: { cpu_id = 0 }, { pid = "<0.136.0>", entry = "erlang:apply/2", type = "in" }

      port_open

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • port : string :: Port ID. Ex. "#Port<0.1031>"

      Available through erlang:trace/3 with trace flag ports and +{tracer,dyntrace,[]} as tracer module.

      Example:

      process_scheduled: { cpu_id = 0 }, { pid = "<0.136.0>", entry = "erlang:apply/2", type = "in" }

      port_open

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • port : string :: Port ID. Ex. "#Port<0.1031>"

      Available through erlang:trace/3 with trace flag ports and {tracer,dyntrace,[]} as tracer module.

      Example:

      port_open: { cpu_id = 5 }, { pid = "<0.131.0>", driver = "'/bin/sh -s unix:cmd'", port = "#Port<0.1887>" }

      port_exit

      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • reason : string :: Exit reason. Ex. "normal"

      Available through erlang:trace/3 with trace flag ports and {tracer,dyntrace,[]} as tracer module.

      Example:

      port_exit: { cpu_id = 5 }, { port = "#Port<0.1887>", reason = "normal" }

      port_link

      • to : string :: Process ID. Ex. "<0.131.0>"
      • from : string :: Process ID. Ex. "<0.131.0>"
      • type : string :: "link" | "unlink"

      Available through erlang:trace/3 with trace flag ports and -{tracer,dyntrace,[]} as tracer module.

      Example:

      port_link: { cpu_id = 5 }, { from = "#Port<0.1887>", to = "<0.131.0>", type = "unlink" }

      port_scheduled

      Available through erlang:trace/3 with trace flag running and +{tracer,dyntrace,[]} as tracer module.

      Example:

      port_link: { cpu_id = 5 }, { from = "#Port<0.1887>", to = "<0.131.0>", type = "unlink" }

      port_scheduled

      Available through erlang:trace/3 with trace flag running and {tracer,dyntrace,[]} as tracer module.

      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • entry : string :: Callback. Ex. "open"
      • type : string :: -"in" | "out" | "in_exiting" | "out_exiting" | "out_exited"

      Example:

      port_scheduled: { cpu_id = 5 }, { pid = "#Port<0.1905>", entry = "close", type = "out" }

      Available through erlang:trace/3 with trace flag running and +"in" | "out" | "in_exiting" | "out_exiting" | "out_exited"

    Example:

    port_scheduled: { cpu_id = 5 }, { pid = "#Port<0.1905>", entry = "close", type = "out" }

    Available through erlang:trace/3 with trace flag running and {tracer,dyntrace,[]} as tracer module.

    function_call

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • depth : integer :: Stack depth. Ex. 0

    Available through erlang:trace/3 with trace flag call and -{tracer,dyntrace,[]} as tracer module.

    Example:

    function_call: { cpu_id = 5 }, { pid = "<0.145.0>", entry = "dyntrace_lttng_SUITE:'-t_call/1-fun-1-'/0", depth = 0 }

    function_return

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • depth : integer :: Stack depth. Ex. 0

    Available through erlang:trace/3 with trace flag call or return_to and -{tracer,dyntrace,[]} as tracer module.

    Example:

    function_return: { cpu_id = 5 }, { pid = "<0.145.0>", entry = "dyntrace_lttng_SUITE:waiter/0", depth = 0 }

    function_exception

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • class : string :: Error reason. Ex. "error"

    Available through erlang:trace/3 with trace flag call and -{tracer,dyntrace,[]} as tracer module.

    Example:

    function_exception: { cpu_id = 5 }, { pid = "<0.144.0>", entry = "t:call_exc/1", class = "error" }

    message_send

    • from : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • message : string :: Message sent. Ex. "{<0.162.0>,ok}"

    Available through erlang:trace/3 with trace flag send and +{tracer,dyntrace,[]} as tracer module.

    Example:

    function_call: { cpu_id = 5 }, { pid = "<0.145.0>", entry = "dyntrace_lttng_SUITE:'-t_call/1-fun-1-'/0", depth = 0 }

    function_return

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • depth : integer :: Stack depth. Ex. 0

    Available through erlang:trace/3 with trace flag call or return_to and +{tracer,dyntrace,[]} as tracer module.

    Example:

    function_return: { cpu_id = 5 }, { pid = "<0.145.0>", entry = "dyntrace_lttng_SUITE:waiter/0", depth = 0 }

    function_exception

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • class : string :: Error reason. Ex. "error"

    Available through erlang:trace/3 with trace flag call and +{tracer,dyntrace,[]} as tracer module.

    Example:

    function_exception: { cpu_id = 5 }, { pid = "<0.144.0>", entry = "t:call_exc/1", class = "error" }

    message_send

    • from : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • message : string :: Message sent. Ex. "{<0.162.0>,ok}"

    Available through erlang:trace/3 with trace flag send and {tracer,dyntrace,[]} as tracer module.

    Example:

    message_send: { cpu_id = 3 }, { from = "#Port<0.1938>", to = "<0.160.0>", message = "{#Port<0.1938>,eof}" }

    message_receive

    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • message : string :: Message received. Ex. "{<0.162.0>,ok}"

    Available through erlang:trace/3 with trace flag 'receive' and {tracer,dyntrace,[]} as tracer module.

    Example:

    message_receive: { cpu_id = 7 }, { to = "<0.167.0>", message = "{<0.165.0>,ok}" }

    gc_minor_start

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • need : integer :: Heap need. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and -{tracer,dyntrace,[]} as tracer module.

    Example:

    gc_minor_start: { cpu_id = 0 }, { pid = "<0.172.0>", need = 0, heap = 610, old_heap = 0 }

    gc_minor_end

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • reclaimed : integer :: Heap reclaimed. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and -{tracer,dyntrace,[]} as tracer module.

    Example:

    gc_minor_end: { cpu_id = 0 }, { pid = "<0.172.0>", reclaimed = 120, heap = 1598, old_heap = 1598 }

    gc_major_start

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • need : integer :: Heap need. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and -{tracer,dyntrace,[]} as tracer module.

    Example:

    gc_major_start: { cpu_id = 0 }, { pid = "<0.172.0>", need = 8, heap = 2586, old_heap = 1598 }

    gc_major_end

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • reclaimed : integer :: Heap reclaimed. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and +{tracer,dyntrace,[]} as tracer module.

    Example:

    gc_minor_start: { cpu_id = 0 }, { pid = "<0.172.0>", need = 0, heap = 610, old_heap = 0 }

    gc_minor_end

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • reclaimed : integer :: Heap reclaimed. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and +{tracer,dyntrace,[]} as tracer module.

    Example:

    gc_minor_end: { cpu_id = 0 }, { pid = "<0.172.0>", reclaimed = 120, heap = 1598, old_heap = 1598 }

    gc_major_start

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • need : integer :: Heap need. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and +{tracer,dyntrace,[]} as tracer module.

    Example:

    gc_major_start: { cpu_id = 0 }, { pid = "<0.172.0>", need = 8, heap = 2586, old_heap = 1598 }

    gc_major_end

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • reclaimed : integer :: Heap reclaimed. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and {tracer,dyntrace,[]} as tracer module.

    Example:

    gc_major_end: { cpu_id = 0 }, { pid = "<0.172.0>", reclaimed = 240, heap = 4185, old_heap = 0 }

    BEAM Tracepoints

    -

    All tracepoints are in the domain of org_erlang_otp

    All Erlang types are the string equivalent in LTTng.

    driver_init

    • driver : string :: Driver name. Ex. "tcp_inet"
    • major : integer :: Major version. Ex. 3
    • minor : integer :: Minor version. Ex. 1
    • flags : integer :: Flags. Ex. 1

    Example:

    driver_init: { cpu_id = 2 }, { driver = "caller_drv", major = 3, minor = 3, flags = 1 }

    driver_start

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • port : string :: Port ID. Ex. "#Port<0.1031>"

    Example:

    driver_start: { cpu_id = 2 }, { pid = "<0.198.0>", driver = "caller_drv", port = "#Port<0.3676>" }

    driver_output

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • bytes : integer :: Size of data returned. Ex. 82

    Example:

    driver_output: { cpu_id = 2 }, { pid = "<0.198.0>", port = "#Port<0.3677>", driver = "/bin/sh -s unix:cmd", bytes = 36 }

    driver_outputv

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • bytes : integer :: Size of data returned. Ex. 82

    Example:

    driver_outputv: { cpu_id = 5 }, { pid = "<0.194.0>", port = "#Port<0.3663>", driver = "tcp_inet", bytes = 3 }

    driver_ready_input

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_ready_input: { cpu_id = 5 }, { pid = "<0.189.0>", port = "#Port<0.3637>", driver = "inet_gethost 4 " }

    driver_ready_output

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_ready_output: { cpu_id = 5 }, { pid = "<0.194.0>", port = "#Port<0.3663>", driver = "tcp_inet" }

    driver_timeout

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_timeout: { cpu_id = 5 }, { pid = "<0.196.0>", port = "#Port<0.3664>", driver = "tcp_inet" }

    driver_stop_select

    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_stop_select: { cpu_id = 5 }, { driver = "unknown" }

    driver_flush

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_flush: { cpu_id = 7 }, { pid = "<0.204.0>", port = "#Port<0.3686>", driver = "tcp_inet" }

    driver_stop

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_stop: { cpu_id = 5 }, { pid = "[]", port = "#Port<0.3673>", driver = "tcp_inet" }

    driver_process_exit

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    driver_ready_async

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_ready_async: { cpu_id = 3 }, { pid = "<0.181.0>", port = "#Port<0.3622>", driver = "tcp_inet" }

    driver_call

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • command : integer :: Command integer. Ex. 1
    • bytes : integer :: Size of data returned. Ex. 82

    Example:

    driver_call: { cpu_id = 2 }, { pid = "<0.202.0>", port = "#Port<0.3676>", driver = "caller_drv", command = 0, bytes = 2 }

    driver_control

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • command : integer :: Command integer. Ex. 1
    • bytes : integer :: Size of data returned. Ex. 82

    Example:

    driver_control: { cpu_id = 3 }, { pid = "<0.32767.8191>", port = "#Port<0.0>", driver = "forker", command = 83, bytes = 32 }

    carrier_create

    • type : string :: Carrier type. Ex. "ets_alloc"
    • instance : integer :: Allocator instance. Ex. 1
    • size : integer :: Carrier size. Ex. 262144
    • mbc_carriers : integer :: Number of multiblock carriers in instance. Ex. 3
    • mbc_carriers_size : integer :: Total size of multiblock blocks carriers in +

      All tracepoints are in the domain of org_erlang_otp

      All Erlang types are the string equivalent in LTTng.

      driver_init

      • driver : string :: Driver name. Ex. "tcp_inet"
      • major : integer :: Major version. Ex. 3
      • minor : integer :: Minor version. Ex. 1
      • flags : integer :: Flags. Ex. 1

      Example:

      driver_init: { cpu_id = 2 }, { driver = "caller_drv", major = 3, minor = 3, flags = 1 }

      driver_start

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • port : string :: Port ID. Ex. "#Port<0.1031>"

      Example:

      driver_start: { cpu_id = 2 }, { pid = "<0.198.0>", driver = "caller_drv", port = "#Port<0.3676>" }

      driver_output

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • bytes : integer :: Size of data returned. Ex. 82

      Example:

      driver_output: { cpu_id = 2 }, { pid = "<0.198.0>", port = "#Port<0.3677>", driver = "/bin/sh -s unix:cmd", bytes = 36 }

      driver_outputv

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • bytes : integer :: Size of data returned. Ex. 82

      Example:

      driver_outputv: { cpu_id = 5 }, { pid = "<0.194.0>", port = "#Port<0.3663>", driver = "tcp_inet", bytes = 3 }

      driver_ready_input

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_ready_input: { cpu_id = 5 }, { pid = "<0.189.0>", port = "#Port<0.3637>", driver = "inet_gethost 4 " }

      driver_ready_output

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_ready_output: { cpu_id = 5 }, { pid = "<0.194.0>", port = "#Port<0.3663>", driver = "tcp_inet" }

      driver_timeout

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_timeout: { cpu_id = 5 }, { pid = "<0.196.0>", port = "#Port<0.3664>", driver = "tcp_inet" }

      driver_stop_select

      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_stop_select: { cpu_id = 5 }, { driver = "unknown" }

      driver_flush

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_flush: { cpu_id = 7 }, { pid = "<0.204.0>", port = "#Port<0.3686>", driver = "tcp_inet" }

      driver_stop

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_stop: { cpu_id = 5 }, { pid = "[]", port = "#Port<0.3673>", driver = "tcp_inet" }

      driver_process_exit

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      driver_ready_async

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_ready_async: { cpu_id = 3 }, { pid = "<0.181.0>", port = "#Port<0.3622>", driver = "tcp_inet" }

      driver_call

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • command : integer :: Command integer. Ex. 1
      • bytes : integer :: Size of data returned. Ex. 82

      Example:

      driver_call: { cpu_id = 2 }, { pid = "<0.202.0>", port = "#Port<0.3676>", driver = "caller_drv", command = 0, bytes = 2 }

      driver_control

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • command : integer :: Command integer. Ex. 1
      • bytes : integer :: Size of data returned. Ex. 82

      Example:

      driver_control: { cpu_id = 3 }, { pid = "<0.32767.8191>", port = "#Port<0.0>", driver = "forker", command = 83, bytes = 32 }

      carrier_create

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144
      • mbc_carriers : integer :: Number of multiblock carriers in instance. Ex. 3
      • mbc_carriers_size : integer :: Total size of multiblock blocks carriers in instance. Ex. 1343488
      • mbc_blocks : integer :: Number of multiblock blocks in instance. Ex. 122
      • mbc_blocks_size : integer :: Total size of all multiblock blocks in instance. Ex. 285296
      • sbc_carriers : integer :: Number of singleblock carriers in instance. Ex. 1
      • sbc_carriers_size : integer :: Total size of singleblock blocks carriers in instance. Ex. 1343488
      • sbc_blocks : integer :: Number of singleblocks in instance. Ex. 1
      • sbc_blocks_size : integer :: Total size of all singleblock blocks in -instance. Ex. 285296

      Example:

      carrier_create: { cpu_id = 2 }, { type = "ets_alloc", instance = 7, size = 2097152, mbc_carriers = 4, mbc_carriers_size = 3440640, mbc_blocks = 526, mbc_blocks_size = 1278576, sbc_carriers = 0, sbc_carriers_size = 0, sbc_blocks = 0, sbc_blocks_size = 0 }

      carrier_destroy

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144
      • mbc_carriers : integer :: Number of multiblock carriers in instance. Ex. 3
      • mbc_carriers_size : integer :: Total size of multiblock blocks carriers in +instance. Ex. 285296

      Example:

      carrier_create: { cpu_id = 2 }, { type = "ets_alloc", instance = 7, size = 2097152, mbc_carriers = 4, mbc_carriers_size = 3440640, mbc_blocks = 526, mbc_blocks_size = 1278576, sbc_carriers = 0, sbc_carriers_size = 0, sbc_blocks = 0, sbc_blocks_size = 0 }

      carrier_destroy

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144
      • mbc_carriers : integer :: Number of multiblock carriers in instance. Ex. 3
      • mbc_carriers_size : integer :: Total size of multiblock blocks carriers in instance. Ex. 1343488
      • mbc_blocks : integer :: Number of multiblock blocks in instance. Ex. 122
      • mbc_blocks_size : integer :: Total size of all multiblock blocks in instance. Ex. 285296
      • sbc_carriers : integer :: Number of singleblock carriers in instance. Ex. 1
      • sbc_carriers_size : integer :: Total size of singleblock blocks carriers in instance. Ex. 1343488
      • sbc_blocks : integer :: Number of singleblocks in instance. Ex. 1
      • sbc_blocks_size : integer :: Total size of all singleblock blocks in -instance. Ex. 285296

      Example:

      carrier_destroy: { cpu_id = 6 }, { type = "ets_alloc", instance = 7, size = 262144, mbc_carriers = 3, mbc_carriers_size = 3178496, mbc_blocks = 925, mbc_blocks_size = 2305336, sbc_carriers = 0, sbc_carriers_size = 0, sbc_blocks = 0, sbc_blocks_size = 0 }

      carrier_pool_put

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144

      Example:

      carrier_pool_put: { cpu_id = 3 }, { type = "ets_alloc", instance = 5, size = 1048576 }

      carrier_pool_get

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144

      Example:

      carrier_pool_get: { cpu_id = 7 }, { type = "ets_alloc", instance = 4, size = 3208 }

      +instance. Ex. 285296

    Example:

    carrier_destroy: { cpu_id = 6 }, { type = "ets_alloc", instance = 7, size = 262144, mbc_carriers = 3, mbc_carriers_size = 3178496, mbc_blocks = 925, mbc_blocks_size = 2305336, sbc_carriers = 0, sbc_carriers_size = 0, sbc_blocks = 0, sbc_blocks_size = 0 }

    carrier_pool_put

    • type : string :: Carrier type. Ex. "ets_alloc"
    • instance : integer :: Allocator instance. Ex. 1
    • size : integer :: Carrier size. Ex. 262144

    Example:

    carrier_pool_put: { cpu_id = 3 }, { type = "ets_alloc", instance = 5, size = 1048576 }

    carrier_pool_get

    • type : string :: Carrier type. Ex. "ets_alloc"
    • instance : integer :: Allocator instance. Ex. 1
    • size : integer :: Carrier size. Ex. 262144

    Example:

    carrier_pool_get: { cpu_id = 7 }, { type = "ets_alloc", instance = 4, size = 3208 }

    @@ -93,10 +93,10 @@ Erlang/OTP 19 [erts-8.0] [source-4d7b24d] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [lttng] Eshell V8.0 (abort with ^G) -1>

    Load the dyntrace module.

    1> l(dyntrace).
    -{module,dyntrace}

    All tracepoints via dyntrace are now visible and can be listed through +1>

    Load the dyntrace module.

    1> l(dyntrace).
    +{module,dyntrace}

    All tracepoints via dyntrace are now visible and can be listed through lttng list -u.

    Enable the process_register LTTng tracepoint for Erlang.

    $ lttng enable-event -u org_erlang_dyntrace:process_register
    -UST event org_erlang_dyntrace:process_register created in channel channel0

    Enable process tracing for new processes and use dyntrace as tracer backend.

    2> erlang:trace(new,true,[procs,{tracer,dyntrace,[]}]).
    +UST event org_erlang_dyntrace:process_register created in channel channel0

    Enable process tracing for new processes and use dyntrace as tracer backend.

    2> erlang:trace(new,true,[procs,{tracer,dyntrace,[]}]).
     0

    Start LTTng tracing.

    $ lttng start
     Tracing started for session erlang-demo

    Start the os_mon application in Erlang.

    3> application:ensure_all_started(os_mon).
     {ok,[sasl,os_mon]}

    Stop LTTng tracing and view the result.

    $ lttng stop
    /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub/OEBPS/msacc.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub/OEBPS/msacc.xhtml	2025-05-10 20:19:16.193254681 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub/OEBPS/msacc.xhtml	2025-05-10 20:19:16.197254718 +0000
    @@ -26,9 +26,9 @@
     

    Convenience functions for microstate accounting

    This module implements some convenience functions for analyzing microstate accounting data. For details about how to use the basic API and what the different states represent, see -erlang:statistics(microstate_accounting).

    Basic Scenario

    1> msacc:start(1000).
    +erlang:statistics(microstate_accounting).

    Basic Scenario

    1> msacc:start(1000).
     ok
    -2> msacc:print().
    +2> msacc:print().
     Average thread real-time    : 1000513 us
     Accumulated system run-time :    2213 us
     Average scheduler run-time  :    1076 us
    @@ -36,11 +36,11 @@
             Thread      aux check_io emulator       gc    other     port    sleep
     
     Stats per thread:
    -     async( 0)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    -     async( 1)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    -       aux( 1)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%   99.99%
    - scheduler( 1)    0.00%    0.03%    0.13%    0.00%    0.01%    0.00%   99.82%
    - scheduler( 2)    0.00%    0.00%    0.00%    0.00%    0.03%    0.00%   99.97%
    +     async( 0)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    +     async( 1)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    +       aux( 1)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%   99.99%
    + scheduler( 1)    0.00%    0.03%    0.13%    0.00%    0.01%    0.00%   99.82%
    + scheduler( 2)    0.00%    0.00%    0.00%    0.00%    0.03%    0.00%   99.97%
     
     Stats per type:
              async    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    @@ -824,7 +824,7 @@
     this can be verbose. See the top of this reference manual for a brief
     description of what the fields mean.

    It is possible to print more specific types of statistics by first manipulating the DataOrStats using stats/2. For instance if you want to print the -percentage of run-time for each thread you can do:

    msacc:print(msacc:stats(runtime, msacc:stats())).

    If you want to only print run-time per thread type you can do:

    msacc:print(msacc:stats(type, msacc:stats(runtime, msacc:stats()))).

    Options

    • system - Print percentage of time spent in each state out of system time +percentage of run-time for each thread you can do:

      msacc:print(msacc:stats(runtime, msacc:stats())).

      If you want to only print run-time per thread type you can do:

      msacc:print(msacc:stats(type, msacc:stats(runtime, msacc:stats()))).

      Options

      • system - Print percentage of time spent in each state out of system time as well as thread time. Default: false.
      /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub/OEBPS/scheduler.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub/OEBPS/scheduler.xhtml 2025-05-10 20:19:16.193254681 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub/OEBPS/scheduler.xhtml 2025-05-10 20:19:16.197254718 +0000 @@ -492,7 +492,7 @@ scheduler_wall_time.

      Calculate scheduler utilizations for the time interval from when Sample was taken and "now". The same as calling scheduler:utilization(Sample, scheduler:sample_all()).

      Note

      This function is not recommended as it's so easy to get invalid results -without noticing. In particular do not do this:

      scheduler:utilization(scheduler:sample()). % DO NOT DO THIS!

      The above example takes two samples in rapid succession and calculates the +without noticing. In particular do not do this:

      scheduler:utilization(scheduler:sample()). % DO NOT DO THIS!

      The above example takes two samples in rapid succession and calculates the scheduler utilization between them. The resulting values will probably be more misleading than informative.

      Instead use scheduler:utilization/2 and call get_sample/0 to get samples with some time in between.

      /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools_app.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools_app.html 2025-05-10 20:19:16.309255733 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools_app.html 2025-05-10 20:19:16.313255769 +0000 @@ -195,7 +195,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/scheduler.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/scheduler.html 2025-05-10 20:19:16.333255951 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/scheduler.html 2025-05-10 20:19:16.341256023 +0000 @@ -613,7 +613,7 @@ scheduler_wall_time.

      Calculate scheduler utilizations for the time interval from when Sample was taken and "now". The same as calling scheduler:utilization(Sample, scheduler:sample_all()).

      Note

      This function is not recommended as it's so easy to get invalid results -without noticing. In particular do not do this:

      scheduler:utilization(scheduler:sample()). % DO NOT DO THIS!

      The above example takes two samples in rapid succession and calculates the +without noticing. In particular do not do this:

      scheduler:utilization(scheduler:sample()). % DO NOT DO THIS!

      The above example takes two samples in rapid succession and calculates the scheduler utilization between them. The resulting values will probably be more misleading than informative.

      Instead use scheduler:utilization/2 and call get_sample/0 to get samples with some time in between.

      @@ -681,7 +681,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/search.html 2025-05-10 20:19:16.357256167 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/search.html 2025-05-10 20:19:16.357256167 +0000 @@ -145,7 +145,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/system_information.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/system_information.html 2025-05-10 20:19:16.377256349 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/system_information.html 2025-05-10 20:19:16.381256385 +0000 @@ -298,7 +298,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/systemtap.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/systemtap.html 2025-05-10 20:19:16.401256567 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/systemtap.html 2025-05-10 20:19:16.401256567 +0000 @@ -213,7 +213,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/404.html 2025-05-10 20:19:16.421256748 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/404.html 2025-05-10 20:19:16.421256748 +0000 @@ -147,7 +147,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/alarm_handler.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/alarm_handler.html 2025-05-10 20:19:16.441256929 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/alarm_handler.html 2025-05-10 20:19:16.445256965 +0000 @@ -418,7 +418,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/api-reference.html 2025-05-10 20:19:16.465257147 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/api-reference.html 2025-05-10 20:19:16.465257147 +0000 @@ -212,7 +212,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/appup.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/appup.html 2025-05-10 20:19:16.493257401 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/appup.html 2025-05-10 20:19:16.497257437 +0000 @@ -143,9 +143,9 @@ Application is the application name. The file is to be located in the ebin directory for the application.

      The .appup file contains one single Erlang term, which defines the instructions used to upgrade or downgrade the application. The file has the -following syntax:

      {Vsn,
      -  [{UpFromVsn, Instructions}, ...],
      -  [{DownToVsn, Instructions}, ...]}.
      • Vsn = string() - Current application version.

      • UpFromVsn = string() | binary() - An earlier application version to +following syntax:

        {Vsn,
        +  [{UpFromVsn, Instructions}, ...],
        +  [{DownToVsn, Instructions}, ...]}.
        • Vsn = string() - Current application version.

        • UpFromVsn = string() | binary() - An earlier application version to upgrade from. If it is a string, it is interpreted as a specific version number. If it is a binary, it is interpreted as a regular expression that can match multiple version numbers.

        • DownToVsn = string() | binary() - An earlier application version to @@ -221,21 +221,21 @@ version. For static modules, the new version is loaded before the process is asked to change code, both in the case of upgrading and downgrading. Callback modules are dynamic.

        update with argument supervisor is used when changing the start -specification of a supervisor.

        {load_module, Mod}
        -{load_module, Mod, DepMods}
        -{load_module, Mod, PrePurge, PostPurge, DepMods}
        -  Mod = atom()
        +specification of a supervisor.

        {load_module, Mod}
        +{load_module, Mod, DepMods}
        +{load_module, Mod, PrePurge, PostPurge, DepMods}
        +  Mod = atom()
           PrePurge = PostPurge = soft_purge | brutal_purge
        -  DepMods = [Mod]

        Simple code replacement of the module Mod.

        For a description of PrePurge and PostPurge, see update above.

        DepMods defaults to [] and defines which other modules Mod is dependent + DepMods = [Mod]

        Simple code replacement of the module Mod.

        For a description of PrePurge and PostPurge, see update above.

        DepMods defaults to [] and defines which other modules Mod is dependent on. In the relup file, instructions for loading these modules come before the -instruction for loading Mod when upgrading, and conversely when downgrading.

        {add_module, Mod}
        -{add_module, Mod, DepMods}
        -  Mod = atom()
        -  DepMods = [Mod]

        Loads a new module Mod.

        DepMods defaults to [] and defines which other modules Mod is dependent +instruction for loading Mod when upgrading, and conversely when downgrading.

        {add_module, Mod}
        +{add_module, Mod, DepMods}
        +  Mod = atom()
        +  DepMods = [Mod]

        Loads a new module Mod.

        DepMods defaults to [] and defines which other modules Mod is dependent on. In the relup file, instructions related to these modules come before the -instruction for loading Mod when upgrading, and conversely when downgrading.

        {delete_module, Mod}
        -{delete_module, Mod, DepMods}
        -  Mod = atom()

        Deletes a module Mod using the low-level instructions remove and purge.

        DepMods defaults to [] and defines which other modules Mod is dependent +instruction for loading Mod when upgrading, and conversely when downgrading.

        {delete_module, Mod}
        +{delete_module, Mod, DepMods}
        +  Mod = atom()

        Deletes a module Mod using the low-level instructions remove and purge.

        DepMods defaults to [] and defines which other modules Mod is dependent on. In the relup file, instructions related to these modules come before the instruction for removing Mod when upgrading, and conversely when downgrading.

        {add_application, Application}
         {add_application, Application, Type}
        @@ -262,9 +262,9 @@
           
           Low-Level Instructions
         
        -
        {load_object_code, {App, Vsn, [Mod]}}
        -  App = Mod = atom()
        -  Vsn = string()

        Reads each Mod from directory App-Vsn/ebin as a binary. It does not load the +

        {load_object_code, {App, Vsn, [Mod]}}
        +  App = Mod = atom()
        +  Vsn = string()

        Reads each Mod from directory App-Vsn/ebin as a binary. It does not load the modules. The instruction is to be placed first in the script to read all new code from the file to make the suspend-load-resume cycle less time-consuming.

        point_of_no_return

        If a crash occurs after this instruction, the system cannot recover and is restarted from the old release version. The instruction must only occur once in @@ -278,38 +278,38 @@ PrePurge = PostPurge = soft_purge | brutal_purge

        Makes the current version of Mod old. PrePurge is ignored. For a description of PostPurge, see the high-level instruction update earlier.

        {purge, [Mod]}
           Mod = atom()

        Purges each module Mod, that is, removes the old code. Notice that any process -executing purged code is killed.

        {suspend, [Mod | {Mod, Timeout}]}
        -  Mod = atom()
        -  Timeout = int()>0 | default | infinity

        Tries to suspend all processes using a module Mod. If a process does not +executing purged code is killed.

        {suspend, [Mod | {Mod, Timeout}]}
        +  Mod = atom()
        +  Timeout = int()>0 | default | infinity

        Tries to suspend all processes using a module Mod. If a process does not respond, it is ignored. This can cause the process to die, either because it crashes when it spontaneously switches to new code, or as a result of a purge operation. If no Timeout is specified or default is specified, the default value for sys:suspend is used.

        {resume, [Mod]}
        -  Mod = atom()

        Resumes all suspended processes using a module Mod.

        {code_change, [{Mod, Extra}]}
        -{code_change, Mode, [{Mod, Extra}]}
        -  Mod = atom()
        +  Mod = atom()

        Resumes all suspended processes using a module Mod.

        {code_change, [{Mod, Extra}]}
        +{code_change, Mode, [{Mod, Extra}]}
        +  Mod = atom()
           Mode = up | down
        -  Extra = term()

        Mode defaults to up and specifies if it is an upgrade or downgrade. This + Extra = term()

    Mode defaults to up and specifies if it is an upgrade or downgrade. This instruction sends a code_change system message to all processes using a module Mod by calling function sys:change_code, passing term Extra as argument.

    {stop, [Mod]}
       Mod = atom()

    Stops all processes using a module Mod by calling supervisor:terminate_child/2. This instruction is useful when the simplest way -to change code is to stop and restart the processes that run the code.

    {start, [Mod]}
    -  Mod = atom()

    Starts all stopped processes using a module Mod by calling -supervisor:restart_child/2.

    {sync_nodes, Id, [Node]}
    -{sync_nodes, Id, {M, F, A}}
    -  Id = term()
    -  Node = node()
    -  M = F = atom()
    -  A = [term()]

    apply(M, F, A) must return a list of nodes.

    This instruction synchronizes the release installation with other nodes. Each +to change code is to stop and restart the processes that run the code.

    {start, [Mod]}
    +  Mod = atom()

    Starts all stopped processes using a module Mod by calling +supervisor:restart_child/2.

    {sync_nodes, Id, [Node]}
    +{sync_nodes, Id, {M, F, A}}
    +  Id = term()
    +  Node = node()
    +  M = F = atom()
    +  A = [term()]

    apply(M, F, A) must return a list of nodes.

    This instruction synchronizes the release installation with other nodes. Each Node must evaluate this command with the same Id. The local node waits for all other nodes to evaluate the instruction before execution continues. If a node goes down, it is considered to be an unrecoverable error, and the local node is restarted from the old release. There is no time-out for this -instruction, which means that it can hang forever.

    {apply, {M, F, A}}
    -  M = F = atom()
    -  A = [term()]

    Evaluates apply(M, F, A).

    If the instruction appears before instruction point_of_no_return, a failure is +instruction, which means that it can hang forever.

    {apply, {M, F, A}}
    +  M = F = atom()
    +  A = [term()]

    Evaluates apply(M, F, A).

    If the instruction appears before instruction point_of_no_return, a failure is caught. release_handler:install_release/1 then returns {error,{'EXIT',Reason}}, unless {error,Error} is thrown or returned. Then it returns {error,Error}.

    If the instruction appears after instruction point_of_no_return and the @@ -395,7 +395,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    Missing in old package: /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/dist/search_data-12AAC588.js Missing in old package: /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/dist/search_data-12AAC588.js /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/error_logging.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/error_logging.html 2025-05-10 20:19:16.529257727 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/error_logging.html 2025-05-10 20:19:16.533257764 +0000 @@ -308,42 +308,42 @@ Show Reports

    Use function rb:show(Number) to show details of a specific -report:

    7> rb:show(4).
    +report:

    7> rb:show(4).
     
     PROGRESS REPORT  <0.20.0>                                   1996-10-16 16:16:36
     ===============================================================================
    -supervisor                                                     {local,sasl_sup}
    +supervisor                                                     {local,sasl_sup}
     started
    -[{pid,<0.24.0>},
    -{name,release_handler},
    -{mfa,{release_handler,start_link,[]}},
    -{restart_type,permanent},
    -{shutdown,2000},
    -{child_type,worker}]
    +[{pid,<0.24.0>},
    +{name,release_handler},
    +{mfa,{release_handler,start_link,[]}},
    +{restart_type,permanent},
    +{shutdown,2000},
    +{child_type,worker}]
     
     ok
    -8> rb:show(9).
    +8> rb:show(9).
     
     CRASH REPORT  <0.24.0>                                      1996-10-16 16:16:21
     ===============================================================================
     Crashing process
     pid                                                                 <0.24.0>
     registered_name                                              release_handler
    -error_info                             {undef,{release_handler,mbj_func,[]}}
    +error_info                             {undef,{release_handler,mbj_func,[]}}
     initial_call
    -{gen,init_it,
    -[gen_server,
    +{gen,init_it,
    +[gen_server,
     <0.20.0>,
     <0.20.0>,
    -{erlang,register},
    +{erlang,register},
     release_handler,
     release_handler,
    -[],
    -[]]}
    -ancestors                                                [sasl_sup,<0.18.0>]
    -messages                                                                  []
    -links                                                    [<0.23.0>,<0.20.0>]
    -dictionary                                                                []
    +[],
    +[]]}
    +ancestors                                                [sasl_sup,<0.18.0>]
    +messages                                                                  []
    +links                                                    [<0.23.0>,<0.20.0>]
    +dictionary                                                                []
     trap_exit                                                              false
     status                                                               running
     heap_size                                                                610
    @@ -485,7 +485,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/notes.html 2025-05-10 20:19:16.561258018 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/notes.html 2025-05-10 20:19:16.569258090 +0000 @@ -1163,7 +1163,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/rb.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/rb.html 2025-05-10 20:19:16.597258344 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/rb.html 2025-05-10 20:19:16.605258416 +0000 @@ -1113,7 +1113,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/rel.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/rel.html 2025-05-10 20:19:16.625258598 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/rel.html 2025-05-10 20:19:16.629258634 +0000 @@ -140,11 +140,11 @@ File Syntax

    The release resource file is to be called Name.rel.

    The .rel file contains one single Erlang term, which is called a release -specification. The file has the following syntax:

    {release, {RelName,Vsn}, {erts, EVsn},
    -  [{Application, AppVsn} |
    -   {Application, AppVsn, Type} |
    -   {Application, AppVsn, IncApps} |
    -   {Application, AppVsn, Type, IncApps}]}.
    • RelName = string() - Release name.

    • Vsn = string() - Release version.

    • EVsn = string() - ERTS version the release is intended for.

    • Application = atom() - Name of an application included in the release.

    • AppVsn = string() - Version of an application included in the release.

    • Type = permanent | transient | temporary | load | none - Start type of +specification. The file has the following syntax:

      {release, {RelName,Vsn}, {erts, EVsn},
      +  [{Application, AppVsn} |
      +   {Application, AppVsn, Type} |
      +   {Application, AppVsn, IncApps} |
      +   {Application, AppVsn, Type, IncApps}]}.
      • RelName = string() - Release name.

      • Vsn = string() - Release version.

      • EVsn = string() - ERTS version the release is intended for.

      • Application = atom() - Name of an application included in the release.

      • AppVsn = string() - Version of an application included in the release.

      • Type = permanent | transient | temporary | load | none - Start type of an application included in the release.

        If Type = permanent | transient | temporary, the application is loaded and started in the corresponding way, see application.

        If Type = load, the application is only loaded.

        If Type = none, the application is not loaded and not started, although the code for its modules is loaded.

        Defaults to permanent

      • IncApps = [atom()] - A list of applications that are included by an @@ -208,7 +208,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/release_handler.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/release_handler.html 2025-05-10 20:19:16.661258924 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/release_handler.html 2025-05-10 20:19:16.673259032 +0000 @@ -1084,8 +1084,8 @@ create_RELEASES/4 or set_unpacked/2.

        Example:

        In the current version CurVsn of a release, the application directory of myapp is $ROOT/lib/myapp-1.0. A new version NewVsn is unpacked outside the release handler and the release handler is informed about this with a call -as follows:

        release_handler:set_unpacked(RelFile, [{myapp,"1.0","/home/user"},...]).
        -=> {ok,NewVsn}

        If NewVsn is installed with option {update_paths,true}, then +as follows:

        release_handler:set_unpacked(RelFile, [{myapp,"1.0","/home/user"},...]).
        +=> {ok,NewVsn}

        If NewVsn is installed with option {update_paths,true}, then code:lib_dir(myapp) returns /home/user/myapp-1.0.

      Note

      Installing a new release can be time consuming if there are many processes in the system. The reason is that each process must be checked for references to old code before a module can be purged. This check can lead to garbage @@ -1386,7 +1386,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/relup.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/relup.html 2025-05-10 20:19:16.693259214 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/relup.html 2025-05-10 20:19:16.697259250 +0000 @@ -143,9 +143,9 @@

      In a target system, the release upgrade file is to be located in directory $ROOT/releases/Vsn.

      The relup file contains one single Erlang term, which defines the instructions -used to upgrade the release. The file has the following syntax:

      {Vsn,
      -  [{UpFromVsn, Descr, Instructions}, ...],
      -  [{DownToVsn, Descr, Instructions}, ...]}.
      • Vsn = string() - Current release version.

      • UpFromVsn = string() - Earlier version of the release to upgrade from.

      • Descr = term() - A user-defined parameter passed from the function +used to upgrade the release. The file has the following syntax:

        {Vsn,
        +  [{UpFromVsn, Descr, Instructions}, ...],
        +  [{DownToVsn, Descr, Instructions}, ...]}.
        • Vsn = string() - Current release version.

        • UpFromVsn = string() - Earlier version of the release to upgrade from.

        • Descr = term() - A user-defined parameter passed from the function systools:make_relup/3,4. It is used in the return value of release_handler:install_release/1,2.

        • Instructions - A list of low-level release upgrade instructions, see @@ -210,7 +210,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub/OEBPS/appup.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub/OEBPS/appup.xhtml 2025-05-10 20:19:16.721259468 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub/OEBPS/appup.xhtml 2025-05-10 20:19:16.725259504 +0000 @@ -38,9 +38,9 @@ Application is the application name. The file is to be located in the ebin directory for the application.

          The .appup file contains one single Erlang term, which defines the instructions used to upgrade or downgrade the application. The file has the -following syntax:

          {Vsn,
          -  [{UpFromVsn, Instructions}, ...],
          -  [{DownToVsn, Instructions}, ...]}.
          • Vsn = string() - Current application version.

          • UpFromVsn = string() | binary() - An earlier application version to +following syntax:

            {Vsn,
            +  [{UpFromVsn, Instructions}, ...],
            +  [{DownToVsn, Instructions}, ...]}.
            • Vsn = string() - Current application version.

            • UpFromVsn = string() | binary() - An earlier application version to upgrade from. If it is a string, it is interpreted as a specific version number. If it is a binary, it is interpreted as a regular expression that can match multiple version numbers.

            • DownToVsn = string() | binary() - An earlier application version to @@ -116,21 +116,21 @@ version. For static modules, the new version is loaded before the process is asked to change code, both in the case of upgrading and downgrading. Callback modules are dynamic.

            update with argument supervisor is used when changing the start -specification of a supervisor.

            {load_module, Mod}
            -{load_module, Mod, DepMods}
            -{load_module, Mod, PrePurge, PostPurge, DepMods}
            -  Mod = atom()
            +specification of a supervisor.

            {load_module, Mod}
            +{load_module, Mod, DepMods}
            +{load_module, Mod, PrePurge, PostPurge, DepMods}
            +  Mod = atom()
               PrePurge = PostPurge = soft_purge | brutal_purge
            -  DepMods = [Mod]

            Simple code replacement of the module Mod.

            For a description of PrePurge and PostPurge, see update above.

            DepMods defaults to [] and defines which other modules Mod is dependent + DepMods = [Mod]

            Simple code replacement of the module Mod.

            For a description of PrePurge and PostPurge, see update above.

            DepMods defaults to [] and defines which other modules Mod is dependent on. In the relup file, instructions for loading these modules come before the -instruction for loading Mod when upgrading, and conversely when downgrading.

            {add_module, Mod}
            -{add_module, Mod, DepMods}
            -  Mod = atom()
            -  DepMods = [Mod]

            Loads a new module Mod.

            DepMods defaults to [] and defines which other modules Mod is dependent +instruction for loading Mod when upgrading, and conversely when downgrading.

            {add_module, Mod}
            +{add_module, Mod, DepMods}
            +  Mod = atom()
            +  DepMods = [Mod]

            Loads a new module Mod.

            DepMods defaults to [] and defines which other modules Mod is dependent on. In the relup file, instructions related to these modules come before the -instruction for loading Mod when upgrading, and conversely when downgrading.

            {delete_module, Mod}
            -{delete_module, Mod, DepMods}
            -  Mod = atom()

            Deletes a module Mod using the low-level instructions remove and purge.

            DepMods defaults to [] and defines which other modules Mod is dependent +instruction for loading Mod when upgrading, and conversely when downgrading.

            {delete_module, Mod}
            +{delete_module, Mod, DepMods}
            +  Mod = atom()

            Deletes a module Mod using the low-level instructions remove and purge.

            DepMods defaults to [] and defines which other modules Mod is dependent on. In the relup file, instructions related to these modules come before the instruction for removing Mod when upgrading, and conversely when downgrading.

            {add_application, Application}
             {add_application, Application, Type}
            @@ -157,9 +157,9 @@
               
               Low-Level Instructions
             
            -
            {load_object_code, {App, Vsn, [Mod]}}
            -  App = Mod = atom()
            -  Vsn = string()

            Reads each Mod from directory App-Vsn/ebin as a binary. It does not load the +

            {load_object_code, {App, Vsn, [Mod]}}
            +  App = Mod = atom()
            +  Vsn = string()

            Reads each Mod from directory App-Vsn/ebin as a binary. It does not load the modules. The instruction is to be placed first in the script to read all new code from the file to make the suspend-load-resume cycle less time-consuming.

            point_of_no_return

            If a crash occurs after this instruction, the system cannot recover and is restarted from the old release version. The instruction must only occur once in @@ -173,38 +173,38 @@ PrePurge = PostPurge = soft_purge | brutal_purge

            Makes the current version of Mod old. PrePurge is ignored. For a description of PostPurge, see the high-level instruction update earlier.

            {purge, [Mod]}
               Mod = atom()

            Purges each module Mod, that is, removes the old code. Notice that any process -executing purged code is killed.

            {suspend, [Mod | {Mod, Timeout}]}
            -  Mod = atom()
            -  Timeout = int()>0 | default | infinity

            Tries to suspend all processes using a module Mod. If a process does not +executing purged code is killed.

            {suspend, [Mod | {Mod, Timeout}]}
            +  Mod = atom()
            +  Timeout = int()>0 | default | infinity

            Tries to suspend all processes using a module Mod. If a process does not respond, it is ignored. This can cause the process to die, either because it crashes when it spontaneously switches to new code, or as a result of a purge operation. If no Timeout is specified or default is specified, the default value for sys:suspend is used.

            {resume, [Mod]}
            -  Mod = atom()

            Resumes all suspended processes using a module Mod.

            {code_change, [{Mod, Extra}]}
            -{code_change, Mode, [{Mod, Extra}]}
            -  Mod = atom()
            +  Mod = atom()

            Resumes all suspended processes using a module Mod.

            {code_change, [{Mod, Extra}]}
            +{code_change, Mode, [{Mod, Extra}]}
            +  Mod = atom()
               Mode = up | down
            -  Extra = term()

            Mode defaults to up and specifies if it is an upgrade or downgrade. This + Extra = term()

    Mode defaults to up and specifies if it is an upgrade or downgrade. This instruction sends a code_change system message to all processes using a module Mod by calling function sys:change_code, passing term Extra as argument.

    {stop, [Mod]}
       Mod = atom()

    Stops all processes using a module Mod by calling supervisor:terminate_child/2. This instruction is useful when the simplest way -to change code is to stop and restart the processes that run the code.

    {start, [Mod]}
    -  Mod = atom()

    Starts all stopped processes using a module Mod by calling -supervisor:restart_child/2.

    {sync_nodes, Id, [Node]}
    -{sync_nodes, Id, {M, F, A}}
    -  Id = term()
    -  Node = node()
    -  M = F = atom()
    -  A = [term()]

    apply(M, F, A) must return a list of nodes.

    This instruction synchronizes the release installation with other nodes. Each +to change code is to stop and restart the processes that run the code.

    {start, [Mod]}
    +  Mod = atom()

    Starts all stopped processes using a module Mod by calling +supervisor:restart_child/2.

    {sync_nodes, Id, [Node]}
    +{sync_nodes, Id, {M, F, A}}
    +  Id = term()
    +  Node = node()
    +  M = F = atom()
    +  A = [term()]

    apply(M, F, A) must return a list of nodes.

    This instruction synchronizes the release installation with other nodes. Each Node must evaluate this command with the same Id. The local node waits for all other nodes to evaluate the instruction before execution continues. If a node goes down, it is considered to be an unrecoverable error, and the local node is restarted from the old release. There is no time-out for this -instruction, which means that it can hang forever.

    {apply, {M, F, A}}
    -  M = F = atom()
    -  A = [term()]

    Evaluates apply(M, F, A).

    If the instruction appears before instruction point_of_no_return, a failure is +instruction, which means that it can hang forever.

    {apply, {M, F, A}}
    +  M = F = atom()
    +  A = [term()]

    Evaluates apply(M, F, A).

    If the instruction appears before instruction point_of_no_return, a failure is caught. release_handler:install_release/1 then returns {error,{'EXIT',Reason}}, unless {error,Error} is thrown or returned. Then it returns {error,Error}.

    If the instruction appears after instruction point_of_no_return and the /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub/OEBPS/content.opf 2025-05-10 20:19:16.721259468 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub/OEBPS/content.opf 2025-05-10 20:19:16.725259504 +0000 @@ -4,10 +4,10 @@ version="3.0"> sasl - 4.2.2 - urn:uuid:506a7b17-e387-588b-6199-0475e5c33d17 + urn:uuid:1f20aba6-fc42-5b25-1724-d6fae89689dc en - 2025-05-10T20:10:02Z + 2041-06-12T09:30:00Z /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub/OEBPS/error_logging.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub/OEBPS/error_logging.xhtml 2025-05-10 20:19:16.721259468 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub/OEBPS/error_logging.xhtml 2025-05-10 20:19:16.725259504 +0000 @@ -203,42 +203,42 @@ Show Reports

    Use function rb:show(Number) to show details of a specific -report:

    7> rb:show(4).
    +report:

    7> rb:show(4).
     
     PROGRESS REPORT  <0.20.0>                                   1996-10-16 16:16:36
     ===============================================================================
    -supervisor                                                     {local,sasl_sup}
    +supervisor                                                     {local,sasl_sup}
     started
    -[{pid,<0.24.0>},
    -{name,release_handler},
    -{mfa,{release_handler,start_link,[]}},
    -{restart_type,permanent},
    -{shutdown,2000},
    -{child_type,worker}]
    +[{pid,<0.24.0>},
    +{name,release_handler},
    +{mfa,{release_handler,start_link,[]}},
    +{restart_type,permanent},
    +{shutdown,2000},
    +{child_type,worker}]
     
     ok
    -8> rb:show(9).
    +8> rb:show(9).
     
     CRASH REPORT  <0.24.0>                                      1996-10-16 16:16:21
     ===============================================================================
     Crashing process
     pid                                                                 <0.24.0>
     registered_name                                              release_handler
    -error_info                             {undef,{release_handler,mbj_func,[]}}
    +error_info                             {undef,{release_handler,mbj_func,[]}}
     initial_call
    -{gen,init_it,
    -[gen_server,
    +{gen,init_it,
    +[gen_server,
     <0.20.0>,
     <0.20.0>,
    -{erlang,register},
    +{erlang,register},
     release_handler,
     release_handler,
    -[],
    -[]]}
    -ancestors                                                [sasl_sup,<0.18.0>]
    -messages                                                                  []
    -links                                                    [<0.23.0>,<0.20.0>]
    -dictionary                                                                []
    +[],
    +[]]}
    +ancestors                                                [sasl_sup,<0.18.0>]
    +messages                                                                  []
    +links                                                    [<0.23.0>,<0.20.0>]
    +dictionary                                                                []
     trap_exit                                                              false
     status                                                               running
     heap_size                                                                610
    /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub/OEBPS/rel.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub/OEBPS/rel.xhtml	2025-05-10 20:19:16.721259468 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub/OEBPS/rel.xhtml	2025-05-10 20:19:16.721259468 +0000
    @@ -35,11 +35,11 @@
       File Syntax
     
     

    The release resource file is to be called Name.rel.

    The .rel file contains one single Erlang term, which is called a release -specification. The file has the following syntax:

    {release, {RelName,Vsn}, {erts, EVsn},
    -  [{Application, AppVsn} |
    -   {Application, AppVsn, Type} |
    -   {Application, AppVsn, IncApps} |
    -   {Application, AppVsn, Type, IncApps}]}.
    • RelName = string() - Release name.

    • Vsn = string() - Release version.

    • EVsn = string() - ERTS version the release is intended for.

    • Application = atom() - Name of an application included in the release.

    • AppVsn = string() - Version of an application included in the release.

    • Type = permanent | transient | temporary | load | none - Start type of +specification. The file has the following syntax:

      {release, {RelName,Vsn}, {erts, EVsn},
      +  [{Application, AppVsn} |
      +   {Application, AppVsn, Type} |
      +   {Application, AppVsn, IncApps} |
      +   {Application, AppVsn, Type, IncApps}]}.
      • RelName = string() - Release name.

      • Vsn = string() - Release version.

      • EVsn = string() - ERTS version the release is intended for.

      • Application = atom() - Name of an application included in the release.

      • AppVsn = string() - Version of an application included in the release.

      • Type = permanent | transient | temporary | load | none - Start type of an application included in the release.

        If Type = permanent | transient | temporary, the application is loaded and started in the corresponding way, see application.

        If Type = load, the application is only loaded.

        If Type = none, the application is not loaded and not started, although the code for its modules is loaded.

        Defaults to permanent

      • IncApps = [atom()] - A list of applications that are included by an /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub/OEBPS/release_handler.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub/OEBPS/release_handler.xhtml 2025-05-10 20:19:16.721259468 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub/OEBPS/release_handler.xhtml 2025-05-10 20:19:16.721259468 +0000 @@ -963,8 +963,8 @@ create_RELEASES/4 or set_unpacked/2.

        Example:

        In the current version CurVsn of a release, the application directory of myapp is $ROOT/lib/myapp-1.0. A new version NewVsn is unpacked outside the release handler and the release handler is informed about this with a call -as follows:

        release_handler:set_unpacked(RelFile, [{myapp,"1.0","/home/user"},...]).
        -=> {ok,NewVsn}

        If NewVsn is installed with option {update_paths,true}, then +as follows:

        release_handler:set_unpacked(RelFile, [{myapp,"1.0","/home/user"},...]).
        +=> {ok,NewVsn}

        If NewVsn is installed with option {update_paths,true}, then code:lib_dir(myapp) returns /home/user/myapp-1.0.

      Note

      Installing a new release can be time consuming if there are many processes in the system. The reason is that each process must be checked for references to old code before a module can be purged. This check can lead to garbage /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub/OEBPS/relup.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub/OEBPS/relup.xhtml 2025-05-10 20:19:16.717259432 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub/OEBPS/relup.xhtml 2025-05-10 20:19:16.721259468 +0000 @@ -38,9 +38,9 @@

      In a target system, the release upgrade file is to be located in directory $ROOT/releases/Vsn.

      The relup file contains one single Erlang term, which defines the instructions -used to upgrade the release. The file has the following syntax:

      {Vsn,
      -  [{UpFromVsn, Descr, Instructions}, ...],
      -  [{DownToVsn, Descr, Instructions}, ...]}.
      • Vsn = string() - Current release version.

      • UpFromVsn = string() - Earlier version of the release to upgrade from.

      • Descr = term() - A user-defined parameter passed from the function +used to upgrade the release. The file has the following syntax:

        {Vsn,
        +  [{UpFromVsn, Descr, Instructions}, ...],
        +  [{DownToVsn, Descr, Instructions}, ...]}.
        • Vsn = string() - Current release version.

        • UpFromVsn = string() - Earlier version of the release to upgrade from.

        • Descr = term() - A user-defined parameter passed from the function systools:make_relup/3,4. It is used in the return value of release_handler:install_release/1,2.

        • Instructions - A list of low-level release upgrade instructions, see /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub/OEBPS/script.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub/OEBPS/script.xhtml 2025-05-10 20:19:16.717259432 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub/OEBPS/script.xhtml 2025-05-10 20:19:16.721259468 +0000 @@ -37,20 +37,20 @@ File Syntax

          The boot script is stored in a file with extension .script. The file has the -following syntax:

          {script, {Name, Vsn},
          - [
          -  {progress, loading},
          -  {preLoaded, [Mod1, Mod2, ...]},
          -  {path, [Dir1,"$ROOT/Dir",...]}.
          -  {primLoad, [Mod1, Mod2, ...]},
          +following syntax:

          {script, {Name, Vsn},
          + [
          +  {progress, loading},
          +  {preLoaded, [Mod1, Mod2, ...]},
          +  {path, [Dir1,"$ROOT/Dir",...]}.
          +  {primLoad, [Mod1, Mod2, ...]},
             ...
          -  {kernel_load_completed},
          -  {progress, loaded},
          -  {kernelProcess, Name, {Mod, Func, Args}},
          +  {kernel_load_completed},
          +  {progress, loaded},
          +  {kernelProcess, Name, {Mod, Func, Args}},
             ...
          -  {apply, {Mod, Func, Args}},
          +  {apply, {Mod, Func, Args}},
             ...
          -  {progress, started}]}.
          • Name = string() - Defines the system name.

          • Vsn = string() - Defines the system version.

          • {progress, Term} - Sets the "progress" of the initialization program. + {progress, started}]}.

          • Name = string() - Defines the system name.

          • Vsn = string() - Defines the system version.

          • {progress, Term} - Sets the "progress" of the initialization program. The init:get_status/0 function returns the current value of the progress, which is {InternalStatus,Term}.

          • {path, [Dir]} - Dir is a string. This argument sets the load path of the system to [Dir]. The load path used to load modules is obtained from the /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl_app.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl_app.html 2025-05-10 20:19:16.821260375 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl_app.html 2025-05-10 20:19:16.825260411 +0000 @@ -265,7 +265,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl_intro.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl_intro.html 2025-05-10 20:19:16.845260592 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl_intro.html 2025-05-10 20:19:16.849260629 +0000 @@ -192,7 +192,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/script.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/script.html 2025-05-10 20:19:16.869260810 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/script.html 2025-05-10 20:19:16.873260845 +0000 @@ -142,20 +142,20 @@ File Syntax

            The boot script is stored in a file with extension .script. The file has the -following syntax:

            {script, {Name, Vsn},
            - [
            -  {progress, loading},
            -  {preLoaded, [Mod1, Mod2, ...]},
            -  {path, [Dir1,"$ROOT/Dir",...]}.
            -  {primLoad, [Mod1, Mod2, ...]},
            +following syntax:

            {script, {Name, Vsn},
            + [
            +  {progress, loading},
            +  {preLoaded, [Mod1, Mod2, ...]},
            +  {path, [Dir1,"$ROOT/Dir",...]}.
            +  {primLoad, [Mod1, Mod2, ...]},
               ...
            -  {kernel_load_completed},
            -  {progress, loaded},
            -  {kernelProcess, Name, {Mod, Func, Args}},
            +  {kernel_load_completed},
            +  {progress, loaded},
            +  {kernelProcess, Name, {Mod, Func, Args}},
               ...
            -  {apply, {Mod, Func, Args}},
            +  {apply, {Mod, Func, Args}},
               ...
            -  {progress, started}]}.
            • Name = string() - Defines the system name.

            • Vsn = string() - Defines the system version.

            • {progress, Term} - Sets the "progress" of the initialization program. + {progress, started}]}.

            • Name = string() - Defines the system name.

            • Vsn = string() - Defines the system version.

            • {progress, Term} - Sets the "progress" of the initialization program. The init:get_status/0 function returns the current value of the progress, which is {InternalStatus,Term}.

            • {path, [Dir]} - Dir is a string. This argument sets the load path of the system to [Dir]. The load path used to load modules is obtained from the @@ -234,7 +234,7 @@ Erlang programming language

              -

              Copyright © 1996-2025 Ericsson AB

              +

              Copyright © 1996-2041 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/search.html 2025-05-10 20:19:16.893261027 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/search.html 2025-05-10 20:19:16.893261027 +0000 @@ -122,7 +122,7 @@
              - + /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/systools.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/systools.html 2025-05-10 20:19:16.921261281 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/systools.html 2025-05-10 20:19:16.925261317 +0000 @@ -674,7 +674,7 @@ Erlang programming language

              -

              Copyright © 1996-2025 Ericsson AB

              +

              Copyright © 1996-2041 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/404.html 2025-05-10 20:19:16.945261499 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/404.html 2025-05-10 20:19:16.945261499 +0000 @@ -147,7 +147,7 @@ Erlang programming language

              -

              Copyright © 1996-2025 Ericsson AB

              +

              Copyright © 1996-2041 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/api-reference.html 2025-05-10 20:19:16.969261717 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/api-reference.html 2025-05-10 20:19:16.977261789 +0000 @@ -482,7 +482,7 @@ Erlang programming language

              -

              Copyright © 1996-2025 Ericsson AB

              +

              Copyright © 1996-2041 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/notes.html 2025-05-10 20:19:17.005262043 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/notes.html 2025-05-10 20:19:17.013262115 +0000 @@ -1131,7 +1131,7 @@ Erlang programming language

              -

              Copyright © 1996-2025 Ericsson AB

              +

              Copyright © 1996-2041 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/search.html 2025-05-10 20:19:17.029262260 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/search.html 2025-05-10 20:19:17.029262260 +0000 @@ -145,7 +145,7 @@ Erlang programming language

              -

              Copyright © 1996-2025 Ericsson AB

              +

              Copyright © 1996-2041 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/content.opf 2025-05-10 20:19:17.065262587 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/content.opf 2025-05-10 20:19:17.077262696 +0000 @@ -4,10 +4,10 @@ version="3.0"> snmp - 5.18.2 - urn:uuid:14796237-80fc-e8e8-e281-4c2669bfd5bd + urn:uuid:92af000d-1afb-e8f2-1910-7247856dec3d en - 2025-05-10T20:10:55Z + 2041-06-12T09:31:08Z /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp.xhtml 2025-05-10 20:19:17.065262587 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp.xhtml 2025-05-10 20:19:17.077262696 +0000 @@ -3222,8 +3222,8 @@

              Utility function(s) to produce a formatted printout of the versions info -generated by the versions1 function

              This is the same as doing, e.g.:

                         {ok, V} = snmp:versions1(),
              -           snmp:print_versions(V).
              +generated by the versions1 function

              This is the same as doing, e.g.:

                         {ok, V} = snmp:versions1(),
              +           snmp:print_versions(V).
              @@ -3421,17 +3421,17 @@

              This function is used to set up trace on function(s) for the given module or modules.

              The example below sets up trace on the exported functions (default) of module snmp_generic and all functions of module snmp_generic_mnesia. With return -values (which is default) and timestamps in both cases (which is also default):

              	  snmp:enable_trace(),
              -	  snmp:set_trace([snmp_generic,
              -                          {snmp_generic_mnesia, [{scope, all_functions}]}]),
              +values (which is default) and timestamps in both cases (which is also default):

              	  snmp:enable_trace(),
              +	  snmp:set_trace([snmp_generic,
              +                          {snmp_generic_mnesia, [{scope, all_functions}]}]),
               	  .
               	  .
               	  .
              -          snmp:set_trace(snmp_generic, disable),
              +          snmp:set_trace(snmp_generic, disable),
               	  .
               	  .
               	  .
              -	  snmp:disable_trace(),
              +
              snmp:disable_trace(),
              /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_advanced_agent.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_advanced_agent.xhtml 2025-05-10 20:19:17.061262550 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_advanced_agent.xhtml 2025-05-10 20:19:17.077262696 +0000 @@ -224,16 +224,16 @@ empName DisplayString, empTelNo DisplayString, empStatus RowStatus - }

    The corresponding Mnesia table is specified as follows:

    mnesia:create_table([{name, employees},
    -                     {snmp, [{key, {integer, string}}]},
    -                     {attributes, [key, telno, row_status]}]).

    Note

    In the Mnesia tables, the two key columns are stored as a tuple with two + }

    The corresponding Mnesia table is specified as follows:

    mnesia:create_table([{name, employees},
    +                     {snmp, [{key, {integer, string}}]},
    +                     {attributes, [key, telno, row_status]}]).

    Note

    In the Mnesia tables, the two key columns are stored as a tuple with two elements. Therefore, the arity of the table is 3.

    Instrumentation Functions

    -

    The MIB table shown in the previous section can be compiled as follows:

    1> snmpc:compile("EmpMIB", [{db, mnesia}]).

    This is all that has to be done! Now the manager can read, add, and modify +

    The MIB table shown in the previous section can be compiled as follows:

    1> snmpc:compile("EmpMIB", [{db, mnesia}]).

    This is all that has to be done! Now the manager can read, add, and modify rows. Also, you can use the ordinary Mnesia API to access the table from your programs. The only explicit action is to create the Mnesia table, an action the user has to perform in order to create the required table schemas.

    @@ -245,11 +245,11 @@

    It is often necessary to take some specific action when a table is modified. This is accomplished with an instrumentation function. It executes some specific code when the table is set, and passes all other requests down to the -pre-defined function.

    The following example illustrates this idea:

    emp_table(set, RowIndex, Cols) ->
    -    notify_internal_resources(RowIndex, Cols),
    -    snmp_generic:table_func(set, RowIndex, Cols, {empTable, mnesia});
    -emp_table(Op, RowIndex, Cols) ->
    -    snmp_generic:table_func(Op, RowIndex, Cols, {empTable, mnesia}).

    The default instrumentation functions are defined in the module snmp_generic. +pre-defined function.

    The following example illustrates this idea:

    emp_table(set, RowIndex, Cols) ->
    +    notify_internal_resources(RowIndex, Cols),
    +    snmp_generic:table_func(set, RowIndex, Cols, {empTable, mnesia});
    +emp_table(Op, RowIndex, Cols) ->
    +    snmp_generic:table_func(Op, RowIndex, Cols, {empTable, mnesia}).

    The default instrumentation functions are defined in the module snmp_generic. Refer to the Reference Manual, section SNMP, module snmp_generic for details.

    @@ -262,28 +262,28 @@ that the agent does not know about. This situation is handled by adding values for the internal columns in the set function.

    To illustrate this, suppose we extend our Mnesia empTable with one internal column. We create it as before, but with an arity of 4, by adding another -attribute.

    mnesia:create_table([{name, employees},
    -                     {snmp, [{key, {integer, string}}]},
    -                     {attributes, {key, telno, row_status, internal_col}}]).

    The last column is the internal column. When performing a set operation, which +attribute.

    mnesia:create_table([{name, employees},
    +                     {snmp, [{key, {integer, string}}]},
    +                     {attributes, {key, telno, row_status, internal_col}}]).

    The last column is the internal column. When performing a set operation, which creates a row, we must give a value to the internal column. The instrumentation -functions will now look as follows:

    -define(createAndGo, 4).
    --define(createAndWait, 5).
    +functions will now look as follows:

    -define(createAndGo, 4).
    +-define(createAndWait, 5).
     
    -emp_table(set, RowIndex, Cols) ->
    -  notify_internal_resources(RowIndex, Cols),
    +emp_table(set, RowIndex, Cols) ->
    +  notify_internal_resources(RowIndex, Cols),
       NewCols =
    -    case is_row_created(empTable, Cols) of
    -      true -> Cols ++ [{4, "internal"}]; % add internal column
    +    case is_row_created(empTable, Cols) of
    +      true -> Cols ++ [{4, "internal"}]; % add internal column
           false -> Cols                      % keep original cols
       end,
    -  snmp_generic:table_func(set, RowIndex, NewCols, {empTable, mnesia});
    -emp_table(Op, RowIndex, Cols) ->
    -  snmp_generic:table_func(Op, RowIndex, Cols, {empTable, mnesia}).
    +  snmp_generic:table_func(set, RowIndex, NewCols, {empTable, mnesia});
    +emp_table(Op, RowIndex, Cols) ->
    +  snmp_generic:table_func(Op, RowIndex, Cols, {empTable, mnesia}).
     
    -is_row_created(Name, Cols) ->
    -  case snmp_generic:get_status_col(Name, Cols) of
    -    {ok, ?createAndGo} -> true;
    -    {ok, ?createAndWait} -> true;
    +is_row_created(Name, Cols) ->
    +  case snmp_generic:get_status_col(Name, Cols) of
    +    {ok, ?createAndGo} -> true;
    +    {ok, ?createAndWait} -> true;
         _ -> false
       end.

    If a row is created, we always set the internal column to "internal".

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_agent_config_files.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_agent_config_files.xhtml 2025-05-10 20:19:17.061262550 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_agent_config_files.xhtml 2025-05-10 20:19:17.073262659 +0000 @@ -45,30 +45,30 @@

    The agent information should be stored in a file called agent.conf.

    Each entry is a tuple of size two:

    {AgentVariable, Value}.

    • AgentVariable is one of the variables in SNMP-FRAMEWORK-MIB or one of the internal variables intAgentUDPPort, which defines which UDP port the agent listens to, or intAgentTransports, which defines the transport domains and -addresses of the agent.
    • Value is the value for the variable.

    The following example shows an agent.conf file:

    {intAgentUDPPort, 4000}.
    -{intAgentTransports,
    - [{transportDomainUdpIpv4, {141,213,11,24}},
    -  {transportDomainUdpIpv6, {0,0,0,0,0,0,0,1}}]}.
    -{snmpEngineID, "mbj's engine"}.
    -{snmpEngineMaxMessageSize, 484}.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir    = "/tmp",
    +addresses of the agent.
  • Value is the value for the variable.
  • The following example shows an agent.conf file:

    {intAgentUDPPort, 4000}.
    +{intAgentTransports,
    + [{transportDomainUdpIpv4, {141,213,11,24}},
    +  {transportDomainUdpIpv6, {0,0,0,0,0,0,0,1}}]}.
    +{snmpEngineID, "mbj's engine"}.
    +{snmpEngineMaxMessageSize, 484}.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir    = "/tmp",
     AgentPort   = 4000,
    -Transports  = [{transportDomainUdpIpv4, {141,213,11,24}},
    -               {transportDomainUdpIpv6, {0,0,0,0,0,0,0,1}}],
    +Transports  = [{transportDomainUdpIpv4, {141,213,11,24}},
    +               {transportDomainUdpIpv6, {0,0,0,0,0,0,0,1}}],
     EngineID    = "mbj's engine",
     MMS         = 484,
     AgentConfig =
    -   [snmpa_conf:agent_entry(intAgentUDPPort,          AgentPort),
    -    snmpa_conf:agent_entry(intAgentTransports,       Transports),
    -    snmpa_conf:agent_entry(snmpEngineID,             EngineID),
    -    snmpa_conf:agent_entry(snmpEngineMaxMessageSize, MMS)],
    -snmpa_conf:write_agent_config(AgentDir, AgentConfig),

    These are the supported entries and their value types:

          {snmpEngine,               string()}.                     % Mandatory
    -      {snmpEngineMaxMessageSize, snmp_framework_mib:max_message_size()}.  % Mandatory
    -      {intAgentUDPPort,          inet:port_number()}.                      % Optional
    -      {intAgentTransports,       [snmpa_conf:intAgentTransport()]}.   % Mandatory

    If a "traditional" transport is specified (without explicit Kind, handling + [snmpa_conf:agent_entry(intAgentUDPPort, AgentPort), + snmpa_conf:agent_entry(intAgentTransports, Transports), + snmpa_conf:agent_entry(snmpEngineID, EngineID), + snmpa_conf:agent_entry(snmpEngineMaxMessageSize, MMS)], +snmpa_conf:write_agent_config(AgentDir, AgentConfig),

    These are the supported entries and their value types:

          {snmpEngine,               string()}.                     % Mandatory
    +      {snmpEngineMaxMessageSize, snmp_framework_mib:max_message_size()}.  % Mandatory
    +      {intAgentUDPPort,          inet:port_number()}.                      % Optional
    +      {intAgentTransports,       [snmpa_conf:intAgentTransport()]}.   % Mandatory

    If a "traditional" transport is specified (without explicit Kind, handling both requests and traps) for a transport domain, its not possible to also specify a transport (for that domain) with a specific Kind. This is for -example, not allowed:

     [{transportDomainUdpIpv4, {{141,213,11,24}, 4000}},
    -  {transportDomainUdpIpv4, {{141,213,11,24}, 4001}, trap_sender}].

    Note that only one transport per kind for each transport domain can be +example, not allowed:

     [{transportDomainUdpIpv4, {{141,213,11,24}, 4000}},
    +  {transportDomainUdpIpv4, {{141,213,11,24}, 4001}, trap_sender}].

    Note that only one transport per kind for each transport domain can be configured.

    PortInfo system is used to indicate that the 'system' should choose (the way port number '0' (zero) is normally used). Port info '0' (zero) cannot be used for this, since it is (internally) used to represent the 'default' port number.

    In the traditional transport entries, when the Addr value does not contain a @@ -89,29 +89,29 @@ default context "" need not be present.

    Each row defines a context in the agent. This information is used in the table vacmContextTable in the SNMP-VIEW-BASED-ACM-MIB.

    Each entry is a term:

    ContextName.

    • ContextName is a string.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir      = "/tmp",
     ContextConfig =
    -   [snmpa_conf:context_entry("foo"),
    -    snmpa_conf:context_entry("bar")],
    -snmpa_conf:write_context_config(AgentDir, ContextConfig),

    + [snmpa_conf:context_entry("foo"), + snmpa_conf:context_entry("bar")], +snmpa_conf:write_context_config(AgentDir, ContextConfig),

    System Information

    The system information should be stored in a file called standard.conf.

    Each entry is a tuple of size two:

    {SystemVariable, Value}.

    • SystemVariable is one of the variables in the system group, or -snmpEnableAuthenTraps.
    • Value is the value for the variable.

    The following example shows a valid standard.conf file:

    {sysDescr, "Erlang SNMP agent"}.
    -{sysObjectID, [1,2,3]}.
    -{sysContact, "(mbj,eklas)@erlang.ericsson.se"}.
    -{sysName, "test"}.
    -{sysServices, 72}.
    -{snmpEnableAuthenTraps, enabled}.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir  = "/tmp",
    +snmpEnableAuthenTraps.
  • Value is the value for the variable.
  • The following example shows a valid standard.conf file:

    {sysDescr, "Erlang SNMP agent"}.
    +{sysObjectID, [1,2,3]}.
    +{sysContact, "(mbj,eklas)@erlang.ericsson.se"}.
    +{sysName, "test"}.
    +{sysServices, 72}.
    +{snmpEnableAuthenTraps, enabled}.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir  = "/tmp",
     StdConfig =
    -   [snmpa_conf:standard_entry(sysDescr,    "Erlang SNMP agent"),
    -    snmpa_conf:standard_entry(sysObjectID, [1,2,3]),
    -    snmpa_conf:standard_entry(sysContact,  "(mbj,eklas)@erlang.ericsson.se"),
    -    snmpa_conf:standard_entry(sysName,     "test"),
    -    snmpa_conf:standard_entry(sysServices, 72),
    -    snmpa_conf:standard_entry(snmpEnableAuthenTraps, enabled)],
    -snmpa_conf:write_standard_config(AgentDir, StdConfig),

    A value must be provided for all variables, which lack default values in the + [snmpa_conf:standard_entry(sysDescr, "Erlang SNMP agent"), + snmpa_conf:standard_entry(sysObjectID, [1,2,3]), + snmpa_conf:standard_entry(sysContact, "(mbj,eklas)@erlang.ericsson.se"), + snmpa_conf:standard_entry(sysName, "test"), + snmpa_conf:standard_entry(sysServices, 72), + snmpa_conf:standard_entry(snmpEnableAuthenTraps, enabled)], +snmpa_conf:write_standard_config(AgentDir, StdConfig),

    A value must be provided for all variables, which lack default values in the MIB.

    @@ -122,11 +122,11 @@ must be present if the agent is configured for SNMPv1 or SNMPv2c.

    An SNMP community is a relationship between an SNMP agent and a set of SNMP managers that defines authentication, access control and proxy characteristics.

    The corresponding table is snmpCommunityTable in the SNMP-COMMUNITY-MIB.

    Each entry is a term:

    {CommunityIndex, CommunityName, SecurityName, ContextName, TransportTag}.

    • CommunityIndex is a non-empty string.
    • CommunityName is a string.
    • SecurityName is a string.
    • ContextName is a string.
    • TransportTag is a string.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir        = "/tmp",
     CommunityConfig =
    -   [snmpa_conf:community_entry("public"),
    -    snmpa_conf:community_entry("all-rights"),
    -    snmpa_conf:community_entry("standard trap",
    -                               "standard trap", "initial", "", "")],
    -snmpa_conf:write_community_config(AgentDir, CommunityConfig),

    + [snmpa_conf:community_entry("public"), + snmpa_conf:community_entry("all-rights"), + snmpa_conf:community_entry("standard trap", + "standard trap", "initial", "", "")], +snmpa_conf:write_community_config(AgentDir, CommunityConfig),

    @@ -141,17 +141,17 @@ regarded as all ones. null is shorthand for a mask with all ones.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir   = "/tmp",
     SecName    = "plain",
     VacmConfig =
    -   [%%                        SecModel, SecName, GroupName
    -    snmpa_conf:vacm_s2g_entry(usm, SecName, SecName),
    +   [%%                        SecModel, SecName, GroupName
    +    snmpa_conf:vacm_s2g_entry(usm, SecName, SecName),
     
         %%                        GroupName, Prefix, SecModel,
    -    snmpa_conf:vacm_acc_entry(SecName, "", any,
    +    snmpa_conf:vacm_acc_entry(SecName, "", any,
         %%                        SecLevel, Match, RV, WV, NV
    -                              noAuthNoPriv, exact, "all", "all", "all"),
    +                              noAuthNoPriv, exact, "all", "all", "all"),
     
         %%                        ViewName, ViewSubtree, ViewType, ViewMask
    -    snmpa_conf:vacm_vtf_entry("restricted", [1,3,6,1], included, null)],
    -snmpa_conf:write_vacm_config(AgentDir, VacmConfig),

    + snmpa_conf:vacm_vtf_entry("restricted", [1,3,6,1], included, null)], +snmpa_conf:write_vacm_config(AgentDir, VacmConfig),

    @@ -170,24 +170,24 @@ be 16 if usmDESPrivProtocol or usmAesCfb128Protocol is used.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir  = "/tmp",
     EngineID  = "plain engine"
     Passwd    = "FooBar Hoopla", %% This should *obviously* be choosen better
    -Secret16  = snmp:passwd2localized_key(md5, Passwd, EngineID),
    -Secret20  = snmp:passwd2localized_key(sha, Passwd, EngineID),
    +Secret16  = snmp:passwd2localized_key(md5, Passwd, EngineID),
    +Secret20  = snmp:passwd2localized_key(sha, Passwd, EngineID),
     UsmConfig =
    -   [snmpa_conf:usm_entry(EngineID, "initial", "initial", zeroDotZero,
    +   [snmpa_conf:usm_entry(EngineID, "initial", "initial", zeroDotZero,
                              usmHMACMD5AuthProtocol, "", "",
                              usmNoPrivProtocol, "", "",
    -                         "", Secret16, ""),
    +                         "", Secret16, ""),
     
    -    snmpa_conf:usm_entry(EngineID, "templateMD5", "templateMD5", zeroDotZero,
    +    snmpa_conf:usm_entry(EngineID, "templateMD5", "templateMD5", zeroDotZero,
                              usmHMACMD5AuthProtocol, "", "",
                              usmDESPrivProtocol, "", "",
    -                         "", Secret16, Secret16),
    +                         "", Secret16, Secret16),
     
    -    snmpa_conf:usm_entry(EngineID, "templateSHA", "templateSHA", zeroDotZero,
    +    snmpa_conf:usm_entry(EngineID, "templateSHA", "templateSHA", zeroDotZero,
                              usmHMACSHAAuthProtocol, "", "",
                              usmAesCfb128Protocol, "", "",
    -                         "", Secret20, Secret16)],
    -snmpa_conf:write_usm_config(AgentDir, UsmConfig),

    + "", Secret20, Secret16)], +snmpa_conf:write_usm_config(AgentDir, UsmConfig),

    @@ -196,9 +196,9 @@

    The information about Notify Definitions should be stored in a file called notify.conf.

    The corresponding table is snmpNotifyTable in the SNMP-NOTIFICATION-MIB.

    Each entry is a term:

    {NotifyName, Tag, Type}.

    • NotifyName is a unique non-empty string.
    • Tag is a string.
    • Type is trap or inform.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir     = "/tmp",
     NotifyConfig =
    -   [snmpa_conf:notify_entry("standard trap",   "std_trap",   trap),
    -    snmpa_conf:notify_entry("standard inform", "std_inform", inform)],
    -snmpa_conf:write_notify_config(AgentDir, NotifyConfig),

    + [snmpa_conf:notify_entry("standard trap", "std_trap", trap), + snmpa_conf:notify_entry("standard inform", "std_inform", inform)], +snmpa_conf:write_notify_config(AgentDir, NotifyConfig),

    @@ -215,12 +215,12 @@ configurations still work.

    Note that if EngineId has the value discovery, the agent cannot send inform messages to that manager until it has performed the discovery process with that manager.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir         = "/tmp",
    -Addr1            = {{1,2,3,4},     162},
    -Addr2            = {{11,21,31,41}, 162},
    +Addr1            = {{1,2,3,4},     162},
    +Addr2            = {{11,21,31,41}, 162},
     Timeout          = 1500,
     RetryCount       = 3,
     TargetAddrConfig =
    -   [snmpa_conf:target_addr_entry("Target 1",
    +   [snmpa_conf:target_addr_entry("Target 1",
                                      transportDomainUdpIpv4, Addr1,
     				 Timeout, RetryCount,
    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_agent_funct_descr.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_agent_funct_descr.xhtml	2025-05-10 20:19:17.061262550 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_agent_funct_descr.xhtml	2025-05-10 20:19:17.073262659 +0000
    @@ -203,7 +203,7 @@
     MIBs are always available in all contexts.

    The ASN.1 code, the Erlang source code, and the generated .hrl files for them are provided in the distribution and are placed in the directories mibs, src, and include, respectively, in the snmp application.

    The .hrl files are generated with snmpc:mib_to_hrl/1. Include these files in -your code as in the following example:

    -include_lib("snmp/include/SNMPv2-MIB.hrl").

    The initial values for the managed objects defined in these tables, are read at +your code as in the following example:

    -include_lib("snmp/include/SNMPv2-MIB.hrl").

    The initial values for the managed objects defined in these tables, are read at start-up from a set of configuration files. These are described in Configuration Files.

    @@ -364,9 +364,9 @@

    Notifications are defined in SMIv1 with the TRAP-TYPE macro in the definition of an MIB (see RFC1215). The corresponding macro in SMIv2 is NOTIFICATION-TYPE. When an application decides to send a notification, it calls one of the -following functions:

    snmpa:send_notification(Agent, Notification, Receiver
    -                       [, NotifyName, ContextName, Varbinds])
    -snmpa:send_trap(Agent, Notification, Community [, Receiver, Varbinds])

    providing the registered name or process identifier of the agent where the MIB, +following functions:

    snmpa:send_notification(Agent, Notification, Receiver
    +                       [, NotifyName, ContextName, Varbinds])
    +snmpa:send_trap(Agent, Notification, Community [, Receiver, Varbinds])

    providing the registered name or process identifier of the agent where the MIB, which defines the notification is loaded and the symbolic name of the notification.

    If the send_notification/3,4 function is used, all management targets are selected, as defined in RFC2273. The Receiver parameter defines where the /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_app.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_app.xhtml 2025-05-10 20:19:17.061262550 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_app.xhtml 2025-05-10 20:19:17.073262659 +0000 @@ -35,51 +35,51 @@

    The following configuration parameters are defined for the SNMP application. Refer to application(3) for more information about configuration parameters.

    The snmp part of the config file specifying the configuration parameters is -basically the following tuple:

          {snmp, snmp_components_config()}

    A minimal config file for starting a node with both a manager and an agent:

          [{snmp,
    -        [{agent, [{db_dir, "/tmp/snmp/agent/db"},
    -                  {config, [{dir, "/tmp/snmp/agent/conf"}]}]},
    -         {manager, [{config, [{dir, "/tmp/snmp/manager/conf"},
    -                              {db_dir, "/tmp/snmp/manager/db"}]}]}]}
    -        ]
    +basically the following tuple:

          {snmp, snmp_components_config()}

    A minimal config file for starting a node with both a manager and an agent:

          [{snmp,
    +        [{agent, [{db_dir, "/tmp/snmp/agent/db"},
    +                  {config, [{dir, "/tmp/snmp/agent/conf"}]}]},
    +         {manager, [{config, [{dir, "/tmp/snmp/manager/conf"},
    +                              {db_dir, "/tmp/snmp/manager/db"}]}]}]}
    +        ]
            }
           ].

    Each snmp component has its own set of configuration parameters, even though -some of the types are common to both components.

          snmp_components_config() -> [snmp_component_config()]
    -      snmp_component_config() -> {agent, agent_options()} | {manager, manager_options()}
    -      agent_options() = [agent_option()]
    -      agent_option() = {restart_type,     restart_type()}     |
    -                       {agent_type,       agent_type()}       |
    -                       {agent_verbosity,  verbosity()}        |
    -                       {discovery,        agent_discovery()}  |
    -                       {versions,         versions()}         |
    -                       {gb_max_vbs,       gb_max_vbs()}       |
    -                       {priority,         priority()}         |
    -                       {multi_threaded,   multi_threaded()}   |
    -                       {db_dir,           db_dir()}           |
    -                       {db_init_error,    db_init_error()}    |
    -                       {local_db,         local_db()}         |
    -                       {net_if,           agent_net_if()}     |
    -                       {mibs,             mibs()}             |
    -                       {mib_storage,      mib_storage()}      |
    -                       {mib_server,       mib_server()}       |
    -                       {audit_trail_log,  audit_trail_log()}  |
    -                       {error_report_mod, error_report_mod()} |
    -                       {note_store,       note_store()}       |
    -                       {symbolic_store,   symbolic_store()}   |
    -                       {target_cache,     target_cache()}     |
    -                       {config,           agent_config()}
    -      manager_options() = [manager_option()]
    -      manager_option() = {restart_type,             restart_type()}    |
    -                         {net_if,                   manager_net_if()}  |
    -                         {server,                   server()}          |
    -                         {note_store,               note_store()}      |
    -                         {config,                   manager_config()}  |
    -                         {inform_request_behaviour, manager_irb()}     |
    -                         {mibs,                     manager_mibs()}    |
    -                         {priority,                 priority()}        |
    -                         {audit_trail_log,          audit_trail_log()} |
    -                         {versions,                 versions()}        |
    -                         {def_user_mod,             def_user_module()  |
    -                         {def_user_data,            def_user_data()}

    Agent specific config options and types:

    • agent_type() = master | sub <optional> - If master, +some of the types are common to both components.

            snmp_components_config() -> [snmp_component_config()]
      +      snmp_component_config() -> {agent, agent_options()} | {manager, manager_options()}
      +      agent_options() = [agent_option()]
      +      agent_option() = {restart_type,     restart_type()}     |
      +                       {agent_type,       agent_type()}       |
      +                       {agent_verbosity,  verbosity()}        |
      +                       {discovery,        agent_discovery()}  |
      +                       {versions,         versions()}         |
      +                       {gb_max_vbs,       gb_max_vbs()}       |
      +                       {priority,         priority()}         |
      +                       {multi_threaded,   multi_threaded()}   |
      +                       {db_dir,           db_dir()}           |
      +                       {db_init_error,    db_init_error()}    |
      +                       {local_db,         local_db()}         |
      +                       {net_if,           agent_net_if()}     |
      +                       {mibs,             mibs()}             |
      +                       {mib_storage,      mib_storage()}      |
      +                       {mib_server,       mib_server()}       |
      +                       {audit_trail_log,  audit_trail_log()}  |
      +                       {error_report_mod, error_report_mod()} |
      +                       {note_store,       note_store()}       |
      +                       {symbolic_store,   symbolic_store()}   |
      +                       {target_cache,     target_cache()}     |
      +                       {config,           agent_config()}
      +      manager_options() = [manager_option()]
      +      manager_option() = {restart_type,             restart_type()}    |
      +                         {net_if,                   manager_net_if()}  |
      +                         {server,                   server()}          |
      +                         {note_store,               note_store()}      |
      +                         {config,                   manager_config()}  |
      +                         {inform_request_behaviour, manager_irb()}     |
      +                         {mibs,                     manager_mibs()}    |
      +                         {priority,                 priority()}        |
      +                         {audit_trail_log,          audit_trail_log()} |
      +                         {versions,                 versions()}        |
      +                         {def_user_mod,             def_user_module()  |
      +                         {def_user_data,            def_user_data()}

      Agent specific config options and types:

      • agent_type() = master | sub <optional> - If master, one master agent is started. Otherwise, no agents are started.

        Default is master.

      • agent_discovery() = [agent_discovery_opt()] <optional> - agent_discovery_opt() = {terminating, agent_terminating_discovery_opts()} | {originating, agent_originating_discovery_opts()}

        The terminating options effects discovery initiated by a manager.

        The originating options effects discovery initiated by this agent.

        For defaults see the options in agent_discovery_opt().

      • agent_terminating_discovery_opts() = [agent_terminating_discovery_opt()] <optional> - agent_terminating_discovery_opt() = {enable, boolean()} | {stage2, discovery | plain} | {trigger_username, string()}

        These are options effecting discovery terminating in this agent (i.e. /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_app_b.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_app_b.xhtml 2025-05-10 20:19:17.061262550 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_app_b.xhtml 2025-05-10 20:19:17.073262659 +0000 @@ -481,23 +481,23 @@ immediately removed." - SYNTAX INTEGER { + SYNTAX INTEGER { -- the following two values are states: -- these values may be read or written - active(1), - notInService(2), + active(1), + notInService(2), -- the following value is a state: -- this value may be read, but not written - notReady(3), + notReady(3), -- the following three values are -- actions: these values may be written, -- but are never read - createAndGo(4), - createAndWait(5), - destroy(6) - }

    +
    createAndGo(4), + createAndWait(5), + destroy(6) + }
    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_config.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_config.xhtml 2025-05-10 20:19:17.061262550 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_config.xhtml 2025-05-10 20:19:17.073262659 +0000 @@ -40,41 +40,41 @@ more information).
  • the database directory stores the internal database files.
  • The agent and manager uses (application) configuration parameters to find out where these directories are located. The parameters should be defined in an Erlang system configuration file. The following configuration parameters are -defined for the SNMP application:

          agent_options() = [agent_option()]
    -      agent_option() = {restart_type,     restart_type()}     |
    -                       {agent_type,       agent_type()}       |
    -                       {agent_verbosity,  verbosity()}        |
    -                       {versions,         versions()}         |
    -                       {discovery,        agent_discovery()}  |
    -                       {gb_max_vbs,       gb_max_vbs()}       |
    -                       {priority,         priority()}         |
    -                       {multi_threaded,   multi_threaded()}   |
    -                       {db_dir,           db_dir()}           |
    -                       {db_init_error,    db_init_error()}    |
    -                       {local_db,         local_db()}         |
    -                       {net_if,           agent_net_if()}     |
    -                       {mibs,             mibs()}             |
    -                       {mib_storage,      mib_storage()}      |
    -                       {mib_server,       mib_server()}       |
    -                       {audit_trail_log,  audit_trail_log()}  |
    -                       {error_report_mod, error_report_mod()} |
    -                       {note_store,       note_store()}       |
    -                       {symbolic_store,   symbolic_store()}   |
    -                       {target_cache,     target_cache()}     |
    -                       {config,           agent_config()}
    -      manager_options() = [manager_option()]
    -      manager_option() = {restart_type,             restart_type()}    |
    -                         {net_if,                   manager_net_if()}  |
    -                         {server,                   server()}          |
    -                         {note_store,               note_store()}      |
    -                         {config,                   manager_config()}  |
    -                         {inform_request_behaviour, manager_irb()}     |
    -                         {mibs,                     manager_mibs()}    |
    -                         {priority,                 priority()}        |
    -                         {audit_trail_log,          audit_trail_log()} |
    -                         {versions,                 versions()}        |
    -                         {def_user_mod,             def_user_module()  |
    -                         {def_user_data,            def_user_data()}

    Agent specific config options and types:

    • agent_type() = master | sub <optional> - If master, +defined for the SNMP application:

            agent_options() = [agent_option()]
      +      agent_option() = {restart_type,     restart_type()}     |
      +                       {agent_type,       agent_type()}       |
      +                       {agent_verbosity,  verbosity()}        |
      +                       {versions,         versions()}         |
      +                       {discovery,        agent_discovery()}  |
      +                       {gb_max_vbs,       gb_max_vbs()}       |
      +                       {priority,         priority()}         |
      +                       {multi_threaded,   multi_threaded()}   |
      +                       {db_dir,           db_dir()}           |
      +                       {db_init_error,    db_init_error()}    |
      +                       {local_db,         local_db()}         |
      +                       {net_if,           agent_net_if()}     |
      +                       {mibs,             mibs()}             |
      +                       {mib_storage,      mib_storage()}      |
      +                       {mib_server,       mib_server()}       |
      +                       {audit_trail_log,  audit_trail_log()}  |
      +                       {error_report_mod, error_report_mod()} |
      +                       {note_store,       note_store()}       |
      +                       {symbolic_store,   symbolic_store()}   |
      +                       {target_cache,     target_cache()}     |
      +                       {config,           agent_config()}
      +      manager_options() = [manager_option()]
      +      manager_option() = {restart_type,             restart_type()}    |
      +                         {net_if,                   manager_net_if()}  |
      +                         {server,                   server()}          |
      +                         {note_store,               note_store()}      |
      +                         {config,                   manager_config()}  |
      +                         {inform_request_behaviour, manager_irb()}     |
      +                         {mibs,                     manager_mibs()}    |
      +                         {priority,                 priority()}        |
      +                         {audit_trail_log,          audit_trail_log()} |
      +                         {versions,                 versions()}        |
      +                         {def_user_mod,             def_user_module()  |
      +                         {def_user_data,            def_user_data()}

      Agent specific config options and types:

      • agent_type() = master | sub <optional> - If master, one master agent is started. Otherwise, no agents are started.

        Default is master.

      • agent_discovery() = [agent_discovery_opt()] <optional> - agent_discovery_opt() = {terminating, agent_terminating_discovery_opts()} | {originating, agent_originating_discovery_opts()}

        The terminating options effects discovery initiated by a manager.

        The originating options effects discovery initiated by this agent.

        For defaults see the options in agent_discovery_opt().

      • agent_terminating_discovery_opts() = [agent_terminating_discovery_opt()] <optional> - agent_terminating_discovery_opt() = {enable, boolean()} | {stage2, discovery | plain} | {trigger_username, string()}

        These are options effecting discovery terminating in this agent (i.e. @@ -451,34 +451,34 @@ configuration parameters. The verbosity itself has several _levels: silence | info | log | debug | trace. For the lowest verbosity silence, nothing is printed. The higher the verbosity, the -more is printed. Default value is always silence.

        3> snmpa:verbosity(master_agent, log).
        +more is printed. Default value is always silence.

        3> snmpa:verbosity(master_agent, log).
         ok
        -5> snmpa:verbosity(net_if, log).
        +5> snmpa:verbosity(net_if, log).
         ok
         6>
         %% Example of output from the agent when a get-next-request arrives:
         ** SNMP NET-IF LOG:
        -   got packet from {147,12,12,12}:5000
        +   got packet from {147,12,12,12}:5000
         
         ** SNMP NET-IF MPD LOG:
            v1, community: all-rights
         
         ** SNMP NET-IF LOG:
        -   got pdu from {147,12,12,12}:5000 {pdu, 'get-next-request',
        +   got pdu from {147,12,12,12}:5000 {pdu, 'get-next-request',
                                                   62612569,noError,0,
        -                                          [{varbind,[1,1],'NULL','NULL',1}]}
        +                                          [{varbind,[1,1],'NULL','NULL',1}]}
         
         ** SNMP MASTER-AGENT LOG:
        -   apply: snmp_generic,variable_func,[get,{sysDescr,persistent}]
        +   apply: snmp_generic,variable_func,[get,{sysDescr,persistent}]
         
         ** SNMP MASTER-AGENT LOG:
        -   returned: {value,"Erlang SNMP agent"}
        +   returned: {value,"Erlang SNMP agent"}
         
         ** SNMP NET-IF LOG:
        -   reply pdu: {pdu,'get-response',62612569,noError,0,
        -                   [{varbind,[1,3,6,1,2,1,1,1,0],
        +   reply pdu: {pdu,'get-response',62612569,noError,0,
        +                   [{varbind,[1,3,6,1,2,1,1,1,0],
                                      'OCTET STRING',
        -                             "Erlang SNMP agent",1}]}
        +                             "Erlang SNMP agent",1}]}
         
         ** SNMP NET-IF INFO: time in agent: 19711 mysec

        Other useful function(s) for debugging the agent are:

        • snmpa:info/0,1 - info is used to retrieve a list of miscellaneous agent information.

        • snmpa:which_aliasnames/0 - /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_generic.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_generic.xhtml 2025-05-10 20:19:17.061262550 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_generic.xhtml 2025-05-10 20:19:17.073262659 +0000 @@ -35,9 +35,9 @@ | MIB | +---------------+ | - Association file (associates a MIB object with + Association file (associates a MIB object with | snmp_generic:table_funct - | snmp_generic:variable_func) + | snmp_generic:variable_func) +--------------------------------------+ | snmp_generic | Support for get-next, | | RowStatus operations @@ -45,7 +45,7 @@ | snmpa_local_db | Mnesia | Database +--------------+-------+---------------+ | dets | ets | -| (persistent) | | +| (persistent) | | +--------------+-------+

        Each function takes the argument NameDb, which is a tuple {Name, Db}, to identify which database the functions should use. Name is the symbolic name of the managed object as defined in the MIB, and Db is either volatile, @@ -57,41 +57,41 @@ this. Specifically, if variables are stored in Mnesia, the table snmp_variables must be created by the programmer. The record definition for this table is defined in the file snmp/include/snmp_types.hrl.

        If an instrumentation function in the association file for a variable myVar -does not have a name when compiling an MIB, the compiler generates an entry.

        {myVar, {snmp_generic, variable_func, [{myVar, Db]}}.

        And for a table:

        {myTable, {snmp_generic, table_func, [{myTable, Db]}}.

        +does not have a name when compiling an MIB, the compiler generates an entry.

        {myVar, {snmp_generic, variable_func, [{myVar, Db]}}.

        And for a table:

        {myTable, {snmp_generic, table_func, [{myTable, Db]}}.

        Example

        The following example shows an implementation of a table which is stored in -Mnesia, but with some checks performed at set-request operations.

        myTable_func(new, NameDb) ->   % pass unchanged
        -  snmp_generic:table_func(new, NameDb).
        +Mnesia, but with some checks performed at set-request operations.

        myTable_func(new, NameDb) ->   % pass unchanged
        +  snmp_generic:table_func(new, NameDb).
         
        -myTable_func(delete, NameDb) ->   % pass unchanged
        -  snmp_generic:table_func(delete, NameDb).
        +myTable_func(delete, NameDb) ->   % pass unchanged
        +  snmp_generic:table_func(delete, NameDb).
         
         %% change row
        -myTable_func(is_set_ok, RowIndex, Cols, NameDb) ->
        -  case snmp_generic:table_func(is_set_ok, RowIndex,
        -                               Cols, NameDb) of
        -    {noError, 0} ->
        -      myApplication:is_set_ok(RowIndex, Cols);
        +myTable_func(is_set_ok, RowIndex, Cols, NameDb) ->
        +  case snmp_generic:table_func(is_set_ok, RowIndex,
        +                               Cols, NameDb) of
        +    {noError, 0} ->
        +      myApplication:is_set_ok(RowIndex, Cols);
             Err ->
               Err
           end;
         
        -myTable_func(set, RowIndex, Cols, NameDb) ->
        -  case snmp_generic:table_func(set, RowIndex, Cols,
        -                               NameDb),
        -    {noError, 0} ->
        +myTable_func(set, RowIndex, Cols, NameDb) ->
        +  case snmp_generic:table_func(set, RowIndex, Cols,
        +                               NameDb),
        +    {noError, 0} ->
               % Now the row is updated, tell the application
        -      myApplication:update(RowIndex, Cols);
        +      myApplication:update(RowIndex, Cols);
             Err ->
               Err
           end;
         
        -myTable_func(Op, RowIndex, Cols, NameDb) ->   % pass unchanged
        -  snmp_generic:table_func(Op, RowIndex, Cols, NameDb).

        The .funcs file would look like:

        {myTable, {myModule, myTable_func, [{myTable, mnesia}]}}.
        +
        myTable_func(Op, RowIndex, Cols, NameDb) -> % pass unchanged + snmp_generic:table_func(Op, RowIndex, Cols, NameDb).

        The .funcs file would look like:

        {myTable, {myModule, myTable_func, [{myTable, mnesia}]}}.
        /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_impl_example_agent.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_impl_example_agent.xhtml 2025-05-10 20:19:17.061262550 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_impl_example_agent.xhtml 2025-05-10 20:19:17.073262659 +0000 @@ -125,54 +125,54 @@ the default implementation of it. Recall that MIBs imported by "EX1-MIB.mib" must be present and compiled in the current directory ("./STANDARD-MIB.bin","./RFC1213-MIB.bin") when compiling.

        unix> erl -config ./sys
        -1> application:start(snmp).
        +1> application:start(snmp).
         ok
        -2> snmpc:compile("EX1-MIB").
        +2> snmpc:compile("EX1-MIB").
         No accessfunction for 'friendsTable', using default.
         No accessfunction for 'myName', using default.
        -{ok, "EX1-MIB.bin"}
        -3> snmpa:load_mibs(snmp_master_agent, ["EX1-MIB"]).
        +{ok, "EX1-MIB.bin"}
        +3> snmpa:load_mibs(snmp_master_agent, ["EX1-MIB"]).
         ok

        This MIB is now loaded into the agent, and a manager can ask questions. As an example of this, we start another Erlang system and the simple Erlang manager in -the toolkit:

        1> snmp_test_mgr:start_link([{agent,"dront.ericsson.se"},{community,"all-rights"},
        +the toolkit:

        1> snmp_test_mgr:start_link([{agent,"dront.ericsson.se"},{community,"all-rights"},
          %% making it understand symbolic names: {mibs,["EX1-MIB","STANDARD-MIB"]}]).
        -{ok, <0.89.0>}
        +{ok, <0.89.0>}
         %% a get-next request with one OID.
        -2> snmp_test_mgr:gn([[1,3,6,1,3,7]]).
        +2> snmp_test_mgr:gn([[1,3,6,1,3,7]]).
         ok
         * Got PDU:
        -[myName,0] = []
        +[myName,0] = []
         %% A set-request (now using symbolic names for convenience)
        -3> snmp_test_mgr:s([{[myName,0], "Martin"}]).
        +3> snmp_test_mgr:s([{[myName,0], "Martin"}]).
         ok
         * Got PDU:
        -[myName,0] = "Martin"
        +[myName,0] = "Martin"
         %% Try the same get-next request again
        -4> snmp_test_mgr:gn([[1,3,6,1,3,7]]).
        +4> snmp_test_mgr:gn([[1,3,6,1,3,7]]).
         ok
         * Got PDU:
        -[myName,0] = "Martin"
        +[myName,0] = "Martin"
         %% ... and we got the new value.
         %% you can event do row operations. How to add a row:
        -5> snmp_test_mgr:s([{[fName,0], "Martin"}, {[fAddress,0],"home"}, {[fStatus,0],4}]).
        +5> snmp_test_mgr:s([{[fName,0], "Martin"}, {[fAddress,0],"home"}, {[fStatus,0],4}]).
          %% createAndGo
         ok
         * Got PDU:
        -[fName,0] = "Martin"
        -[fAddress,0] = "home"
        -[fStatus,0] = 4
        -6> snmp_test_mgr:gn([[myName,0]]).
        +[fName,0] = "Martin"
        +[fAddress,0] = "home"
        +[fStatus,0] = 4
        +6> snmp_test_mgr:gn([[myName,0]]).
         ok
         * Got PDU:
        -[fName,0] = "Martin"
        -7> snmp_test_mgr:gn().
        +[fName,0] = "Martin"
        +7> snmp_test_mgr:gn().
         ok
         * Got PDU:
        -[fAddress,0] = "home"
        -8> snmp_test_mgr:gn().
        +[fAddress,0] = "home"
        +8> snmp_test_mgr:gn().
         ok
         * Got PDU:
        -[fStatus,0] = 1
        +[fStatus,0] = 1
         9>

        @@ -190,55 +190,55 @@ Code

        -
        -module(ex1).
        --author('dummy@flop.org').
        +
        -module(ex1).
        +-author('dummy@flop.org').
         %% External exports
        --export([start/0, my_name/1, my_name/2, friends_table/3]).
        +-export([start/0, my_name/1, my_name/2, friends_table/3]).
         %% Internal exports
        --export([init/0]).
        --define(status_col, 4).
        --define(active, 1).
        --define(notInService, 2).
        --define(notReady, 3).
        --define(createAndGo, 4).   % Action; written, not read
        --define(createAndWait, 5). % Action; written, not read
        --define(destroy, 6).       % Action; written, not read
        -start() ->
        -    spawn(ex1, init, []).
        +-export([init/0]).
        +-define(status_col, 4).
        +-define(active, 1).
        +-define(notInService, 2).
        +-define(notReady, 3).
        +-define(createAndGo, 4).   % Action; written, not read
        +-define(createAndWait, 5). % Action; written, not read
        +-define(destroy, 6).       % Action; written, not read
        +start() ->
        +    spawn(ex1, init, []).
         %%----------------------------------------------------------------
         %% Instrumentation function for variable myName.
         %% Returns: (get) {value, Name}
         %%          (set) noError
         %%----------------------------------------------------------------
        -my_name(get) ->
        -    ex1_server ! {self(), get_my_name},
        -    Name = wait_answer(),
        -    {value, Name}.
        -my_name(set, NewName) ->
        -    ex1_server ! {self(), {set_my_name, NewName}},
        +my_name(get) ->
        +    ex1_server ! {self(), get_my_name},
        +    Name = wait_answer(),
        +    {value, Name}.
        +my_name(set, NewName) ->
        +    ex1_server ! {self(), {set_my_name, NewName}},
             noError.
         %%----------------------------------------------------------------
         %% Instrumentation function for table friendsTable.
         %%----------------------------------------------------------------
        -friends_table(get, RowIndex, Cols) ->
        -    case get_row(RowIndex) of
        -   {ok, Row} ->
        -        get_cols(Cols, Row);
        +friends_table(get, RowIndex, Cols) ->
        +    case get_row(RowIndex) of
        +   {ok, Row} ->
        +        get_cols(Cols, Row);
            _  ->
        -        {noValue, noSuchInstance}
        +        {noValue, noSuchInstance}
             end;
        -friends_table(get_next, RowIndex, Cols) ->
        -    case get_next_row(RowIndex) of
        -   {ok, Row} ->
        -        get_next_cols(Cols, Row);
        +friends_table(get_next, RowIndex, Cols) ->
        +    case get_next_row(RowIndex) of
        +   {ok, Row} ->
        +        get_next_cols(Cols, Row);
            _  ->
        -       case get_next_row([]) of
        -     {ok, Row} ->
        +       case get_next_row([]) of
        +     {ok, Row} ->
                  % Get next cols from first row.
        -         NewCols = add_one_to_cols(Cols),
        -         get_next_cols(NewCols, Row);
        +         NewCols = add_one_to_cols(Cols),
        +         get_next_cols(NewCols, Row);
              _  ->
        -        end_of_table(Cols)
        +        end_of_table(Cols)
                 end
             end;
         %%----------------------------------------------------------------
        @@ -249,158 +249,158 @@
         %%    *) Otherwise, error (for simplicity).
         %% Otherwise, row is modified; check that row exists.
         %%----------------------------------------------------------------
        -friends_table(is_set_ok, RowIndex, Cols) ->
        +friends_table(is_set_ok, RowIndex, Cols) ->
             RowExists =
        -   case get_row(RowIndex) of
        -        {ok, _Row} -> true;
        +   case get_row(RowIndex) of
        +        {ok, _Row} -> true;
                _ -> false
            end,
        -    case is_row_status_col_changed(Cols) of
        -   {true, ?destroy} when RowExists == true ->
        -        {noError, 0};
        -   {true, ?createAndGo} when RowExists == false,
        -                                 length(Cols) == 3 ->
        -        {noError, 0};
        -   {true, _} ->
        -       {inconsistentValue, ?status_col};
        +    case is_row_status_col_changed(Cols) of
        +   {true, ?destroy} when RowExists == true ->
        +        {noError, 0};
        +   {true, ?createAndGo} when RowExists == false,
        +                                 length(Cols) == 3 ->
        +        {noError, 0};
        +   {true, _} ->
        +       {inconsistentValue, ?status_col};
            false when RowExists == true ->
        -        {noError, 0};
        +        {noError, 0};
        /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_index.xhtml differs (HTML document, ASCII text, with very long lines)
        --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_index.xhtml	2025-05-10 20:19:17.061262550 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_index.xhtml	2025-05-10 20:19:17.073262659 +0000
        @@ -30,13 +30,13 @@
         actual implementation of the table. The SNMP ordering, that is implementation of
         GET NEXT, is implemented in this module.

        For example, suppose there is an SNMP table, which is best implemented in Erlang as one process per SNMP table row. Suppose further that the INDEX in the SNMP -table is an OCTET STRING. The index structure would be created as follows:

        snmp_index:new(string)

        For each new process we create, we insert an item in an snmp_index structure:

        new_process(Name, SnmpIndex) ->
        -  Pid = start_process(),
        +table is an OCTET STRING. The index structure would be created as follows:

        snmp_index:new(string)

        For each new process we create, we insert an item in an snmp_index structure:

        new_process(Name, SnmpIndex) ->
        +  Pid = start_process(),
           NewSnmpIndex =
        -    snmp_index:insert(SnmpIndex, Name, Pid),
        +    snmp_index:insert(SnmpIndex, Name, Pid),
           <...>

        With this structure, we can now map an OBJECT IDENTIFIER in e.g. a GET NEXT -request, to the correct process:

        get_next_pid(Oid, SnmpIndex) ->
        -  {ok, {_, Pid}} = snmp_index:get_next(SnmpIndex, Oid),
        +request, to the correct process:

        get_next_pid(Oid, SnmpIndex) ->
        +  {ok, {_, Pid}} = snmp_index:get_next(SnmpIndex, Oid),
           Pid.

        /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_instr_functions.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_instr_functions.xhtml 2025-05-10 20:19:17.061262550 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_instr_functions.xhtml 2025-05-10 20:19:17.073262659 +0000 @@ -48,8 +48,8 @@ New / Delete Operations

        -

        For scalar variables:

        variable_access(new [, ExtraArg1, ...])
        -variable_access(delete [, ExtraArg1, ...])

        For tables:

        table_access(new [, ExtraArg1, ...])
        +

        For scalar variables:

        variable_access(new [, ExtraArg1, ...])
        +variable_access(delete [, ExtraArg1, ...])

        For tables:

        table_access(new [, ExtraArg1, ...])
         table_access(delete [, ExtraArg1, ...])

        These functions are called for each object in an MIB when the MIB is unloaded or loaded, respectively.

        @@ -109,9 +109,9 @@ value 1, and [3, 5] is the list of requested columns. The function should now return the lexicographically next elements:

        [{[3, 1, 2], d}, {[5, 1, 2], f}]

        This is illustrated in the following table:

        GetNext from [3,1,1] and [5,1,1].

        The manager now issues the following getNext request:

        getNext{ myTable.myTableEntry.3.2.1,
                  myTable.myTableEntry.5.2.1 }

        This is transformed into one call to my_table:

        my_table(get_next, [2, 1], [3, 5])

        The function should now return:

        [{[4, 1, 1], b}, endOfTable]

        This is illustrated in the following table:

        GetNext from [3,2,1] and [5,2,1].

        The manager now issues the following getNext request:

        getNext{ myTable.myTableEntry.3.1.2,
        -         myTable.myTableEntry.4.1.2 }

        This will be transform into one call to my_table:

        my_table(get_next, [1, 2], [3, 4])

        The function should now return:

        [{[3, 2, 1], g}, {[5, 1, 1], c}]

        This is illustrated in the following table:

        GetNext from [3,1,2] and [4,1,2].

        The manager now issues the following getNext request:

        getNext{ myTable.myTableEntry,
        -         myTable.myTableEntry.1.3.2 }

        This will be transform into two calls to my_table:

        my_table(get_next, [], [0]) and
        -my_table(get_next, [3, 2], [1])

        The function should now return:

        [{[3, 1, 1], a}] and
        +         myTable.myTableEntry.4.1.2 }

        This will be transform into one call to my_table:

        my_table(get_next, [1, 2], [3, 4])

        The function should now return:

        [{[3, 2, 1], g}, {[5, 1, 1], c}]

        This is illustrated in the following table:

        GetNext from [3,1,2] and [4,1,2].

        The manager now issues the following getNext request:

        getNext{ myTable.myTableEntry,
        +         myTable.myTableEntry.1.3.2 }

        This will be transform into two calls to my_table:

        my_table(get_next, [], [0]) and
        +my_table(get_next, [3, 2], [1])

        The function should now return:

        [{[3, 1, 1], a}] and
         [{[3, 1, 1], a}]

        In both cases, the first accessible element in the table should be returned. As the key columns are not accessible, this means that the third column is the first row.

        Note

        Normally, the functions described above behave exactly as shown, but they are @@ -128,17 +128,17 @@ variables for a device, ipAdr and name with object identifiers 1.1.23.4 and 1.1.7 respectively. To access these variables, one could implement the two Erlang functions ip_access and name_access, which will be in the MIB. The -functions could be specified in a text file as follows:

        {ipAdr, {my_module, ip_access, []}}.
        +functions could be specified in a text file as follows:

        {ipAdr, {my_module, ip_access, []}}.
         % Or using the oid syntax for 'name'
        -{[1,1,7], {my_module, name_access, []}}.

        The ExtraArgument parameter is the empty list. For example, when the agent +{[1,1,7], {my_module, name_access, []}}.

        The ExtraArgument parameter is the empty list. For example, when the agent receives a get-request for the ipAdr variable, a call will be made to ip_access(get). The value returned by this function is the answer to the get-request.

        If ip_access and name_access are implemented similarly, we could write a -generic_access function using the ListOfExtraArguments:

        {ipAdr, {my_module, generic_access, ['IPADR']}}.
        +generic_access function using the ListOfExtraArguments:

        {ipAdr, {my_module, generic_access, ['IPADR']}}.
         % The mnemonic 'name' is more convenient than 1.1.7
        -{name, {my_module, generic_access, ['NAME']}}.

        When the agent receives the same get-request as above, a call will be made to -generic_access(get,'IPADR').

        Yet another possibility, closer to the hardware, could be:

        {ipAdr, {my_module, generic_access, [16#2543]}}.
        -{name, {my_module, generic_access, [16#A2B3]}}.

        +{name, {my_module, generic_access, ['NAME']}}.

        When the agent receives the same get-request as above, a call will be made to +generic_access(get,'IPADR').

        Yet another possibility, closer to the hardware, could be:

        {ipAdr, {my_module, generic_access, [16#2543]}}.
        +{name, {my_module, generic_access, [16#A2B3]}}.

        /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_manager_config_files.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_manager_config_files.xhtml 2025-05-10 20:19:17.061262550 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_manager_config_files.xhtml 2025-05-10 20:19:17.073262659 +0000 @@ -44,22 +44,22 @@ every transport.

      • engine_id - The SnmpEngineID as defined in SNMP-FRAMEWORK-MIB. Mandatory.

      • max_message_size - The snmpEngineMaxMessageSize as defined in SNMP-FRAMEWORK-MIB. Mandatory.

    • Value is the value for the variable.

    The legacy and intermediate variables address and domain are still supported -so old configurations will work.

    The following example shows a manager.conf file:

    {transports,       [{transportDomainUdpIpv4, {{141,213,11,24}, 5000}},
    -                    {transportDomainUdpIpv6, {{0,0,0,0,0,0,0,1}, 5000}}]}.
    -{engine_id,        "mgrEngine"}.
    -{max_message_size, 484}.

    The value of engine_id is a string, which should have a very specific +so old configurations will work.

    The following example shows a manager.conf file:

    {transports,       [{transportDomainUdpIpv4, {{141,213,11,24}, 5000}},
    +                    {transportDomainUdpIpv6, {{0,0,0,0,0,0,0,1}, 5000}}]}.
    +{engine_id,        "mgrEngine"}.
    +{max_message_size, 484}.

    The value of engine_id is a string, which should have a very specific structure. See RFC 2271/2571 for details.

    And this is a code (snippet) example of how to generate this file in runtime:

    ManagerDir    = "/tmp",
     Port          = 5000,
    -Addr4         = {141,213,11,24},
    -Addr6         = {0,0,0,0,0,0,0,1},
    -Transports    = [{transportDomainUdpIpv4, {Addr4, Port}},
    -                 {transportDomainUdpIpv6, {Addr6, Port}}],
    +Addr4         = {141,213,11,24},
    +Addr6         = {0,0,0,0,0,0,0,1},
    +Transports    = [{transportDomainUdpIpv4, {Addr4, Port}},
    +                 {transportDomainUdpIpv6, {Addr6, Port}}],
     EngineID      = "mgrEngine",
     MMS           = 484,
    -ManagerConfig = [snmpm_conf:manager_entry(transports,       Transports),
    -                 snmpm_conf:manager_entry(engine_id,        EngineID),
    -                 snmpm_conf:manager_entry(max_message_size, MMS)],
    -snmpm_conf:write_manager_config(ManagerDir, ManagerConfig),

    +ManagerConfig = [snmpm_conf:manager_entry(transports, Transports), + snmpm_conf:manager_entry(engine_id, EngineID), + snmpm_conf:manager_entry(max_message_size, MMS)], +snmpm_conf:write_manager_config(ManagerDir, ManagerConfig),

    @@ -69,13 +69,13 @@ either added in the users.conf config file or by calling the register_user function in run-time.

    Each row defines a manager user of the manager.

    Each entry is a tuple of size four:

    {UserId, UserMod, UserData, DefaultAgentConfig}.

    • UserId is any term (used to uniquely identify the user).
    • UserMod is the user callback module (atom).
    • UserData is any term (passed on to the user when calling the UserMod.
    • DefaultAgentConfig is a list of default agent config's. These values are used as default values when this user registers agents.

    And this is a code (snippet) example of how to generate this file in runtime:

    ManagerDir         = "/tmp",
    -UserID             = make_ref(),
    +UserID             = make_ref(),
     UserMod            = my_manager_callback_mod,
    -UserData           = self(),
    -DefaultAgentConfig = [{version, v1}, {timeout, 2500}, {max_message_size, 484}],
    -UsersConfig = [snmpm_conf:users_entry(UserID, UserMod, UserData,
    -                                      DefaultAgentConfig)],
    -snmpm_conf:write_users_config(ManagerDir, UsersConfig),

    +UserData = self(), +DefaultAgentConfig = [{version, v1}, {timeout, 2500}, {max_message_size, 484}], +UsersConfig = [snmpm_conf:users_entry(UserID, UserMod, UserData, + DefaultAgentConfig)], +snmpm_conf:write_users_config(ManagerDir, UsersConfig),

    @@ -93,23 +93,23 @@ (integer).
  • Version is the version (v1 | v2 | v3).

  • SecModel is the security model (any | v1 | v2c | usm).

  • SecName is the security name (string).
  • SecLevel is security level (noAuthNoPriv | authNoPriv | authPriv).

  • Legacy configurations using tuples without Domain element, as well as with all TDomain, Ip and Port elements still work.

    And this is a code (snippet) example of how to generate this file in runtime:

    ManagerDir   = "/tmp",
     UserID       = ...
    -AgentsConfig = [snmpm_conf:agents_entry(UserID,
    +AgentsConfig = [snmpm_conf:agents_entry(UserID,
                                             "target 1",
     					"FOOBAR",
    -					transportDomainUdpIpv4, {{1,2,3,4},161},
    +					transportDomainUdpIpv4, {{1,2,3,4},161},
     					"agent Engine 1"
     					1500,
     					484.
    -					v1, v1, "sec name 1", noAuthNoPriv),
    -		snmpm_conf:agents_entry(UserID,
    +					v1, v1, "sec name 1", noAuthNoPriv),
    +		snmpm_conf:agents_entry(UserID,
                                             "target 2",
     					"FOOBAR",
    -					transportDomainUdpIpv4, {{5,6,7,8},161},
    +					transportDomainUdpIpv4, {{5,6,7,8},161},
     					"agent Engine 2"
     					1500,
     					1000.
    -					v1, v1, "sec name 2", noAuthNoPriv)],
    -snmpm_conf:write_agents_config(ManagerDir, UsersConfig),

    + v1, v1, "sec name 2", noAuthNoPriv)], +snmpm_conf:write_agents_config(ManagerDir, UsersConfig),

    @@ -128,13 +128,13 @@ usmAesCfb128Protocol.

  • PrivKey is a list (of integer). This is the User's secret localized encryption key. It is not visible in the MIB. The length of this key needs to be 16 if usmDESPrivProtocol or usmAesCfb128Protocol is used.

  • ManagerDir = "/tmp",
    -UsmConfig  = [snmpm_conf:usm_entry("engine",
    +UsmConfig  = [snmpm_conf:usm_entry("engine",
                                        "user 1",
     	                           usmNoAuthProtocol,
    -	 			   [],
    +	 			   [],
     	 			   usmNoPrivProtocol,
    -	 			   [])],
    -snmpm_conf:write_usm_config(ManagerDir, UsmConfig),
    + [])], +snmpm_conf:write_usm_config(ManagerDir, UsmConfig), /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_mib_compiler.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_mib_compiler.xhtml 2025-05-10 20:19:17.061262550 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_mib_compiler.xhtml 2025-05-10 20:19:17.073262659 +0000 @@ -36,7 +36,7 @@ association file, it gives a warning message and uses default instrumentation functions. (See Default Instrumentation for more details).

    The MIB compiler is started with a call to snmpc:compile(<mibname>). For -example:

    snmpc:compile("RFC1213-MIB").

    The output is a new file which is called <mibname>.bin.

    The MIB compiler understands both SMIv1 and SMIv2 MIBs. It uses the +example:

    snmpc:compile("RFC1213-MIB").

    The output is a new file which is called <mibname>.bin.

    The MIB compiler understands both SMIv1 and SMIv2 MIBs. It uses the MODULE-IDENTITY statement to determinate if the MIB is written in SMI version 1 or 2.

    @@ -48,10 +48,10 @@ compiled file and not the ASN.1 (source) file. A MIB must be recompiled to make changes visible to other MIBs importing it.

    The compiled files of the imported MIBs must be present in the current directory, or a directory in the current path. The path is supplied with the -{i, Path} option, for example:

    snmpc:compile("MY-MIB",
    -       [{i, ["friend_mibs/", "../standard_mibs/"]}]).

    It is also possible to import MIBs from OTP applications in an "include_lib" -like fashion with the il option. Example:

    snmpc:compile("MY-MIB",
    -       [{il, ["snmp/priv/mibs/", "myapp/priv/mibs/"]}]).

    finds the latest version of the snmp and myapp applications in the OTP +{i, Path} option, for example:

    snmpc:compile("MY-MIB",
    +       [{i, ["friend_mibs/", "../standard_mibs/"]}]).

    It is also possible to import MIBs from OTP applications in an "include_lib" +like fashion with the il option. Example:

    snmpc:compile("MY-MIB",
    +       [{il, ["snmp/priv/mibs/", "myapp/priv/mibs/"]}]).

    finds the latest version of the snmp and myapp applications in the OTP system and uses the expanded paths as include paths.

    Note that an SMIv2 MIB can import an SMIv1 MIB and vice versa.

    The following MIBs are built-ins of the Erlang SNMP compiler: SNMPv2-SMI, RFC-1215, RFC-1212, SNMPv2-TC, SNMPv2-CONF, and RFC1155-SMI. They cannot therefore be compiled separately.

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_pdus.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_pdus.xhtml 2025-05-10 20:19:17.057262514 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmp_pdus.xhtml 2025-05-10 20:19:17.073262659 +0000 @@ -29,8 +29,8 @@ Erlang record representations and vice versa. The record definitions can be found in the file snmp/include/snmp_types.hrl. If snmpv3 is used, the module that includes snmp_types.hrl must define the constant SNMP_USE_V3 before the -header file is included. Example:

    -define(SNMP_USE_V3, true).
    --include_lib("snmp/include/snmp_types.hrl").

    Encoding and decoding must be done explicitly when writing your own Net if +header file is included. Example:

    -define(SNMP_USE_V3, true).
    +-include_lib("snmp/include/snmp_types.hrl").

    Encoding and decoding must be done explicitly when writing your own Net if process.

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmpa.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmpa.xhtml 2025-05-10 20:19:17.057262514 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmpa.xhtml 2025-05-10 20:19:17.069262623 +0000 @@ -3214,8 +3214,8 @@

    Load a single Mib into an agent. The MibName is the name of the Mib, -including the path to where the compiled mib is found. For example:

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    -          snmpa:load_mib(snmp_master_agent, Dir ++ "MY-MIB").
    +including the path to where the compiled mib is found. For example:

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    +          snmpa:load_mib(snmp_master_agent, Dir ++ "MY-MIB").
    @@ -3331,8 +3331,8 @@

    Load Mibs into an agent. If the agent cannot load all MIBs (the default value of the Force argument is false), it will indicate where loading was aborted. The MibName is the name of the Mib, including the path to where the compiled -mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    -          snmpa:load_mibs(snmp_master_agent, [Dir ++ "MY-MIB"]).

    If Force = true then the agent will continue attempting to load each mib even +mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    +          snmpa:load_mibs(snmp_master_agent, [Dir ++ "MY-MIB"]).

    If Force = true then the agent will continue attempting to load each mib even after failing to load a previous mib. Use with care.

    @@ -4358,8 +4358,8 @@ -

    Accepted type specifications are:

    -spec register_notification_filter(Agent, Id, Mod, Data) -> ok | {error, Reason}.
    --spec register_notification_filter(Id, Mod, Data, Where) -> ok | {error, Reason}.
    +

    Accepted type specifications are:

    -spec register_notification_filter(Agent, Id, Mod, Data) -> ok | {error, Reason}.
    +-spec register_notification_filter(Id, Mod, Data, Where) -> ok | {error, Reason}.
    @@ -4432,8 +4432,8 @@

    Registers a sub-agent under a sub-tree of another agent.

    It is easy to make mistakes when registering sub-agents and this activity should be done carefully. For example, a strange behaviour would result from the -following configuration:

    snmp_agent:register_subagent(MAPid,[1,2,3,4],SA1),
    -snmp_agent:register_subagent(SA1,[1,2,3], SA2).

    SA2 will not get requests starting with object identifier [1,2,3] since +following configuration:

    snmp_agent:register_subagent(MAPid,[1,2,3,4],SA1),
    +snmp_agent:register_subagent(SA1,[1,2,3], SA2).

    SA2 will not get requests starting with object identifier [1,2,3] since SA1 does not.

    @@ -4878,20 +4878,20 @@ Addresses and if there are no targets for which an Inform-Request is sent, Addresses is the empty list [].

    The receiver will first be sent the snmp_targets message, and then for each address in Addresses list, one of the two snmp_notification messages.

  • {Mod, Func, Args} - The info will be delivered via the function call:

    Mod:Func([Msg | Args])

    where Msg has the same content and purpose as the messages descrived above.

  • Address is a management target address and Addresses is a list of management -target addresses. They are defined as followes:

            Addresses  = [address()]
    -        Address    = address()
    -        address()  = v1_address() | v3_address()
    -        v1_address() = {TDomain, TAddress}
    -        v3_address() = {{TDomain, TAddress}, V3MsgData}
    -        TDomain    = tdoamin()
    -        TAddress   = taddress()
    -        tdomain()  = The oid of snmpUDPDomain
    +target addresses. They are defined as followes:

            Addresses  = [address()]
    +        Address    = address()
    +        address()  = v1_address() | v3_address()
    +        v1_address() = {TDomain, TAddress}
    +        v3_address() = {{TDomain, TAddress}, V3MsgData}
    +        TDomain    = tdoamin()
    +        TAddress   = taddress()
    +        tdomain()  = The oid of snmpUDPDomain
                          This is the only supported transport domain.
    -        taddress() = [A1, A2, A3, A4, P1, P3]
    +        taddress() = [A1, A2, A3, A4, P1, P3]
                          The 4 first bytes makes up the IP-address and the last 2,
                          the UDP-port number.
    -        V3MsgData  = v3_msg_data()
    -        v3_msg_data() = term()

    If Receiver is a notification_delivery_info/0 record, then the information + V3MsgData = v3_msg_data() + v3_msg_data() = term()

    If Receiver is a notification_delivery_info/0 record, then the information about the notification delivery will be delivered to the receiver via the callback functions defined by the snmpa_notification_delivery_info_receiver behaviour according to the content of the notification_delivery_info/0 /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmpc_cmd.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmpc_cmd.xhtml 2025-05-10 20:19:17.053262478 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmpc_cmd.xhtml 2025-05-10 20:19:17.069262623 +0000 @@ -26,7 +26,7 @@ Synopsis

    -
    snmpc [options] file.mib | file.bin

    +
    snmpc [options] file.mib | file.bin

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmpm.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmpm.xhtml 2025-05-10 20:19:17.053262478 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.epub/OEBPS/snmpm.xhtml 2025-05-10 20:19:17.069262623 +0000 @@ -1887,8 +1887,8 @@

    Load a Mib into the manager. The MibName is the name of the Mib, including -the path to where the compiled mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    -          snmpm:load_mib(Dir ++ "MY-MIB").
    +the path to where the compiled mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    +          snmpm:load_mib(Dir ++ "MY-MIB").
    @@ -3467,8 +3467,8 @@

    Unload a Mib from the manager. The MibName is the name of the Mib, including -the path to where the compiled mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    -          snmpm:unload_mib(Dir ++ "MY-MIB").
    +the path to where the compiled mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    +          snmpm:unload_mib(Dir ++ "MY-MIB").
    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.html 2025-05-10 20:19:17.401265633 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp.html 2025-05-10 20:19:17.425265851 +0000 @@ -3343,8 +3343,8 @@

    Utility function(s) to produce a formatted printout of the versions info -generated by the versions1 function

    This is the same as doing, e.g.:

               {ok, V} = snmp:versions1(),
    -           snmp:print_versions(V).
    +generated by the versions1 function

    This is the same as doing, e.g.:

               {ok, V} = snmp:versions1(),
    +           snmp:print_versions(V).
    @@ -3542,17 +3542,17 @@

    This function is used to set up trace on function(s) for the given module or modules.

    The example below sets up trace on the exported functions (default) of module snmp_generic and all functions of module snmp_generic_mnesia. With return -values (which is default) and timestamps in both cases (which is also default):

    	  snmp:enable_trace(),
    -	  snmp:set_trace([snmp_generic,
    -                          {snmp_generic_mnesia, [{scope, all_functions}]}]),
    +values (which is default) and timestamps in both cases (which is also default):

    	  snmp:enable_trace(),
    +	  snmp:set_trace([snmp_generic,
    +                          {snmp_generic_mnesia, [{scope, all_functions}]}]),
     	  .
     	  .
     	  .
    -          snmp:set_trace(snmp_generic, disable),
    +          snmp:set_trace(snmp_generic, disable),
     	  .
     	  .
     	  .
    -	  snmp:disable_trace(),
    +
    snmp:disable_trace(),
    @@ -3946,7 +3946,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_advanced_agent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_advanced_agent.html 2025-05-10 20:19:17.449266068 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_advanced_agent.html 2025-05-10 20:19:17.453266105 +0000 @@ -329,16 +329,16 @@ empName DisplayString, empTelNo DisplayString, empStatus RowStatus - }

    The corresponding Mnesia table is specified as follows:

    mnesia:create_table([{name, employees},
    -                     {snmp, [{key, {integer, string}}]},
    -                     {attributes, [key, telno, row_status]}]).

    Note

    In the Mnesia tables, the two key columns are stored as a tuple with two + }

    The corresponding Mnesia table is specified as follows:

    mnesia:create_table([{name, employees},
    +                     {snmp, [{key, {integer, string}}]},
    +                     {attributes, [key, telno, row_status]}]).

    Note

    In the Mnesia tables, the two key columns are stored as a tuple with two elements. Therefore, the arity of the table is 3.

    Instrumentation Functions

    -

    The MIB table shown in the previous section can be compiled as follows:

    1> snmpc:compile("EmpMIB", [{db, mnesia}]).

    This is all that has to be done! Now the manager can read, add, and modify +

    The MIB table shown in the previous section can be compiled as follows:

    1> snmpc:compile("EmpMIB", [{db, mnesia}]).

    This is all that has to be done! Now the manager can read, add, and modify rows. Also, you can use the ordinary Mnesia API to access the table from your programs. The only explicit action is to create the Mnesia table, an action the user has to perform in order to create the required table schemas.

    @@ -350,11 +350,11 @@

    It is often necessary to take some specific action when a table is modified. This is accomplished with an instrumentation function. It executes some specific code when the table is set, and passes all other requests down to the -pre-defined function.

    The following example illustrates this idea:

    emp_table(set, RowIndex, Cols) ->
    -    notify_internal_resources(RowIndex, Cols),
    -    snmp_generic:table_func(set, RowIndex, Cols, {empTable, mnesia});
    -emp_table(Op, RowIndex, Cols) ->
    -    snmp_generic:table_func(Op, RowIndex, Cols, {empTable, mnesia}).

    The default instrumentation functions are defined in the module snmp_generic. +pre-defined function.

    The following example illustrates this idea:

    emp_table(set, RowIndex, Cols) ->
    +    notify_internal_resources(RowIndex, Cols),
    +    snmp_generic:table_func(set, RowIndex, Cols, {empTable, mnesia});
    +emp_table(Op, RowIndex, Cols) ->
    +    snmp_generic:table_func(Op, RowIndex, Cols, {empTable, mnesia}).

    The default instrumentation functions are defined in the module snmp_generic. Refer to the Reference Manual, section SNMP, module snmp_generic for details.

    @@ -367,28 +367,28 @@ that the agent does not know about. This situation is handled by adding values for the internal columns in the set function.

    To illustrate this, suppose we extend our Mnesia empTable with one internal column. We create it as before, but with an arity of 4, by adding another -attribute.

    mnesia:create_table([{name, employees},
    -                     {snmp, [{key, {integer, string}}]},
    -                     {attributes, {key, telno, row_status, internal_col}}]).

    The last column is the internal column. When performing a set operation, which +attribute.

    mnesia:create_table([{name, employees},
    +                     {snmp, [{key, {integer, string}}]},
    +                     {attributes, {key, telno, row_status, internal_col}}]).

    The last column is the internal column. When performing a set operation, which creates a row, we must give a value to the internal column. The instrumentation -functions will now look as follows:

    -define(createAndGo, 4).
    --define(createAndWait, 5).
    +functions will now look as follows:

    -define(createAndGo, 4).
    +-define(createAndWait, 5).
     
    -emp_table(set, RowIndex, Cols) ->
    -  notify_internal_resources(RowIndex, Cols),
    +emp_table(set, RowIndex, Cols) ->
    +  notify_internal_resources(RowIndex, Cols),
       NewCols =
    -    case is_row_created(empTable, Cols) of
    -      true -> Cols ++ [{4, "internal"}]; % add internal column
    +    case is_row_created(empTable, Cols) of
    +      true -> Cols ++ [{4, "internal"}]; % add internal column
           false -> Cols                      % keep original cols
       end,
    -  snmp_generic:table_func(set, RowIndex, NewCols, {empTable, mnesia});
    -emp_table(Op, RowIndex, Cols) ->
    -  snmp_generic:table_func(Op, RowIndex, Cols, {empTable, mnesia}).
    -
    -is_row_created(Name, Cols) ->
    -  case snmp_generic:get_status_col(Name, Cols) of
    -    {ok, ?createAndGo} -> true;
    -    {ok, ?createAndWait} -> true;
    +  snmp_generic:table_func(set, RowIndex, NewCols, {empTable, mnesia});
    +emp_table(Op, RowIndex, Cols) ->
    +  snmp_generic:table_func(Op, RowIndex, Cols, {empTable, mnesia}).
    +
    +is_row_created(Name, Cols) ->
    +  case snmp_generic:get_status_col(Name, Cols) of
    +    {ok, ?createAndGo} -> true;
    +    {ok, ?createAndWait} -> true;
         _ -> false
       end.

    If a row is created, we always set the internal column to "internal".

    @@ -457,7 +457,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_agent_config_files.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_agent_config_files.html 2025-05-10 20:19:17.481266358 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_agent_config_files.html 2025-05-10 20:19:17.485266395 +0000 @@ -150,30 +150,30 @@

    The agent information should be stored in a file called agent.conf.

    Each entry is a tuple of size two:

    {AgentVariable, Value}.

    • AgentVariable is one of the variables in SNMP-FRAMEWORK-MIB or one of the internal variables intAgentUDPPort, which defines which UDP port the agent listens to, or intAgentTransports, which defines the transport domains and -addresses of the agent.
    • Value is the value for the variable.

    The following example shows an agent.conf file:

    {intAgentUDPPort, 4000}.
    -{intAgentTransports,
    - [{transportDomainUdpIpv4, {141,213,11,24}},
    -  {transportDomainUdpIpv6, {0,0,0,0,0,0,0,1}}]}.
    -{snmpEngineID, "mbj's engine"}.
    -{snmpEngineMaxMessageSize, 484}.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir    = "/tmp",
    +addresses of the agent.
  • Value is the value for the variable.
  • The following example shows an agent.conf file:

    {intAgentUDPPort, 4000}.
    +{intAgentTransports,
    + [{transportDomainUdpIpv4, {141,213,11,24}},
    +  {transportDomainUdpIpv6, {0,0,0,0,0,0,0,1}}]}.
    +{snmpEngineID, "mbj's engine"}.
    +{snmpEngineMaxMessageSize, 484}.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir    = "/tmp",
     AgentPort   = 4000,
    -Transports  = [{transportDomainUdpIpv4, {141,213,11,24}},
    -               {transportDomainUdpIpv6, {0,0,0,0,0,0,0,1}}],
    +Transports  = [{transportDomainUdpIpv4, {141,213,11,24}},
    +               {transportDomainUdpIpv6, {0,0,0,0,0,0,0,1}}],
     EngineID    = "mbj's engine",
     MMS         = 484,
     AgentConfig =
    -   [snmpa_conf:agent_entry(intAgentUDPPort,          AgentPort),
    -    snmpa_conf:agent_entry(intAgentTransports,       Transports),
    -    snmpa_conf:agent_entry(snmpEngineID,             EngineID),
    -    snmpa_conf:agent_entry(snmpEngineMaxMessageSize, MMS)],
    -snmpa_conf:write_agent_config(AgentDir, AgentConfig),

    These are the supported entries and their value types:

          {snmpEngine,               string()}.                     % Mandatory
    -      {snmpEngineMaxMessageSize, snmp_framework_mib:max_message_size()}.  % Mandatory
    -      {intAgentUDPPort,          inet:port_number()}.                      % Optional
    -      {intAgentTransports,       [snmpa_conf:intAgentTransport()]}.   % Mandatory

    If a "traditional" transport is specified (without explicit Kind, handling + [snmpa_conf:agent_entry(intAgentUDPPort, AgentPort), + snmpa_conf:agent_entry(intAgentTransports, Transports), + snmpa_conf:agent_entry(snmpEngineID, EngineID), + snmpa_conf:agent_entry(snmpEngineMaxMessageSize, MMS)], +snmpa_conf:write_agent_config(AgentDir, AgentConfig),

    These are the supported entries and their value types:

          {snmpEngine,               string()}.                     % Mandatory
    +      {snmpEngineMaxMessageSize, snmp_framework_mib:max_message_size()}.  % Mandatory
    +      {intAgentUDPPort,          inet:port_number()}.                      % Optional
    +      {intAgentTransports,       [snmpa_conf:intAgentTransport()]}.   % Mandatory

    If a "traditional" transport is specified (without explicit Kind, handling both requests and traps) for a transport domain, its not possible to also specify a transport (for that domain) with a specific Kind. This is for -example, not allowed:

     [{transportDomainUdpIpv4, {{141,213,11,24}, 4000}},
    -  {transportDomainUdpIpv4, {{141,213,11,24}, 4001}, trap_sender}].

    Note that only one transport per kind for each transport domain can be +example, not allowed:

     [{transportDomainUdpIpv4, {{141,213,11,24}, 4000}},
    +  {transportDomainUdpIpv4, {{141,213,11,24}, 4001}, trap_sender}].

    Note that only one transport per kind for each transport domain can be configured.

    PortInfo system is used to indicate that the 'system' should choose (the way port number '0' (zero) is normally used). Port info '0' (zero) cannot be used for this, since it is (internally) used to represent the 'default' port number.

    In the traditional transport entries, when the Addr value does not contain a @@ -194,29 +194,29 @@ default context "" need not be present.

    Each row defines a context in the agent. This information is used in the table vacmContextTable in the SNMP-VIEW-BASED-ACM-MIB.

    Each entry is a term:

    ContextName.

    • ContextName is a string.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir      = "/tmp",
     ContextConfig =
    -   [snmpa_conf:context_entry("foo"),
    -    snmpa_conf:context_entry("bar")],
    -snmpa_conf:write_context_config(AgentDir, ContextConfig),

    + [snmpa_conf:context_entry("foo"), + snmpa_conf:context_entry("bar")], +snmpa_conf:write_context_config(AgentDir, ContextConfig),

    System Information

    The system information should be stored in a file called standard.conf.

    Each entry is a tuple of size two:

    {SystemVariable, Value}.

    • SystemVariable is one of the variables in the system group, or -snmpEnableAuthenTraps.
    • Value is the value for the variable.

    The following example shows a valid standard.conf file:

    {sysDescr, "Erlang SNMP agent"}.
    -{sysObjectID, [1,2,3]}.
    -{sysContact, "(mbj,eklas)@erlang.ericsson.se"}.
    -{sysName, "test"}.
    -{sysServices, 72}.
    -{snmpEnableAuthenTraps, enabled}.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir  = "/tmp",
    +snmpEnableAuthenTraps.
  • Value is the value for the variable.
  • The following example shows a valid standard.conf file:

    {sysDescr, "Erlang SNMP agent"}.
    +{sysObjectID, [1,2,3]}.
    +{sysContact, "(mbj,eklas)@erlang.ericsson.se"}.
    +{sysName, "test"}.
    +{sysServices, 72}.
    +{snmpEnableAuthenTraps, enabled}.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir  = "/tmp",
     StdConfig =
    -   [snmpa_conf:standard_entry(sysDescr,    "Erlang SNMP agent"),
    -    snmpa_conf:standard_entry(sysObjectID, [1,2,3]),
    -    snmpa_conf:standard_entry(sysContact,  "(mbj,eklas)@erlang.ericsson.se"),
    -    snmpa_conf:standard_entry(sysName,     "test"),
    -    snmpa_conf:standard_entry(sysServices, 72),
    -    snmpa_conf:standard_entry(snmpEnableAuthenTraps, enabled)],
    -snmpa_conf:write_standard_config(AgentDir, StdConfig),

    A value must be provided for all variables, which lack default values in the + [snmpa_conf:standard_entry(sysDescr, "Erlang SNMP agent"), + snmpa_conf:standard_entry(sysObjectID, [1,2,3]), + snmpa_conf:standard_entry(sysContact, "(mbj,eklas)@erlang.ericsson.se"), + snmpa_conf:standard_entry(sysName, "test"), + snmpa_conf:standard_entry(sysServices, 72), + snmpa_conf:standard_entry(snmpEnableAuthenTraps, enabled)], +snmpa_conf:write_standard_config(AgentDir, StdConfig),

    A value must be provided for all variables, which lack default values in the MIB.

    @@ -227,11 +227,11 @@ must be present if the agent is configured for SNMPv1 or SNMPv2c.

    An SNMP community is a relationship between an SNMP agent and a set of SNMP managers that defines authentication, access control and proxy characteristics.

    The corresponding table is snmpCommunityTable in the SNMP-COMMUNITY-MIB.

    Each entry is a term:

    {CommunityIndex, CommunityName, SecurityName, ContextName, TransportTag}.

    • CommunityIndex is a non-empty string.
    • CommunityName is a string.
    • SecurityName is a string.
    • ContextName is a string.
    • TransportTag is a string.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir        = "/tmp",
     CommunityConfig =
    -   [snmpa_conf:community_entry("public"),
    -    snmpa_conf:community_entry("all-rights"),
    -    snmpa_conf:community_entry("standard trap",
    -                               "standard trap", "initial", "", "")],
    -snmpa_conf:write_community_config(AgentDir, CommunityConfig),

    + [snmpa_conf:community_entry("public"), + snmpa_conf:community_entry("all-rights"), + snmpa_conf:community_entry("standard trap", + "standard trap", "initial", "", "")], +snmpa_conf:write_community_config(AgentDir, CommunityConfig),

    @@ -246,17 +246,17 @@ regarded as all ones. null is shorthand for a mask with all ones.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir   = "/tmp",
     SecName    = "plain",
     VacmConfig =
    -   [%%                        SecModel, SecName, GroupName
    -    snmpa_conf:vacm_s2g_entry(usm, SecName, SecName),
    +   [%%                        SecModel, SecName, GroupName
    +    snmpa_conf:vacm_s2g_entry(usm, SecName, SecName),
     
         %%                        GroupName, Prefix, SecModel,
    -    snmpa_conf:vacm_acc_entry(SecName, "", any,
    +    snmpa_conf:vacm_acc_entry(SecName, "", any,
         %%                        SecLevel, Match, RV, WV, NV
    -                              noAuthNoPriv, exact, "all", "all", "all"),
    +                              noAuthNoPriv, exact, "all", "all", "all"),
     
         %%                        ViewName, ViewSubtree, ViewType, ViewMask
    -    snmpa_conf:vacm_vtf_entry("restricted", [1,3,6,1], included, null)],
    -snmpa_conf:write_vacm_config(AgentDir, VacmConfig),

    + snmpa_conf:vacm_vtf_entry("restricted", [1,3,6,1], included, null)], +snmpa_conf:write_vacm_config(AgentDir, VacmConfig),

    @@ -275,24 +275,24 @@ be 16 if usmDESPrivProtocol or usmAesCfb128Protocol is used.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir  = "/tmp",
     EngineID  = "plain engine"
     Passwd    = "FooBar Hoopla", %% This should *obviously* be choosen better
    -Secret16  = snmp:passwd2localized_key(md5, Passwd, EngineID),
    -Secret20  = snmp:passwd2localized_key(sha, Passwd, EngineID),
    +Secret16  = snmp:passwd2localized_key(md5, Passwd, EngineID),
    +Secret20  = snmp:passwd2localized_key(sha, Passwd, EngineID),
     UsmConfig =
    -   [snmpa_conf:usm_entry(EngineID, "initial", "initial", zeroDotZero,
    +   [snmpa_conf:usm_entry(EngineID, "initial", "initial", zeroDotZero,
                              usmHMACMD5AuthProtocol, "", "",
                              usmNoPrivProtocol, "", "",
    -                         "", Secret16, ""),
    +                         "", Secret16, ""),
     
    -    snmpa_conf:usm_entry(EngineID, "templateMD5", "templateMD5", zeroDotZero,
    +    snmpa_conf:usm_entry(EngineID, "templateMD5", "templateMD5", zeroDotZero,
                              usmHMACMD5AuthProtocol, "", "",
                              usmDESPrivProtocol, "", "",
    -                         "", Secret16, Secret16),
    +                         "", Secret16, Secret16),
     
    -    snmpa_conf:usm_entry(EngineID, "templateSHA", "templateSHA", zeroDotZero,
    +    snmpa_conf:usm_entry(EngineID, "templateSHA", "templateSHA", zeroDotZero,
                              usmHMACSHAAuthProtocol, "", "",
                              usmAesCfb128Protocol, "", "",
    -                         "", Secret20, Secret16)],
    -snmpa_conf:write_usm_config(AgentDir, UsmConfig),

    + "", Secret20, Secret16)], +snmpa_conf:write_usm_config(AgentDir, UsmConfig),

    @@ -301,9 +301,9 @@

    The information about Notify Definitions should be stored in a file called notify.conf.

    The corresponding table is snmpNotifyTable in the SNMP-NOTIFICATION-MIB.

    Each entry is a term:

    {NotifyName, Tag, Type}.

    • NotifyName is a unique non-empty string.
    • Tag is a string.
    • Type is trap or inform.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir     = "/tmp",
     NotifyConfig =
    -   [snmpa_conf:notify_entry("standard trap",   "std_trap",   trap),
    -    snmpa_conf:notify_entry("standard inform", "std_inform", inform)],
    -snmpa_conf:write_notify_config(AgentDir, NotifyConfig),

    + [snmpa_conf:notify_entry("standard trap", "std_trap", trap), + snmpa_conf:notify_entry("standard inform", "std_inform", inform)], +snmpa_conf:write_notify_config(AgentDir, NotifyConfig),

    @@ -320,12 +320,12 @@ configurations still work.

    Note that if EngineId has the value discovery, the agent cannot send inform messages to that manager until it has performed the discovery process with that manager.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir         = "/tmp",
    -Addr1            = {{1,2,3,4},     162},
    -Addr2            = {{11,21,31,41}, 162},
    +Addr1            = {{1,2,3,4},     162},
    +Addr2            = {{11,21,31,41}, 162},
     Timeout          = 1500,
     RetryCount       = 3,
     TargetAddrConfig =
    -   [snmpa_conf:target_addr_entry("Target 1",
    +   [snmpa_conf:target_addr_entry("Target 1",
                                      transportDomainUdpIpv4, Addr1,
     				 Timeout, RetryCount,
    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_agent_funct_descr.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_agent_funct_descr.html	2025-05-10 20:19:17.513266648 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_agent_funct_descr.html	2025-05-10 20:19:17.521266721 +0000
    @@ -308,7 +308,7 @@
     MIBs are always available in all contexts.

    The ASN.1 code, the Erlang source code, and the generated .hrl files for them are provided in the distribution and are placed in the directories mibs, src, and include, respectively, in the snmp application.

    The .hrl files are generated with snmpc:mib_to_hrl/1. Include these files in -your code as in the following example:

    -include_lib("snmp/include/SNMPv2-MIB.hrl").

    The initial values for the managed objects defined in these tables, are read at +your code as in the following example:

    -include_lib("snmp/include/SNMPv2-MIB.hrl").

    The initial values for the managed objects defined in these tables, are read at start-up from a set of configuration files. These are described in Configuration Files.

    @@ -469,9 +469,9 @@

    Notifications are defined in SMIv1 with the TRAP-TYPE macro in the definition of an MIB (see RFC1215). The corresponding macro in SMIv2 is NOTIFICATION-TYPE. When an application decides to send a notification, it calls one of the -following functions:

    snmpa:send_notification(Agent, Notification, Receiver
    -                       [, NotifyName, ContextName, Varbinds])
    -snmpa:send_trap(Agent, Notification, Community [, Receiver, Varbinds])

    providing the registered name or process identifier of the agent where the MIB, +following functions:

    snmpa:send_notification(Agent, Notification, Receiver
    +                       [, NotifyName, ContextName, Varbinds])
    +snmpa:send_trap(Agent, Notification, Community [, Receiver, Varbinds])

    providing the registered name or process identifier of the agent where the MIB, which defines the notification is loaded and the symbolic name of the notification.

    If the send_notification/3,4 function is used, all management targets are selected, as defined in RFC2273. The Receiver parameter defines where the @@ -615,7 +615,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_agent_netif.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_agent_netif.html 2025-05-10 20:19:17.541266902 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_agent_netif.html 2025-05-10 20:19:17.545266938 +0000 @@ -267,7 +267,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_app.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_app.html 2025-05-10 20:19:17.577267229 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_app.html 2025-05-10 20:19:17.585267301 +0000 @@ -140,51 +140,51 @@

    The following configuration parameters are defined for the SNMP application. Refer to application(3) for more information about configuration parameters.

    The snmp part of the config file specifying the configuration parameters is -basically the following tuple:

          {snmp, snmp_components_config()}

    A minimal config file for starting a node with both a manager and an agent:

          [{snmp,
    -        [{agent, [{db_dir, "/tmp/snmp/agent/db"},
    -                  {config, [{dir, "/tmp/snmp/agent/conf"}]}]},
    -         {manager, [{config, [{dir, "/tmp/snmp/manager/conf"},
    -                              {db_dir, "/tmp/snmp/manager/db"}]}]}]}
    -        ]
    +basically the following tuple:

          {snmp, snmp_components_config()}

    A minimal config file for starting a node with both a manager and an agent:

          [{snmp,
    +        [{agent, [{db_dir, "/tmp/snmp/agent/db"},
    +                  {config, [{dir, "/tmp/snmp/agent/conf"}]}]},
    +         {manager, [{config, [{dir, "/tmp/snmp/manager/conf"},
    +                              {db_dir, "/tmp/snmp/manager/db"}]}]}]}
    +        ]
            }
           ].

    Each snmp component has its own set of configuration parameters, even though -some of the types are common to both components.

          snmp_components_config() -> [snmp_component_config()]
    -      snmp_component_config() -> {agent, agent_options()} | {manager, manager_options()}
    -      agent_options() = [agent_option()]
    -      agent_option() = {restart_type,     restart_type()}     |
    -                       {agent_type,       agent_type()}       |
    -                       {agent_verbosity,  verbosity()}        |
    -                       {discovery,        agent_discovery()}  |
    -                       {versions,         versions()}         |
    -                       {gb_max_vbs,       gb_max_vbs()}       |
    -                       {priority,         priority()}         |
    -                       {multi_threaded,   multi_threaded()}   |
    -                       {db_dir,           db_dir()}           |
    -                       {db_init_error,    db_init_error()}    |
    -                       {local_db,         local_db()}         |
    -                       {net_if,           agent_net_if()}     |
    -                       {mibs,             mibs()}             |
    -                       {mib_storage,      mib_storage()}      |
    -                       {mib_server,       mib_server()}       |
    -                       {audit_trail_log,  audit_trail_log()}  |
    -                       {error_report_mod, error_report_mod()} |
    -                       {note_store,       note_store()}       |
    -                       {symbolic_store,   symbolic_store()}   |
    -                       {target_cache,     target_cache()}     |
    -                       {config,           agent_config()}
    -      manager_options() = [manager_option()]
    -      manager_option() = {restart_type,             restart_type()}    |
    -                         {net_if,                   manager_net_if()}  |
    -                         {server,                   server()}          |
    -                         {note_store,               note_store()}      |
    -                         {config,                   manager_config()}  |
    -                         {inform_request_behaviour, manager_irb()}     |
    -                         {mibs,                     manager_mibs()}    |
    -                         {priority,                 priority()}        |
    -                         {audit_trail_log,          audit_trail_log()} |
    -                         {versions,                 versions()}        |
    -                         {def_user_mod,             def_user_module()  |
    -                         {def_user_data,            def_user_data()}

    Agent specific config options and types:

    • agent_type() = master | sub <optional> - If master, +some of the types are common to both components.

            snmp_components_config() -> [snmp_component_config()]
      +      snmp_component_config() -> {agent, agent_options()} | {manager, manager_options()}
      +      agent_options() = [agent_option()]
      +      agent_option() = {restart_type,     restart_type()}     |
      +                       {agent_type,       agent_type()}       |
      +                       {agent_verbosity,  verbosity()}        |
      +                       {discovery,        agent_discovery()}  |
      +                       {versions,         versions()}         |
      +                       {gb_max_vbs,       gb_max_vbs()}       |
      +                       {priority,         priority()}         |
      +                       {multi_threaded,   multi_threaded()}   |
      +                       {db_dir,           db_dir()}           |
      +                       {db_init_error,    db_init_error()}    |
      +                       {local_db,         local_db()}         |
      +                       {net_if,           agent_net_if()}     |
      +                       {mibs,             mibs()}             |
      +                       {mib_storage,      mib_storage()}      |
      +                       {mib_server,       mib_server()}       |
      +                       {audit_trail_log,  audit_trail_log()}  |
      +                       {error_report_mod, error_report_mod()} |
      +                       {note_store,       note_store()}       |
      +                       {symbolic_store,   symbolic_store()}   |
      +                       {target_cache,     target_cache()}     |
      +                       {config,           agent_config()}
      +      manager_options() = [manager_option()]
      +      manager_option() = {restart_type,             restart_type()}    |
      +                         {net_if,                   manager_net_if()}  |
      +                         {server,                   server()}          |
      +                         {note_store,               note_store()}      |
      +                         {config,                   manager_config()}  |
      +                         {inform_request_behaviour, manager_irb()}     |
      +                         {mibs,                     manager_mibs()}    |
      +                         {priority,                 priority()}        |
      +                         {audit_trail_log,          audit_trail_log()} |
      +                         {versions,                 versions()}        |
      +                         {def_user_mod,             def_user_module()  |
      +                         {def_user_data,            def_user_data()}

      Agent specific config options and types:

      • agent_type() = master | sub <optional> - If master, one master agent is started. Otherwise, no agents are started.

        Default is master.

      • agent_discovery() = [agent_discovery_opt()] <optional> - agent_discovery_opt() = {terminating, agent_terminating_discovery_opts()} | {originating, agent_originating_discovery_opts()}

        The terminating options effects discovery initiated by a manager.

        The originating options effects discovery initiated by this agent.

        For defaults see the options in agent_discovery_opt().

      • agent_terminating_discovery_opts() = [agent_terminating_discovery_opt()] <optional> - agent_terminating_discovery_opt() = {enable, boolean()} | {stage2, discovery | plain} | {trigger_username, string()}

        These are options effecting discovery terminating in this agent (i.e. @@ -425,7 +425,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_app_a.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_app_a.html 2025-05-10 20:19:17.605267482 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_app_a.html 2025-05-10 20:19:17.609267519 +0000 @@ -183,7 +183,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_app_b.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_app_b.html 2025-05-10 20:19:17.633267736 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_app_b.html 2025-05-10 20:19:17.633267736 +0000 @@ -586,23 +586,23 @@ immediately removed." - SYNTAX INTEGER { + SYNTAX INTEGER { -- the following two values are states: -- these values may be read or written - active(1), - notInService(2), + active(1), + notInService(2), -- the following value is a state: -- this value may be read, but not written - notReady(3), + notReady(3), -- the following three values are -- actions: these values may be written, -- but are never read - createAndGo(4), - createAndWait(5), - destroy(6) - }
    +
    createAndGo(4), + createAndWait(5), + destroy(6) + }
    @@ -653,7 +653,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_app_c.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_app_c.html 2025-05-10 20:19:17.657267954 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_app_c.html 2025-05-10 20:19:17.657267954 +0000 @@ -190,7 +190,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_audit_trail_log.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_audit_trail_log.html 2025-05-10 20:19:17.677268135 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_audit_trail_log.html 2025-05-10 20:19:17.681268172 +0000 @@ -202,7 +202,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_community_mib.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_community_mib.html 2025-05-10 20:19:17.701268352 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_community_mib.html 2025-05-10 20:19:17.705268389 +0000 @@ -619,7 +619,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_config.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_config.html 2025-05-10 20:19:17.741268716 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_config.html 2025-05-10 20:19:17.757268860 +0000 @@ -145,41 +145,41 @@ more information).
  • the database directory stores the internal database files.
  • The agent and manager uses (application) configuration parameters to find out where these directories are located. The parameters should be defined in an Erlang system configuration file. The following configuration parameters are -defined for the SNMP application:

          agent_options() = [agent_option()]
    -      agent_option() = {restart_type,     restart_type()}     |
    -                       {agent_type,       agent_type()}       |
    -                       {agent_verbosity,  verbosity()}        |
    -                       {versions,         versions()}         |
    -                       {discovery,        agent_discovery()}  |
    -                       {gb_max_vbs,       gb_max_vbs()}       |
    -                       {priority,         priority()}         |
    -                       {multi_threaded,   multi_threaded()}   |
    -                       {db_dir,           db_dir()}           |
    -                       {db_init_error,    db_init_error()}    |
    -                       {local_db,         local_db()}         |
    -                       {net_if,           agent_net_if()}     |
    -                       {mibs,             mibs()}             |
    -                       {mib_storage,      mib_storage()}      |
    -                       {mib_server,       mib_server()}       |
    -                       {audit_trail_log,  audit_trail_log()}  |
    -                       {error_report_mod, error_report_mod()} |
    -                       {note_store,       note_store()}       |
    -                       {symbolic_store,   symbolic_store()}   |
    -                       {target_cache,     target_cache()}     |
    -                       {config,           agent_config()}
    -      manager_options() = [manager_option()]
    -      manager_option() = {restart_type,             restart_type()}    |
    -                         {net_if,                   manager_net_if()}  |
    -                         {server,                   server()}          |
    -                         {note_store,               note_store()}      |
    -                         {config,                   manager_config()}  |
    -                         {inform_request_behaviour, manager_irb()}     |
    -                         {mibs,                     manager_mibs()}    |
    -                         {priority,                 priority()}        |
    -                         {audit_trail_log,          audit_trail_log()} |
    -                         {versions,                 versions()}        |
    -                         {def_user_mod,             def_user_module()  |
    -                         {def_user_data,            def_user_data()}

    Agent specific config options and types:

    • agent_type() = master | sub <optional> - If master, +defined for the SNMP application:

            agent_options() = [agent_option()]
      +      agent_option() = {restart_type,     restart_type()}     |
      +                       {agent_type,       agent_type()}       |
      +                       {agent_verbosity,  verbosity()}        |
      +                       {versions,         versions()}         |
      +                       {discovery,        agent_discovery()}  |
      +                       {gb_max_vbs,       gb_max_vbs()}       |
      +                       {priority,         priority()}         |
      +                       {multi_threaded,   multi_threaded()}   |
      +                       {db_dir,           db_dir()}           |
      +                       {db_init_error,    db_init_error()}    |
      +                       {local_db,         local_db()}         |
      +                       {net_if,           agent_net_if()}     |
      +                       {mibs,             mibs()}             |
      +                       {mib_storage,      mib_storage()}      |
      +                       {mib_server,       mib_server()}       |
      +                       {audit_trail_log,  audit_trail_log()}  |
      +                       {error_report_mod, error_report_mod()} |
      +                       {note_store,       note_store()}       |
      +                       {symbolic_store,   symbolic_store()}   |
      +                       {target_cache,     target_cache()}     |
      +                       {config,           agent_config()}
      +      manager_options() = [manager_option()]
      +      manager_option() = {restart_type,             restart_type()}    |
      +                         {net_if,                   manager_net_if()}  |
      +                         {server,                   server()}          |
      +                         {note_store,               note_store()}      |
      +                         {config,                   manager_config()}  |
      +                         {inform_request_behaviour, manager_irb()}     |
      +                         {mibs,                     manager_mibs()}    |
      +                         {priority,                 priority()}        |
      +                         {audit_trail_log,          audit_trail_log()} |
      +                         {versions,                 versions()}        |
      +                         {def_user_mod,             def_user_module()  |
      +                         {def_user_data,            def_user_data()}

      Agent specific config options and types:

      • agent_type() = master | sub <optional> - If master, one master agent is started. Otherwise, no agents are started.

        Default is master.

      • agent_discovery() = [agent_discovery_opt()] <optional> - agent_discovery_opt() = {terminating, agent_terminating_discovery_opts()} | {originating, agent_originating_discovery_opts()}

        The terminating options effects discovery initiated by a manager.

        The originating options effects discovery initiated by this agent.

        For defaults see the options in agent_discovery_opt().

      • agent_terminating_discovery_opts() = [agent_terminating_discovery_opt()] <optional> - agent_terminating_discovery_opt() = {enable, boolean()} | {stage2, discovery | plain} | {trigger_username, string()}

        These are options effecting discovery terminating in this agent (i.e. @@ -556,34 +556,34 @@ configuration parameters. The verbosity itself has several _levels: silence | info | log | debug | trace. For the lowest verbosity silence, nothing is printed. The higher the verbosity, the -more is printed. Default value is always silence.

        3> snmpa:verbosity(master_agent, log).
        +more is printed. Default value is always silence.

        3> snmpa:verbosity(master_agent, log).
         ok
        -5> snmpa:verbosity(net_if, log).
        +5> snmpa:verbosity(net_if, log).
         ok
         6>
         %% Example of output from the agent when a get-next-request arrives:
         ** SNMP NET-IF LOG:
        -   got packet from {147,12,12,12}:5000
        +   got packet from {147,12,12,12}:5000
         
         ** SNMP NET-IF MPD LOG:
            v1, community: all-rights
         
         ** SNMP NET-IF LOG:
        -   got pdu from {147,12,12,12}:5000 {pdu, 'get-next-request',
        +   got pdu from {147,12,12,12}:5000 {pdu, 'get-next-request',
                                                   62612569,noError,0,
        -                                          [{varbind,[1,1],'NULL','NULL',1}]}
        +                                          [{varbind,[1,1],'NULL','NULL',1}]}
         
         ** SNMP MASTER-AGENT LOG:
        -   apply: snmp_generic,variable_func,[get,{sysDescr,persistent}]
        +   apply: snmp_generic,variable_func,[get,{sysDescr,persistent}]
         
         ** SNMP MASTER-AGENT LOG:
        -   returned: {value,"Erlang SNMP agent"}
        +   returned: {value,"Erlang SNMP agent"}
         
         ** SNMP NET-IF LOG:
        -   reply pdu: {pdu,'get-response',62612569,noError,0,
        -                   [{varbind,[1,3,6,1,2,1,1,1,0],
        +   reply pdu: {pdu,'get-response',62612569,noError,0,
        +                   [{varbind,[1,3,6,1,2,1,1,1,0],
                                      'OCTET STRING',
        -                             "Erlang SNMP agent",1}]}
        +                             "Erlang SNMP agent",1}]}
         
         ** SNMP NET-IF INFO: time in agent: 19711 mysec

        Other useful function(s) for debugging the agent are:

        • snmpa:info/0,1 - info is used to retrieve a list of miscellaneous agent information.

        • snmpa:which_aliasnames/0 - @@ -650,7 +650,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_def_instr_functions.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_def_instr_functions.html 2025-05-10 20:19:17.777269042 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_def_instr_functions.html 2025-05-10 20:19:17.781269078 +0000 @@ -368,7 +368,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_framework_mib.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_framework_mib.html 2025-05-10 20:19:17.801269259 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_framework_mib.html 2025-05-10 20:19:17.805269296 +0000 @@ -618,7 +618,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_generic.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_generic.html 2025-05-10 20:19:17.833269549 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_generic.html 2025-05-10 20:19:17.841269622 +0000 @@ -140,9 +140,9 @@ | MIB | +---------------+ | - Association file (associates a MIB object with + Association file (associates a MIB object with | snmp_generic:table_funct - | snmp_generic:variable_func) + | snmp_generic:variable_func) +--------------------------------------+ | snmp_generic | Support for get-next, | | RowStatus operations @@ -150,7 +150,7 @@ | snmpa_local_db | Mnesia | Database +--------------+-------+---------------+ | dets | ets | -| (persistent) | | +| (persistent) | | +--------------+-------+

        Each function takes the argument NameDb, which is a tuple {Name, Db}, to identify which database the functions should use. Name is the symbolic name of the managed object as defined in the MIB, and Db is either volatile, @@ -162,41 +162,41 @@ this. Specifically, if variables are stored in Mnesia, the table snmp_variables must be created by the programmer. The record definition for this table is defined in the file snmp/include/snmp_types.hrl.

        If an instrumentation function in the association file for a variable myVar -does not have a name when compiling an MIB, the compiler generates an entry.

        {myVar, {snmp_generic, variable_func, [{myVar, Db]}}.

        And for a table:

        {myTable, {snmp_generic, table_func, [{myTable, Db]}}.

        +does not have a name when compiling an MIB, the compiler generates an entry.

        {myVar, {snmp_generic, variable_func, [{myVar, Db]}}.

        And for a table:

        {myTable, {snmp_generic, table_func, [{myTable, Db]}}.

        Example

        The following example shows an implementation of a table which is stored in -Mnesia, but with some checks performed at set-request operations.

        myTable_func(new, NameDb) ->   % pass unchanged
        -  snmp_generic:table_func(new, NameDb).
        +Mnesia, but with some checks performed at set-request operations.

        myTable_func(new, NameDb) ->   % pass unchanged
        +  snmp_generic:table_func(new, NameDb).
         
        -myTable_func(delete, NameDb) ->   % pass unchanged
        -  snmp_generic:table_func(delete, NameDb).
        +myTable_func(delete, NameDb) ->   % pass unchanged
        +  snmp_generic:table_func(delete, NameDb).
         
         %% change row
        -myTable_func(is_set_ok, RowIndex, Cols, NameDb) ->
        -  case snmp_generic:table_func(is_set_ok, RowIndex,
        -                               Cols, NameDb) of
        -    {noError, 0} ->
        -      myApplication:is_set_ok(RowIndex, Cols);
        +myTable_func(is_set_ok, RowIndex, Cols, NameDb) ->
        +  case snmp_generic:table_func(is_set_ok, RowIndex,
        +                               Cols, NameDb) of
        +    {noError, 0} ->
        +      myApplication:is_set_ok(RowIndex, Cols);
             Err ->
               Err
           end;
         
        -myTable_func(set, RowIndex, Cols, NameDb) ->
        -  case snmp_generic:table_func(set, RowIndex, Cols,
        -                               NameDb),
        -    {noError, 0} ->
        +myTable_func(set, RowIndex, Cols, NameDb) ->
        +  case snmp_generic:table_func(set, RowIndex, Cols,
        +                               NameDb),
        +    {noError, 0} ->
               % Now the row is updated, tell the application
        -      myApplication:update(RowIndex, Cols);
        +      myApplication:update(RowIndex, Cols);
             Err ->
               Err
           end;
         
        -myTable_func(Op, RowIndex, Cols, NameDb) ->   % pass unchanged
        -  snmp_generic:table_func(Op, RowIndex, Cols, NameDb).

        The .funcs file would look like:

        {myTable, {myModule, myTable_func, [{myTable, mnesia}]}}.
        +
        myTable_func(Op, RowIndex, Cols, NameDb) -> % pass unchanged + snmp_generic:table_func(Op, RowIndex, Cols, NameDb).

        The .funcs file would look like:

        {myTable, {myModule, myTable_func, [{myTable, mnesia}]}}.

    @@ -965,7 +965,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_impl_example_agent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_impl_example_agent.html 2025-05-10 20:19:17.873269911 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_impl_example_agent.html 2025-05-10 20:19:17.885270021 +0000 @@ -230,54 +230,54 @@ the default implementation of it. Recall that MIBs imported by "EX1-MIB.mib" must be present and compiled in the current directory ("./STANDARD-MIB.bin","./RFC1213-MIB.bin") when compiling.

    unix> erl -config ./sys
    -1> application:start(snmp).
    +1> application:start(snmp).
     ok
    -2> snmpc:compile("EX1-MIB").
    +2> snmpc:compile("EX1-MIB").
     No accessfunction for 'friendsTable', using default.
     No accessfunction for 'myName', using default.
    -{ok, "EX1-MIB.bin"}
    -3> snmpa:load_mibs(snmp_master_agent, ["EX1-MIB"]).
    +{ok, "EX1-MIB.bin"}
    +3> snmpa:load_mibs(snmp_master_agent, ["EX1-MIB"]).
     ok

    This MIB is now loaded into the agent, and a manager can ask questions. As an example of this, we start another Erlang system and the simple Erlang manager in -the toolkit:

    1> snmp_test_mgr:start_link([{agent,"dront.ericsson.se"},{community,"all-rights"},
    +the toolkit:

    1> snmp_test_mgr:start_link([{agent,"dront.ericsson.se"},{community,"all-rights"},
      %% making it understand symbolic names: {mibs,["EX1-MIB","STANDARD-MIB"]}]).
    -{ok, <0.89.0>}
    +{ok, <0.89.0>}
     %% a get-next request with one OID.
    -2> snmp_test_mgr:gn([[1,3,6,1,3,7]]).
    +2> snmp_test_mgr:gn([[1,3,6,1,3,7]]).
     ok
     * Got PDU:
    -[myName,0] = []
    +[myName,0] = []
     %% A set-request (now using symbolic names for convenience)
    -3> snmp_test_mgr:s([{[myName,0], "Martin"}]).
    +3> snmp_test_mgr:s([{[myName,0], "Martin"}]).
     ok
     * Got PDU:
    -[myName,0] = "Martin"
    +[myName,0] = "Martin"
     %% Try the same get-next request again
    -4> snmp_test_mgr:gn([[1,3,6,1,3,7]]).
    +4> snmp_test_mgr:gn([[1,3,6,1,3,7]]).
     ok
     * Got PDU:
    -[myName,0] = "Martin"
    +[myName,0] = "Martin"
     %% ... and we got the new value.
     %% you can event do row operations. How to add a row:
    -5> snmp_test_mgr:s([{[fName,0], "Martin"}, {[fAddress,0],"home"}, {[fStatus,0],4}]).
    +5> snmp_test_mgr:s([{[fName,0], "Martin"}, {[fAddress,0],"home"}, {[fStatus,0],4}]).
      %% createAndGo
     ok
     * Got PDU:
    -[fName,0] = "Martin"
    -[fAddress,0] = "home"
    -[fStatus,0] = 4
    -6> snmp_test_mgr:gn([[myName,0]]).
    +[fName,0] = "Martin"
    +[fAddress,0] = "home"
    +[fStatus,0] = 4
    +6> snmp_test_mgr:gn([[myName,0]]).
     ok
     * Got PDU:
    -[fName,0] = "Martin"
    -7> snmp_test_mgr:gn().
    +[fName,0] = "Martin"
    +7> snmp_test_mgr:gn().
     ok
     * Got PDU:
    -[fAddress,0] = "home"
    -8> snmp_test_mgr:gn().
    +[fAddress,0] = "home"
    +8> snmp_test_mgr:gn().
     ok
     * Got PDU:
    -[fStatus,0] = 1
    +[fStatus,0] = 1
     9>

    @@ -295,55 +295,55 @@ Code

    -
    -module(ex1).
    --author('dummy@flop.org').
    +
    -module(ex1).
    +-author('dummy@flop.org').
     %% External exports
    --export([start/0, my_name/1, my_name/2, friends_table/3]).
    +-export([start/0, my_name/1, my_name/2, friends_table/3]).
     %% Internal exports
    --export([init/0]).
    --define(status_col, 4).
    --define(active, 1).
    --define(notInService, 2).
    --define(notReady, 3).
    --define(createAndGo, 4).   % Action; written, not read
    --define(createAndWait, 5). % Action; written, not read
    --define(destroy, 6).       % Action; written, not read
    -start() ->
    -    spawn(ex1, init, []).
    +-export([init/0]).
    +-define(status_col, 4).
    +-define(active, 1).
    +-define(notInService, 2).
    +-define(notReady, 3).
    +-define(createAndGo, 4).   % Action; written, not read
    +-define(createAndWait, 5). % Action; written, not read
    +-define(destroy, 6).       % Action; written, not read
    +start() ->
    +    spawn(ex1, init, []).
     %%----------------------------------------------------------------
     %% Instrumentation function for variable myName.
     %% Returns: (get) {value, Name}
     %%          (set) noError
     %%----------------------------------------------------------------
    -my_name(get) ->
    -    ex1_server ! {self(), get_my_name},
    -    Name = wait_answer(),
    -    {value, Name}.
    -my_name(set, NewName) ->
    -    ex1_server ! {self(), {set_my_name, NewName}},
    +my_name(get) ->
    +    ex1_server ! {self(), get_my_name},
    +    Name = wait_answer(),
    +    {value, Name}.
    +my_name(set, NewName) ->
    +    ex1_server ! {self(), {set_my_name, NewName}},
         noError.
     %%----------------------------------------------------------------
     %% Instrumentation function for table friendsTable.
     %%----------------------------------------------------------------
    -friends_table(get, RowIndex, Cols) ->
    -    case get_row(RowIndex) of
    -   {ok, Row} ->
    -        get_cols(Cols, Row);
    +friends_table(get, RowIndex, Cols) ->
    +    case get_row(RowIndex) of
    +   {ok, Row} ->
    +        get_cols(Cols, Row);
        _  ->
    -        {noValue, noSuchInstance}
    +        {noValue, noSuchInstance}
         end;
    -friends_table(get_next, RowIndex, Cols) ->
    -    case get_next_row(RowIndex) of
    -   {ok, Row} ->
    -        get_next_cols(Cols, Row);
    +friends_table(get_next, RowIndex, Cols) ->
    +    case get_next_row(RowIndex) of
    +   {ok, Row} ->
    +        get_next_cols(Cols, Row);
        _  ->
    -       case get_next_row([]) of
    -     {ok, Row} ->
    +       case get_next_row([]) of
    +     {ok, Row} ->
              % Get next cols from first row.
    -         NewCols = add_one_to_cols(Cols),
    -         get_next_cols(NewCols, Row);
    +         NewCols = add_one_to_cols(Cols),
    +         get_next_cols(NewCols, Row);
          _  ->
    -        end_of_table(Cols)
    +        end_of_table(Cols)
             end
         end;
     %%----------------------------------------------------------------
    @@ -354,158 +354,158 @@
     %%    *) Otherwise, error (for simplicity).
     %% Otherwise, row is modified; check that row exists.
     %%----------------------------------------------------------------
    -friends_table(is_set_ok, RowIndex, Cols) ->
    +friends_table(is_set_ok, RowIndex, Cols) ->
         RowExists =
    -   case get_row(RowIndex) of
    -        {ok, _Row} -> true;
    +   case get_row(RowIndex) of
    +        {ok, _Row} -> true;
            _ -> false
        end,
    -    case is_row_status_col_changed(Cols) of
    -   {true, ?destroy} when RowExists == true ->
    -        {noError, 0};
    -   {true, ?createAndGo} when RowExists == false,
    -                                 length(Cols) == 3 ->
    -        {noError, 0};
    -   {true, _} ->
    -       {inconsistentValue, ?status_col};
    +    case is_row_status_col_changed(Cols) of
    +   {true, ?destroy} when RowExists == true ->
    +        {noError, 0};
    +   {true, ?createAndGo} when RowExists == false,
    +                                 length(Cols) == 3 ->
    +        {noError, 0};
    +   {true, _} ->
    +       {inconsistentValue, ?status_col};
        false when RowExists == true ->
    -        {noError, 0};
    +        {noError, 0};
    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_impl_example_manager.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_impl_example_manager.html	2025-05-10 20:19:17.905270202 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_impl_example_manager.html	2025-05-10 20:19:17.909270239 +0000
    @@ -193,7 +193,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_index.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_index.html 2025-05-10 20:19:17.929270419 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_index.html 2025-05-10 20:19:17.937270493 +0000 @@ -135,13 +135,13 @@ actual implementation of the table. The SNMP ordering, that is implementation of GET NEXT, is implemented in this module.

    For example, suppose there is an SNMP table, which is best implemented in Erlang as one process per SNMP table row. Suppose further that the INDEX in the SNMP -table is an OCTET STRING. The index structure would be created as follows:

    snmp_index:new(string)

    For each new process we create, we insert an item in an snmp_index structure:

    new_process(Name, SnmpIndex) ->
    -  Pid = start_process(),
    +table is an OCTET STRING. The index structure would be created as follows:

    snmp_index:new(string)

    For each new process we create, we insert an item in an snmp_index structure:

    new_process(Name, SnmpIndex) ->
    +  Pid = start_process(),
       NewSnmpIndex =
    -    snmp_index:insert(SnmpIndex, Name, Pid),
    +    snmp_index:insert(SnmpIndex, Name, Pid),
       <...>

    With this structure, we can now map an OBJECT IDENTIFIER in e.g. a GET NEXT -request, to the correct process:

    get_next_pid(Oid, SnmpIndex) ->
    -  {ok, {_, Pid}} = snmp_index:get_next(SnmpIndex, Oid),
    +request, to the correct process:

    get_next_pid(Oid, SnmpIndex) ->
    +  {ok, {_, Pid}} = snmp_index:get_next(SnmpIndex, Oid),
       Pid.

    @@ -795,7 +795,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_instr_functions.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_instr_functions.html 2025-05-10 20:19:17.961270710 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_instr_functions.html 2025-05-10 20:19:17.965270746 +0000 @@ -153,8 +153,8 @@ New / Delete Operations

    -

    For scalar variables:

    variable_access(new [, ExtraArg1, ...])
    -variable_access(delete [, ExtraArg1, ...])

    For tables:

    table_access(new [, ExtraArg1, ...])
    +

    For scalar variables:

    variable_access(new [, ExtraArg1, ...])
    +variable_access(delete [, ExtraArg1, ...])

    For tables:

    table_access(new [, ExtraArg1, ...])
     table_access(delete [, ExtraArg1, ...])

    These functions are called for each object in an MIB when the MIB is unloaded or loaded, respectively.

    @@ -214,9 +214,9 @@ value 1, and [3, 5] is the list of requested columns. The function should now return the lexicographically next elements:

    [{[3, 1, 2], d}, {[5, 1, 2], f}]

    This is illustrated in the following table:

    GetNext from [3,1,1] and [5,1,1].

    The manager now issues the following getNext request:

    getNext{ myTable.myTableEntry.3.2.1,
              myTable.myTableEntry.5.2.1 }

    This is transformed into one call to my_table:

    my_table(get_next, [2, 1], [3, 5])

    The function should now return:

    [{[4, 1, 1], b}, endOfTable]

    This is illustrated in the following table:

    GetNext from [3,2,1] and [5,2,1].

    The manager now issues the following getNext request:

    getNext{ myTable.myTableEntry.3.1.2,
    -         myTable.myTableEntry.4.1.2 }

    This will be transform into one call to my_table:

    my_table(get_next, [1, 2], [3, 4])

    The function should now return:

    [{[3, 2, 1], g}, {[5, 1, 1], c}]

    This is illustrated in the following table:

    GetNext from [3,1,2] and [4,1,2].

    The manager now issues the following getNext request:

    getNext{ myTable.myTableEntry,
    -         myTable.myTableEntry.1.3.2 }

    This will be transform into two calls to my_table:

    my_table(get_next, [], [0]) and
    -my_table(get_next, [3, 2], [1])

    The function should now return:

    [{[3, 1, 1], a}] and
    +         myTable.myTableEntry.4.1.2 }

    This will be transform into one call to my_table:

    my_table(get_next, [1, 2], [3, 4])

    The function should now return:

    [{[3, 2, 1], g}, {[5, 1, 1], c}]

    This is illustrated in the following table:

    GetNext from [3,1,2] and [4,1,2].

    The manager now issues the following getNext request:

    getNext{ myTable.myTableEntry,
    +         myTable.myTableEntry.1.3.2 }

    This will be transform into two calls to my_table:

    my_table(get_next, [], [0]) and
    +my_table(get_next, [3, 2], [1])

    The function should now return:

    [{[3, 1, 1], a}] and
     [{[3, 1, 1], a}]

    In both cases, the first accessible element in the table should be returned. As the key columns are not accessible, this means that the third column is the first row.

    Note

    Normally, the functions described above behave exactly as shown, but they are @@ -233,17 +233,17 @@ variables for a device, ipAdr and name with object identifiers 1.1.23.4 and 1.1.7 respectively. To access these variables, one could implement the two Erlang functions ip_access and name_access, which will be in the MIB. The -functions could be specified in a text file as follows:

    {ipAdr, {my_module, ip_access, []}}.
    +functions could be specified in a text file as follows:

    {ipAdr, {my_module, ip_access, []}}.
     % Or using the oid syntax for 'name'
    -{[1,1,7], {my_module, name_access, []}}.

    The ExtraArgument parameter is the empty list. For example, when the agent +{[1,1,7], {my_module, name_access, []}}.

    The ExtraArgument parameter is the empty list. For example, when the agent receives a get-request for the ipAdr variable, a call will be made to ip_access(get). The value returned by this function is the answer to the get-request.

    If ip_access and name_access are implemented similarly, we could write a -generic_access function using the ListOfExtraArguments:

    {ipAdr, {my_module, generic_access, ['IPADR']}}.
    +generic_access function using the ListOfExtraArguments:

    {ipAdr, {my_module, generic_access, ['IPADR']}}.
     % The mnemonic 'name' is more convenient than 1.1.7
    -{name, {my_module, generic_access, ['NAME']}}.

    When the agent receives the same get-request as above, a call will be made to -generic_access(get,'IPADR').

    Yet another possibility, closer to the hardware, could be:

    {ipAdr, {my_module, generic_access, [16#2543]}}.
    -{name, {my_module, generic_access, [16#A2B3]}}.

    +{name, {my_module, generic_access, ['NAME']}}.

    When the agent receives the same get-request as above, a call will be made to +generic_access(get,'IPADR').

    Yet another possibility, closer to the hardware, could be:

    {ipAdr, {my_module, generic_access, [16#2543]}}.
    +{name, {my_module, generic_access, [16#A2B3]}}.

    @@ -349,7 +349,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_intro.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_intro.html 2025-05-10 20:19:17.989270963 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_intro.html 2025-05-10 20:19:17.989270963 +0000 @@ -257,7 +257,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_manager_config_files.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_manager_config_files.html 2025-05-10 20:19:18.013271181 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_manager_config_files.html 2025-05-10 20:19:18.017271217 +0000 @@ -149,22 +149,22 @@ every transport.

  • engine_id - The SnmpEngineID as defined in SNMP-FRAMEWORK-MIB. Mandatory.

  • max_message_size - The snmpEngineMaxMessageSize as defined in SNMP-FRAMEWORK-MIB. Mandatory.

  • Value is the value for the variable.

  • The legacy and intermediate variables address and domain are still supported -so old configurations will work.

    The following example shows a manager.conf file:

    {transports,       [{transportDomainUdpIpv4, {{141,213,11,24}, 5000}},
    -                    {transportDomainUdpIpv6, {{0,0,0,0,0,0,0,1}, 5000}}]}.
    -{engine_id,        "mgrEngine"}.
    -{max_message_size, 484}.

    The value of engine_id is a string, which should have a very specific +so old configurations will work.

    The following example shows a manager.conf file:

    {transports,       [{transportDomainUdpIpv4, {{141,213,11,24}, 5000}},
    +                    {transportDomainUdpIpv6, {{0,0,0,0,0,0,0,1}, 5000}}]}.
    +{engine_id,        "mgrEngine"}.
    +{max_message_size, 484}.

    The value of engine_id is a string, which should have a very specific structure. See RFC 2271/2571 for details.

    And this is a code (snippet) example of how to generate this file in runtime:

    ManagerDir    = "/tmp",
     Port          = 5000,
    -Addr4         = {141,213,11,24},
    -Addr6         = {0,0,0,0,0,0,0,1},
    -Transports    = [{transportDomainUdpIpv4, {Addr4, Port}},
    -                 {transportDomainUdpIpv6, {Addr6, Port}}],
    +Addr4         = {141,213,11,24},
    +Addr6         = {0,0,0,0,0,0,0,1},
    +Transports    = [{transportDomainUdpIpv4, {Addr4, Port}},
    +                 {transportDomainUdpIpv6, {Addr6, Port}}],
     EngineID      = "mgrEngine",
     MMS           = 484,
    -ManagerConfig = [snmpm_conf:manager_entry(transports,       Transports),
    -                 snmpm_conf:manager_entry(engine_id,        EngineID),
    -                 snmpm_conf:manager_entry(max_message_size, MMS)],
    -snmpm_conf:write_manager_config(ManagerDir, ManagerConfig),

    +ManagerConfig = [snmpm_conf:manager_entry(transports, Transports), + snmpm_conf:manager_entry(engine_id, EngineID), + snmpm_conf:manager_entry(max_message_size, MMS)], +snmpm_conf:write_manager_config(ManagerDir, ManagerConfig),

    @@ -174,13 +174,13 @@ either added in the users.conf config file or by calling the register_user function in run-time.

    Each row defines a manager user of the manager.

    Each entry is a tuple of size four:

    {UserId, UserMod, UserData, DefaultAgentConfig}.

    • UserId is any term (used to uniquely identify the user).
    • UserMod is the user callback module (atom).
    • UserData is any term (passed on to the user when calling the UserMod.
    • DefaultAgentConfig is a list of default agent config's. These values are used as default values when this user registers agents.

    And this is a code (snippet) example of how to generate this file in runtime:

    ManagerDir         = "/tmp",
    -UserID             = make_ref(),
    +UserID             = make_ref(),
     UserMod            = my_manager_callback_mod,
    -UserData           = self(),
    -DefaultAgentConfig = [{version, v1}, {timeout, 2500}, {max_message_size, 484}],
    -UsersConfig = [snmpm_conf:users_entry(UserID, UserMod, UserData,
    -                                      DefaultAgentConfig)],
    -snmpm_conf:write_users_config(ManagerDir, UsersConfig),

    +UserData = self(), +DefaultAgentConfig = [{version, v1}, {timeout, 2500}, {max_message_size, 484}], +UsersConfig = [snmpm_conf:users_entry(UserID, UserMod, UserData, + DefaultAgentConfig)], +snmpm_conf:write_users_config(ManagerDir, UsersConfig),

    @@ -198,23 +198,23 @@ (integer).
  • Version is the version (v1 | v2 | v3).

  • SecModel is the security model (any | v1 | v2c | usm).

  • SecName is the security name (string).
  • SecLevel is security level (noAuthNoPriv | authNoPriv | authPriv).

  • Legacy configurations using tuples without Domain element, as well as with all TDomain, Ip and Port elements still work.

    And this is a code (snippet) example of how to generate this file in runtime:

    ManagerDir   = "/tmp",
     UserID       = ...
    -AgentsConfig = [snmpm_conf:agents_entry(UserID,
    +AgentsConfig = [snmpm_conf:agents_entry(UserID,
                                             "target 1",
     					"FOOBAR",
    -					transportDomainUdpIpv4, {{1,2,3,4},161},
    +					transportDomainUdpIpv4, {{1,2,3,4},161},
     					"agent Engine 1"
     					1500,
     					484.
    -					v1, v1, "sec name 1", noAuthNoPriv),
    -		snmpm_conf:agents_entry(UserID,
    +					v1, v1, "sec name 1", noAuthNoPriv),
    +		snmpm_conf:agents_entry(UserID,
                                             "target 2",
     					"FOOBAR",
    -					transportDomainUdpIpv4, {{5,6,7,8},161},
    +					transportDomainUdpIpv4, {{5,6,7,8},161},
     					"agent Engine 2"
     					1500,
     					1000.
    -					v1, v1, "sec name 2", noAuthNoPriv)],
    -snmpm_conf:write_agents_config(ManagerDir, UsersConfig),

    + v1, v1, "sec name 2", noAuthNoPriv)], +snmpm_conf:write_agents_config(ManagerDir, UsersConfig),

    @@ -233,13 +233,13 @@ usmAesCfb128Protocol.

  • PrivKey is a list (of integer). This is the User's secret localized encryption key. It is not visible in the MIB. The length of this key needs to be 16 if usmDESPrivProtocol or usmAesCfb128Protocol is used.

  • ManagerDir = "/tmp",
    -UsmConfig  = [snmpm_conf:usm_entry("engine",
    +UsmConfig  = [snmpm_conf:usm_entry("engine",
                                        "user 1",
     	                           usmNoAuthProtocol,
    -	 			   [],
    +	 			   [],
     	 			   usmNoPrivProtocol,
    -	 			   [])],
    -snmpm_conf:write_usm_config(ManagerDir, UsmConfig),
    + [])], +snmpm_conf:write_usm_config(ManagerDir, UsmConfig),

    @@ -290,7 +290,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_manager_funct_descr.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_manager_funct_descr.html 2025-05-10 20:19:18.037271399 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_manager_funct_descr.html 2025-05-10 20:19:18.041271435 +0000 @@ -213,7 +213,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_manager_netif.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_manager_netif.html 2025-05-10 20:19:18.061271617 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_manager_netif.html 2025-05-10 20:19:18.065271653 +0000 @@ -255,7 +255,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_mib_compiler.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_mib_compiler.html 2025-05-10 20:19:18.081271798 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_mib_compiler.html 2025-05-10 20:19:18.085271834 +0000 @@ -141,7 +141,7 @@ association file, it gives a warning message and uses default instrumentation functions. (See Default Instrumentation for more details).

    The MIB compiler is started with a call to snmpc:compile(<mibname>). For -example:

    snmpc:compile("RFC1213-MIB").

    The output is a new file which is called <mibname>.bin.

    The MIB compiler understands both SMIv1 and SMIv2 MIBs. It uses the +example:

    snmpc:compile("RFC1213-MIB").

    The output is a new file which is called <mibname>.bin.

    The MIB compiler understands both SMIv1 and SMIv2 MIBs. It uses the MODULE-IDENTITY statement to determinate if the MIB is written in SMI version 1 or 2.

    @@ -153,10 +153,10 @@ compiled file and not the ASN.1 (source) file. A MIB must be recompiled to make changes visible to other MIBs importing it.

    The compiled files of the imported MIBs must be present in the current directory, or a directory in the current path. The path is supplied with the -{i, Path} option, for example:

    snmpc:compile("MY-MIB",
    -       [{i, ["friend_mibs/", "../standard_mibs/"]}]).

    It is also possible to import MIBs from OTP applications in an "include_lib" -like fashion with the il option. Example:

    snmpc:compile("MY-MIB",
    -       [{il, ["snmp/priv/mibs/", "myapp/priv/mibs/"]}]).

    finds the latest version of the snmp and myapp applications in the OTP +{i, Path} option, for example:

    snmpc:compile("MY-MIB",
    +       [{i, ["friend_mibs/", "../standard_mibs/"]}]).

    It is also possible to import MIBs from OTP applications in an "include_lib" +like fashion with the il option. Example:

    snmpc:compile("MY-MIB",
    +       [{il, ["snmp/priv/mibs/", "myapp/priv/mibs/"]}]).

    finds the latest version of the snmp and myapp applications in the OTP system and uses the expanded paths as include paths.

    Note that an SMIv2 MIB can import an SMIv1 MIB and vice versa.

    The following MIBs are built-ins of the Erlang SNMP compiler: SNMPv2-SMI, RFC-1215, RFC-1212, SNMPv2-TC, SNMPv2-CONF, and RFC1155-SMI. They cannot therefore be compiled separately.

    @@ -266,7 +266,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_notification_mib.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_notification_mib.html 2025-05-10 20:19:18.105272016 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_notification_mib.html 2025-05-10 20:19:18.109272052 +0000 @@ -486,7 +486,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_pdus.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_pdus.html 2025-05-10 20:19:18.137272306 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_pdus.html 2025-05-10 20:19:18.141272342 +0000 @@ -134,8 +134,8 @@ Erlang record representations and vice versa. The record definitions can be found in the file snmp/include/snmp_types.hrl. If snmpv3 is used, the module that includes snmp_types.hrl must define the constant SNMP_USE_V3 before the -header file is included. Example:

    -define(SNMP_USE_V3, true).
    --include_lib("snmp/include/snmp_types.hrl").

    Encoding and decoding must be done explicitly when writing your own Net if +header file is included. Example:

    -define(SNMP_USE_V3, true).
    +-include_lib("snmp/include/snmp_types.hrl").

    Encoding and decoding must be done explicitly when writing your own Net if process.

    @@ -1053,7 +1053,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_standard_mib.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_standard_mib.html 2025-05-10 20:19:18.165272560 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_standard_mib.html 2025-05-10 20:19:18.169272596 +0000 @@ -426,7 +426,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_target_mib.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_target_mib.html 2025-05-10 20:19:18.193272813 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_target_mib.html 2025-05-10 20:19:18.201272886 +0000 @@ -818,7 +818,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_user_based_sm_mib.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_user_based_sm_mib.html 2025-05-10 20:19:18.225273103 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_user_based_sm_mib.html 2025-05-10 20:19:18.229273140 +0000 @@ -769,7 +769,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_view_based_acm_mib.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_view_based_acm_mib.html 2025-05-10 20:19:18.257273394 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmp_view_based_acm_mib.html 2025-05-10 20:19:18.265273466 +0000 @@ -1094,7 +1094,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa.html 2025-05-10 20:19:18.341274155 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa.html 2025-05-10 20:19:18.369274409 +0000 @@ -3335,8 +3335,8 @@

    Load a single Mib into an agent. The MibName is the name of the Mib, -including the path to where the compiled mib is found. For example:

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    -          snmpa:load_mib(snmp_master_agent, Dir ++ "MY-MIB").
    +including the path to where the compiled mib is found. For example:

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    +          snmpa:load_mib(snmp_master_agent, Dir ++ "MY-MIB").
    @@ -3452,8 +3452,8 @@

    Load Mibs into an agent. If the agent cannot load all MIBs (the default value of the Force argument is false), it will indicate where loading was aborted. The MibName is the name of the Mib, including the path to where the compiled -mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    -          snmpa:load_mibs(snmp_master_agent, [Dir ++ "MY-MIB"]).

    If Force = true then the agent will continue attempting to load each mib even +mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    +          snmpa:load_mibs(snmp_master_agent, [Dir ++ "MY-MIB"]).

    If Force = true then the agent will continue attempting to load each mib even after failing to load a previous mib. Use with care.

    @@ -4479,8 +4479,8 @@ -

    Accepted type specifications are:

    -spec register_notification_filter(Agent, Id, Mod, Data) -> ok | {error, Reason}.
    --spec register_notification_filter(Id, Mod, Data, Where) -> ok | {error, Reason}.
    +

    Accepted type specifications are:

    -spec register_notification_filter(Agent, Id, Mod, Data) -> ok | {error, Reason}.
    +-spec register_notification_filter(Id, Mod, Data, Where) -> ok | {error, Reason}.
    @@ -4553,8 +4553,8 @@

    Registers a sub-agent under a sub-tree of another agent.

    It is easy to make mistakes when registering sub-agents and this activity should be done carefully. For example, a strange behaviour would result from the -following configuration:

    snmp_agent:register_subagent(MAPid,[1,2,3,4],SA1),
    -snmp_agent:register_subagent(SA1,[1,2,3], SA2).

    SA2 will not get requests starting with object identifier [1,2,3] since +following configuration:

    snmp_agent:register_subagent(MAPid,[1,2,3,4],SA1),
    +snmp_agent:register_subagent(SA1,[1,2,3], SA2).

    SA2 will not get requests starting with object identifier [1,2,3] since SA1 does not.

    @@ -4999,20 +4999,20 @@ Addresses and if there are no targets for which an Inform-Request is sent, Addresses is the empty list [].

    The receiver will first be sent the snmp_targets message, and then for each address in Addresses list, one of the two snmp_notification messages.

  • {Mod, Func, Args} - The info will be delivered via the function call:

    Mod:Func([Msg | Args])

    where Msg has the same content and purpose as the messages descrived above.

  • Address is a management target address and Addresses is a list of management -target addresses. They are defined as followes:

            Addresses  = [address()]
    -        Address    = address()
    -        address()  = v1_address() | v3_address()
    -        v1_address() = {TDomain, TAddress}
    -        v3_address() = {{TDomain, TAddress}, V3MsgData}
    -        TDomain    = tdoamin()
    -        TAddress   = taddress()
    -        tdomain()  = The oid of snmpUDPDomain
    +target addresses. They are defined as followes:

            Addresses  = [address()]
    +        Address    = address()
    +        address()  = v1_address() | v3_address()
    +        v1_address() = {TDomain, TAddress}
    +        v3_address() = {{TDomain, TAddress}, V3MsgData}
    +        TDomain    = tdoamin()
    +        TAddress   = taddress()
    +        tdomain()  = The oid of snmpUDPDomain
                          This is the only supported transport domain.
    -        taddress() = [A1, A2, A3, A4, P1, P3]
    +        taddress() = [A1, A2, A3, A4, P1, P3]
                          The 4 first bytes makes up the IP-address and the last 2,
                          the UDP-port number.
    -        V3MsgData  = v3_msg_data()
    -        v3_msg_data() = term()

    If Receiver is a notification_delivery_info/0 record, then the information + V3MsgData = v3_msg_data() + v3_msg_data() = term()

    If Receiver is a notification_delivery_info/0 record, then the information about the notification delivery will be delivered to the receiver via the callback functions defined by the snmpa_notification_delivery_info_receiver behaviour according to the content of the notification_delivery_info/0 @@ -6047,7 +6047,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_conf.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_conf.html 2025-05-10 20:19:18.453275171 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_conf.html 2025-05-10 20:19:18.453275171 +0000 @@ -3807,7 +3807,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_discovery_handler.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_discovery_handler.html 2025-05-10 20:19:18.477275388 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_discovery_handler.html 2025-05-10 20:19:18.477275388 +0000 @@ -244,7 +244,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_error.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_error.html 2025-05-10 20:19:18.501275605 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_error.html 2025-05-10 20:19:18.501275605 +0000 @@ -269,7 +269,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_error_io.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_error_io.html 2025-05-10 20:19:18.521275787 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_error_io.html 2025-05-10 20:19:18.521275787 +0000 @@ -269,7 +269,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_error_logger.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_error_logger.html 2025-05-10 20:19:18.545276004 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_error_logger.html 2025-05-10 20:19:18.545276004 +0000 @@ -276,7 +276,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_error_report.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_error_report.html 2025-05-10 20:19:18.569276222 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_error_report.html 2025-05-10 20:19:18.569276222 +0000 @@ -265,7 +265,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_local_db.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_local_db.html 2025-05-10 20:19:18.597276476 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_local_db.html 2025-05-10 20:19:18.597276476 +0000 @@ -739,7 +739,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_mib_data.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_mib_data.html 2025-05-10 20:19:18.633276802 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_mib_data.html 2025-05-10 20:19:18.633276802 +0000 @@ -1142,7 +1142,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_mib_storage.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_mib_storage.html 2025-05-10 20:19:18.657277020 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_mib_storage.html 2025-05-10 20:19:18.665277092 +0000 @@ -847,7 +847,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_mpd.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_mpd.html 2025-05-10 20:19:18.689277310 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_mpd.html 2025-05-10 20:19:18.697277382 +0000 @@ -1017,7 +1017,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_network_interface.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_network_interface.html 2025-05-10 20:19:18.721277600 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_network_interface.html 2025-05-10 20:19:18.725277636 +0000 @@ -492,7 +492,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_network_interface_filter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_network_interface_filter.html 2025-05-10 20:19:18.749277854 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_network_interface_filter.html 2025-05-10 20:19:18.753277890 +0000 @@ -504,7 +504,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_notification_delivery_info_receiver.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_notification_delivery_info_receiver.html 2025-05-10 20:19:18.773278072 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_notification_delivery_info_receiver.html 2025-05-10 20:19:18.777278108 +0000 @@ -424,7 +424,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_notification_filter.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_notification_filter.html 2025-05-10 20:19:18.797278289 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_notification_filter.html 2025-05-10 20:19:18.801278325 +0000 @@ -329,7 +329,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_supervisor.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_supervisor.html 2025-05-10 20:19:18.821278507 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpa_supervisor.html 2025-05-10 20:19:18.825278543 +0000 @@ -372,7 +372,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpc.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpc.html 2025-05-10 20:19:18.845278724 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpc.html 2025-05-10 20:19:18.853278797 +0000 @@ -413,7 +413,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpc_cmd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpc_cmd.html 2025-05-10 20:19:18.873278977 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpc_cmd.html 2025-05-10 20:19:18.873278977 +0000 @@ -131,7 +131,7 @@ Synopsis

    -
    snmpc [options] file.mib | file.bin

    +
    snmpc [options] file.mib | file.bin

    @@ -215,7 +215,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm.html 2025-05-10 20:19:18.929279485 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm.html 2025-05-10 20:19:18.957279739 +0000 @@ -2008,8 +2008,8 @@

    Load a Mib into the manager. The MibName is the name of the Mib, including -the path to where the compiled mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    -          snmpm:load_mib(Dir ++ "MY-MIB").
    +the path to where the compiled mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    +          snmpm:load_mib(Dir ++ "MY-MIB").
    @@ -3588,8 +3588,8 @@

    Unload a Mib from the manager. The MibName is the name of the Mib, including -the path to where the compiled mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    -          snmpm:unload_mib(Dir ++ "MY-MIB").
    +the path to where the compiled mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    +          snmpm:unload_mib(Dir ++ "MY-MIB").
    @@ -4057,7 +4057,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm_conf.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm_conf.html 2025-05-10 20:19:18.989280030 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm_conf.html 2025-05-10 20:19:18.997280102 +0000 @@ -1368,7 +1368,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm_mpd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm_mpd.html 2025-05-10 20:19:19.021280320 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm_mpd.html 2025-05-10 20:19:19.025280356 +0000 @@ -647,7 +647,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm_network_interface.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm_network_interface.html 2025-05-10 20:19:19.049280574 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm_network_interface.html 2025-05-10 20:19:19.053280610 +0000 @@ -574,7 +574,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm_network_interface_filter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm_network_interface_filter.html 2025-05-10 20:19:19.073280791 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm_network_interface_filter.html 2025-05-10 20:19:19.077280828 +0000 @@ -496,7 +496,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm_user.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm_user.html 2025-05-10 20:19:19.101281045 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18.2/doc/html/snmpm_user.html 2025-05-10 20:19:19.105281082 +0000 @@ -719,7 +719,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/404.html 2025-05-10 20:19:19.121281226 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/404.html 2025-05-10 20:19:19.125281263 +0000 @@ -147,7 +147,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/api-reference.html 2025-05-10 20:19:19.145281444 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/api-reference.html 2025-05-10 20:19:19.149281480 +0000 @@ -277,7 +277,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/configurations.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/configurations.html 2025-05-10 20:19:19.173281698 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/configurations.html 2025-05-10 20:19:19.181281770 +0000 @@ -142,23 +142,23 @@ Options configuration

    There are from OTP-23.0 two main ways to set an option:

    • Like before, in the Options parameter in the Erlang code in a call to for -example ssh:daemon/3 or ssh:connect/3 or any of their variants. Example:

      ssh:connect(22, [{user,"foo"}])
    • In OTP Configuration Parameters:

      • In the erl command line:

        erl -ssh user \"foo\"
      • In the ssh.app file, in the env part

        {application, ssh,
        - [{description, "SSH-2 for Erlang/OTP"},
        -  {vsn, "4.9"},
        -  {modules, [ssh,
        +example ssh:daemon/3 or ssh:connect/3 or any of their variants. Example:

        ssh:connect(22, [{user,"foo"}])
      • In OTP Configuration Parameters:

        • In the erl command line:

          erl -ssh user \"foo\"
        • In the ssh.app file, in the env part

          {application, ssh,
          + [{description, "SSH-2 for Erlang/OTP"},
          +  {vsn, "4.9"},
          +  {modules, [ssh,
                   ...
          -         ssh_xfer]},
          -  {registered, []},
          -  {applications, [kernel, stdlib, crypto, public_key]},
          -  {env, [{user, "bar"]}, % <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< HERE
          -  {mod, {ssh_app, []}},
          -       ...
        • In a .config file:

          erl -config ex1

          where ex1.config contains:

          [
          -{ssh, [{user, "foo"}]}
          -].

        If the option is intended only for a server or for a client, it may be set in -this way:

        [
        -{ssh, [{server_options,[{user, "foo"}]},
        -       {client_options,[{user, "bar"}]}
        -].

        A server (daemon) will use the user name foo, and a client will use the name + ssh_xfer]}, + {registered, []}, + {applications, [kernel, stdlib, crypto, public_key]}, + {env, [{user, "bar"]}, % <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< HERE + {mod, {ssh_app, []}}, + ...

  • In a .config file:

    erl -config ex1

    where ex1.config contains:

    [
    +{ssh, [{user, "foo"}]}
    +].
  • If the option is intended only for a server or for a client, it may be set in +this way:

    [
    +{ssh, [{server_options,[{user, "foo"}]},
    +       {client_options,[{user, "bar"}]}
    +].

    A server (daemon) will use the user name foo, and a client will use the name bar.

    @@ -229,17 +229,17 @@ 'hmac-sha1']}]}, {compression,[{client2server,[none,'zlib@openssh.com',zlib]}, {server2client,[none,'zlib@openssh.com',zlib]}]}]

    Note that the algorithms in the file ex2.config is not yet applied. They will -be when we start ssh:

    2> ssh:start().
    +be when we start ssh:

    2> ssh:start().
     ok
    -3> ssh:default_algorithms().
    -[{kex,['ecdh-sha2-nistp384']},
    - {public_key,['ssh-rsa']},
    - {cipher,[{client2server,['aes192-ctr']},
    -          {server2client,['aes192-ctr']}]},
    - {mac,[{client2server,['hmac-sha1']},
    -       {server2client,['hmac-sha1']}]},
    - {compression,[{client2server,[none,'zlib@openssh.com',zlib]},
    -               {server2client,[none,'zlib@openssh.com',zlib]}]}]
    +3> ssh:default_algorithms().
    +[{kex,['ecdh-sha2-nistp384']},
    + {public_key,['ssh-rsa']},
    + {cipher,[{client2server,['aes192-ctr']},
    +          {server2client,['aes192-ctr']}]},
    + {mac,[{client2server,['hmac-sha1']},
    +       {server2client,['hmac-sha1']}]},
    + {compression,[{client2server,[none,'zlib@openssh.com',zlib]},
    +               {server2client,[none,'zlib@openssh.com',zlib]}]}]
     4>

    We see that the algorithm set is changed to the one in the ex2.config. Since compression is not specified in the file, the hard-coded default is still used for that entry.

    Establishing a connection (ssh:connect et al) or starting a daemon (ssh:daemon)

    Both when the client establishes a connection with ssh:connect or other @@ -252,65 +252,65 @@ modify_algorithms on all levels in order starting with level 0 are applied.

    We continue the example above by connecting to a server and modifying the kex algorithm set. We remove the only one ('ecdh-sha2-nistp384') and add -'curve25519-sha256@libssh.org' by appending it to the now empty list:

    4> {ok,C} = ssh:connect(loopback, 22,
    -                        [{modify_algorithms,
    -                                 [{rm,
    -                                     [ {kex,['ecdh-sha2-nistp384']} ]
    -				  },
    -                                  {append,
    -			             [ {kex,['curve25519-sha256@libssh.org']} ]
    -				  }
    -				 ]
    -	                 }
    -                        ]).
    -{ok,>0.118.0>}

    We check which algorithms are negotiated by the client and the server, and note -that the (only) kex algorithm 'curve25519-sha256@libssh.org' was selected:

    5> ssh:connection_info(C, algorithms).
    -{algorithms,[{kex,'curve25519-sha256@libssh.org'},
    -             {hkey,'ssh-rsa'},
    -             {send_mac,'hmac-sha1'},
    -             {recv_mac,'hmac-sha1'},
    -             {encrypt,'aes192-ctr'},
    -             {decrypt,'aes192-ctr'},
    -             {compress,none},
    -             {decompress,none},
    -             {send_ext_info,false},
    -             {recv_ext_info,true}]}

    Example of modify_algorithms handling

    We will now check if the +'curve25519-sha256@libssh.org' by appending it to the now empty list:

    4> {ok,C} = ssh:connect(loopback, 22,
    +                        [{modify_algorithms,
    +                                 [{rm,
    +                                     [ {kex,['ecdh-sha2-nistp384']} ]
    +				  },
    +                                  {append,
    +			             [ {kex,['curve25519-sha256@libssh.org']} ]
    +				  }
    +				 ]
    +	                 }
    +                        ]).
    +{ok,>0.118.0>}

    We check which algorithms are negotiated by the client and the server, and note +that the (only) kex algorithm 'curve25519-sha256@libssh.org' was selected:

    5> ssh:connection_info(C, algorithms).
    +{algorithms,[{kex,'curve25519-sha256@libssh.org'},
    +             {hkey,'ssh-rsa'},
    +             {send_mac,'hmac-sha1'},
    +             {recv_mac,'hmac-sha1'},
    +             {encrypt,'aes192-ctr'},
    +             {decrypt,'aes192-ctr'},
    +             {compress,none},
    +             {decompress,none},
    +             {send_ext_info,false},
    +             {recv_ext_info,true}]}

    Example of modify_algorithms handling

    We will now check if the modify_algorithms on a lower level is applied to a preferred_algorithms on a higher level. We will do that by enabling the ssh-dss algorithm that is supported, -but not in the default set.

    The config file ex3.config has the contents:

    [
    - {ssh, [{modify_algorithms,
    -         [ {prepend, [{public_key, ['ssh-dss']}]} ]
    -        }]}
    -].

    A newly started erlang shell shows that no 'ssh-dss' is present in the -public_key entry:

    1> proplists:get_value(public_key, ssh:default_algorithms()).
    -['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
    +but not in the default set.

    The config file ex3.config has the contents:

    [
    + {ssh, [{modify_algorithms,
    +         [ {prepend, [{public_key, ['ssh-dss']}]} ]
    +        }]}
    +].

    A newly started erlang shell shows that no 'ssh-dss' is present in the +public_key entry:

    1> proplists:get_value(public_key, ssh:default_algorithms()).
    +['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
      'ecdsa-sha2-nistp256','ssh-ed25519','ssh-ed448',
    - 'rsa-sha2-256','rsa-sha2-512','ssh-rsa']
    -2>

    A call to ssh:connect/3 removes all algorithms but one of each type:

    2> ssh:start().
    + 'rsa-sha2-256','rsa-sha2-512','ssh-rsa']
    +2>

    A call to ssh:connect/3 removes all algorithms but one of each type:

    2> ssh:start().
     ok
    -3> {ok,C} = ssh:connect(loopback, 22,
    -                        [{preferred_algorithms,
    -                         [{public_key, ['ecdsa-sha2-nistp256']},
    -			  {kex, ['ecdh-sha2-nistp256']},
    -		          {cipher, ['chacha20-poly1305@openssh.com']},
    -			  {mac, ['hmac-sha2-256']},
    -			  {compression, [none]}
    -			  ]}
    -			 ]).
    -{ok,<0.101.0>}
    -4> ssh:connection_info(C,algorithms).
    -{algorithms,[{kex,'ecdh-sha2-nistp256'},
    -             {hkey,'ssh-dss'},
    -             {send_mac,'chacha20-poly1305@openssh.com'},
    -             {recv_mac,'chacha20-poly1305@openssh.com'},
    -             {encrypt,'chacha20-poly1305@openssh.com'},
    -             {decrypt,'chacha20-poly1305@openssh.com'},
    -             {compress,none},
    -             {decompress,none},
    -             {send_ext_info,false},
    -             {recv_ext_info,true}]}
    +3> {ok,C} = ssh:connect(loopback, 22,
    +                        [{preferred_algorithms,
    +                         [{public_key, ['ecdsa-sha2-nistp256']},
    +			  {kex, ['ecdh-sha2-nistp256']},
    +		          {cipher, ['chacha20-poly1305@openssh.com']},
    +			  {mac, ['hmac-sha2-256']},
    +			  {compression, [none]}
    +			  ]}
    +			 ]).
    +{ok,<0.101.0>}
    +4> ssh:connection_info(C,algorithms).
    +{algorithms,[{kex,'ecdh-sha2-nistp256'},
    +             {hkey,'ssh-dss'},
    +             {send_mac,'chacha20-poly1305@openssh.com'},
    +             {recv_mac,'chacha20-poly1305@openssh.com'},
    +             {encrypt,'chacha20-poly1305@openssh.com'},
    +             {decrypt,'chacha20-poly1305@openssh.com'},
    +             {compress,none},
    +             {decompress,none},
    +             {send_ext_info,false},
    +             {recv_ext_info,true}]}
     5>

    But 'ssh-dss' is selected although the call inserted only 'ecdsa-sha2-nistp256' as acceptable.

    This example showed that we could augment the set of algorithms with a config-file without the need to change the actual call.

    For demonstration purposes we used prepend instead of append. This forces @@ -367,7 +367,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/configure_algos.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/configure_algos.html 2025-05-10 20:19:19.209282024 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/configure_algos.html 2025-05-10 20:19:19.217282096 +0000 @@ -170,29 +170,29 @@ supported by the:

    • crypto app,
    • The cryptolib OTP is linked with, usually the one the OS uses, probably OpenSSL,
    • and finally what the SSH app implements

    Due to this, it impossible to list in documentation what algorithms that are available in a certain installation.

    There is an important command to list the actual algorithms and their ordering: -ssh:default_algorithms/0.

    0> ssh:default_algorithms().
    -[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
    +ssh:default_algorithms/0.

    0> ssh:default_algorithms().
    +[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
            'ecdh-sha2-nistp256','diffie-hellman-group-exchange-sha256',
            'diffie-hellman-group16-sha512',
            'diffie-hellman-group18-sha512',
            'diffie-hellman-group14-sha256',
            'diffie-hellman-group14-sha1',
    -       'diffie-hellman-group-exchange-sha1']},
    - {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
    +       'diffie-hellman-group-exchange-sha1']},
    + {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
                   'ecdsa-sha2-nistp256','ssh-rsa','rsa-sha2-256',
    -              'rsa-sha2-512','ssh-dss']},
    - {cipher,[{client2server,['aes256-gcm@openssh.com',
    +              'rsa-sha2-512','ssh-dss']},
    + {cipher,[{client2server,['aes256-gcm@openssh.com',
                               'aes256-ctr','aes192-ctr','aes128-gcm@openssh.com',
    -                          'aes128-ctr','aes128-cbc','3des-cbc']},
    -          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
    +                          'aes128-ctr','aes128-cbc','3des-cbc']},
    +          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
                               'aes192-ctr','aes128-gcm@openssh.com','aes128-ctr',
    -                          'aes128-cbc','3des-cbc']}]},
    - {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']},
    -       {server2client,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']}]},
    - {compression,[{client2server,[none,'zlib@openssh.com',zlib]},
    -               {server2client,[none,'zlib@openssh.com',zlib]}]}]

    To change the algorithm list, there are two options which can be used in + 'aes128-cbc','3des-cbc']}]}, + {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}, + {server2client,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}]}, + {compression,[{client2server,[none,'zlib@openssh.com',zlib]}, + {server2client,[none,'zlib@openssh.com',zlib]}]}]

    To change the algorithm list, there are two options which can be used in ssh:connect/2,3,4 and ssh:daemon/2,3. The options could of course be used in all other functions that initiates connections.

    The options are @@ -215,28 +215,28 @@ Example 1

    Replace the kex algorithms list with the single algorithm -'diffie-hellman-group14-sha256':

    1> ssh:chk_algos_opts(
    -               [{preferred_algorithms,
    -                     [{kex, ['diffie-hellman-group14-sha256']}
    -                     ]
    -                }
    -              ]).
    -[{kex,['diffie-hellman-group14-sha256']},
    - {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
    +'diffie-hellman-group14-sha256':

    1> ssh:chk_algos_opts(
    +               [{preferred_algorithms,
    +                     [{kex, ['diffie-hellman-group14-sha256']}
    +                     ]
    +                }
    +              ]).
    +[{kex,['diffie-hellman-group14-sha256']},
    + {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
                   'ecdsa-sha2-nistp256','ssh-rsa','rsa-sha2-256',
    -              'rsa-sha2-512','ssh-dss']},
    - {cipher,[{client2server,['aes256-gcm@openssh.com',
    +              'rsa-sha2-512','ssh-dss']},
    + {cipher,[{client2server,['aes256-gcm@openssh.com',
                               'aes256-ctr','aes192-ctr','aes128-gcm@openssh.com',
    -                          'aes128-ctr','aes128-cbc','3des-cbc']},
    -          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
    +                          'aes128-ctr','aes128-cbc','3des-cbc']},
    +          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
                               'aes192-ctr','aes128-gcm@openssh.com','aes128-ctr',
    -                          'aes128-cbc','3des-cbc']}]},
    - {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']},
    -       {server2client,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']}]},
    - {compression,[{client2server,[none,'zlib@openssh.com',zlib]},
    -               {server2client,[none,'zlib@openssh.com',zlib]}]}]

    Note that the unmentioned lists (public_key, cipher, mac and + 'aes128-cbc','3des-cbc']}]}, + {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}, + {server2client,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}]}, + {compression,[{client2server,[none,'zlib@openssh.com',zlib]}, + {server2client,[none,'zlib@openssh.com',zlib]}]}]

    Note that the unmentioned lists (public_key, cipher, mac and compression) are unchanged.

    @@ -244,30 +244,30 @@ Example 2

    In the lists that are divided in two for the two directions (for example cipher) it is -possible to change both directions at once:

    2> ssh:chk_algos_opts(
    -               [{preferred_algorithms,
    -                     [{cipher,['aes128-ctr']}
    -                     ]
    -                }
    -              ]).
    -[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
    +possible to change both directions at once:

    2> ssh:chk_algos_opts(
    +               [{preferred_algorithms,
    +                     [{cipher,['aes128-ctr']}
    +                     ]
    +                }
    +              ]).
    +[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
            'ecdh-sha2-nistp256','diffie-hellman-group-exchange-sha256',
            'diffie-hellman-group16-sha512',
            'diffie-hellman-group18-sha512',
            'diffie-hellman-group14-sha256',
            'diffie-hellman-group14-sha1',
    -       'diffie-hellman-group-exchange-sha1']},
    - {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
    +       'diffie-hellman-group-exchange-sha1']},
    + {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
                   'ecdsa-sha2-nistp256','ssh-rsa','rsa-sha2-256',
    -              'rsa-sha2-512','ssh-dss']},
    - {cipher,[{client2server,['aes128-ctr']},
    -          {server2client,['aes128-ctr']}]},
    - {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']},
    -       {server2client,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']}]},
    - {compression,[{client2server,[none,'zlib@openssh.com',zlib]},
    -               {server2client,[none,'zlib@openssh.com',zlib]}]}]

    Note that both lists in cipher has been changed to the provided value + 'rsa-sha2-512','ssh-dss']}, + {cipher,[{client2server,['aes128-ctr']}, + {server2client,['aes128-ctr']}]}, + {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}, + {server2client,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}]}, + {compression,[{client2server,[none,'zlib@openssh.com',zlib]}, + {server2client,[none,'zlib@openssh.com',zlib]}]}]

    Note that both lists in cipher has been changed to the provided value ('aes128-ctr').

    @@ -275,56 +275,56 @@ Example 3

    In the lists that are divided in two for the two directions (for example cipher) it is -possible to change only one of the directions:

    3> ssh:chk_algos_opts(
    -               [{preferred_algorithms,
    -                     [{cipher,[{client2server,['aes128-ctr']}]}
    -                     ]
    -                }
    -              ]).
    -[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
    +possible to change only one of the directions:

    3> ssh:chk_algos_opts(
    +               [{preferred_algorithms,
    +                     [{cipher,[{client2server,['aes128-ctr']}]}
    +                     ]
    +                }
    +              ]).
    +[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
            'ecdh-sha2-nistp256','diffie-hellman-group-exchange-sha256',
            'diffie-hellman-group16-sha512',
            'diffie-hellman-group18-sha512',
            'diffie-hellman-group14-sha256',
            'diffie-hellman-group14-sha1',
    -       'diffie-hellman-group-exchange-sha1']},
    - {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
    +       'diffie-hellman-group-exchange-sha1']},
    + {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
                   'ecdsa-sha2-nistp256','ssh-rsa','rsa-sha2-256',
    -              'rsa-sha2-512','ssh-dss']},
    - {cipher,[{client2server,['aes128-ctr']},
    -          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
    +              'rsa-sha2-512','ssh-dss']},
    + {cipher,[{client2server,['aes128-ctr']},
    +          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
                               'aes192-ctr','aes128-gcm@openssh.com','aes128-ctr',
    -                          'aes128-cbc','3des-cbc']}]},
    - {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']},
    -       {server2client,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']}]},
    - {compression,[{client2server,[none,'zlib@openssh.com',zlib]},
    -               {server2client,[none,'zlib@openssh.com',zlib]}]}]

    + 'aes128-cbc','3des-cbc']}]}, + {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}, + {server2client,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}]}, + {compression,[{client2server,[none,'zlib@openssh.com',zlib]}, + {server2client,[none,'zlib@openssh.com',zlib]}]}]

    Example 4

    -

    It is of course possible to change more than one list:

    4> ssh:chk_algos_opts(
    -               [{preferred_algorithms,
    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/hardening.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/hardening.html	2025-05-10 20:19:19.241282314 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/hardening.html	2025-05-10 20:19:19.241282314 +0000
    @@ -214,16 +214,16 @@
     could be replaced with a pwdfun plugin. The arity
     four variant (pwdfun_4()) can also be used for
     introducing delays after failed password checking attempts. Here is a simple
    -example of such a pwdfun:

    fun(User, Password, _PeerAddress, State) ->
    -        case lists:member({User,Password}, my_user_pwds()) of
    +example of such a pwdfun:

    fun(User, Password, _PeerAddress, State) ->
    +        case lists:member({User,Password}, my_user_pwds()) of
                 true ->
    -                {true, undefined}; % Reset delay time
    +                {true, undefined}; % Reset delay time
                 false when State == undefined ->
    -                timer:sleep(1000),
    -                {false, 2000}; % Next delay is 2000 ms
    -            false when is_integer(State) ->
    -                timer:sleep(State),
    -                {false, 2*State} % Double the delay for each failure
    +                timer:sleep(1000),
    +                {false, 2000}; % Next delay is 2000 ms
    +            false when is_integer(State) ->
    +                timer:sleep(State),
    +                {false, 2*State} % Double the delay for each failure
             end
     end.

    If a public key is used for logging in, there is normally no checking of the user name. It could be enabled by setting the option @@ -292,7 +292,7 @@ exploiting known faults or peculiarities learned by reading the public code.

    Each SSH client or daemon presents themselves to each other with brand and version. This may look like

    SSH-2.0-Erlang/4.10

    or

    SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3

    This brand and version may be changed with the option id_string. We start a daemon with that -option:

    	ssh:daemon(1234, [{id_string,"hi there"}, ... ]).

    and the daemon will present itself as:

    SSH-2.0-hi there

    It is possible to replace the string with one randomly generated for each +option:

    	ssh:daemon(1234, [{id_string,"hi there"}, ... ]).

    and the daemon will present itself as:

    SSH-2.0-hi there

    It is possible to replace the string with one randomly generated for each connection attempt. See the reference manual for id_string.

    @@ -346,7 +346,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/introduction.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/introduction.html 2025-05-10 20:19:19.265282532 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/introduction.html 2025-05-10 20:19:19.265282532 +0000 @@ -272,7 +272,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/notes.html 2025-05-10 20:19:19.317283003 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/notes.html 2025-05-10 20:19:19.341283221 +0000 @@ -3425,7 +3425,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/search.html 2025-05-10 20:19:19.361283403 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/search.html 2025-05-10 20:19:19.361283403 +0000 @@ -145,7 +145,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh.epub/OEBPS/configurations.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh.epub/OEBPS/configurations.xhtml 2025-05-10 20:19:19.389283656 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh.epub/OEBPS/configurations.xhtml 2025-05-10 20:19:19.397283729 +0000 @@ -37,23 +37,23 @@ Options configuration

    There are from OTP-23.0 two main ways to set an option:

    • Like before, in the Options parameter in the Erlang code in a call to for -example ssh:daemon/3 or ssh:connect/3 or any of their variants. Example:

      ssh:connect(22, [{user,"foo"}])
    • In OTP Configuration Parameters:

      • In the erl command line:

        erl -ssh user \"foo\"
      • In the ssh.app file, in the env part

        {application, ssh,
        - [{description, "SSH-2 for Erlang/OTP"},
        -  {vsn, "4.9"},
        -  {modules, [ssh,
        +example ssh:daemon/3 or ssh:connect/3 or any of their variants. Example:

        ssh:connect(22, [{user,"foo"}])
      • In OTP Configuration Parameters:

        • In the erl command line:

          erl -ssh user \"foo\"
        • In the ssh.app file, in the env part

          {application, ssh,
          + [{description, "SSH-2 for Erlang/OTP"},
          +  {vsn, "4.9"},
          +  {modules, [ssh,
                   ...
          -         ssh_xfer]},
          -  {registered, []},
          -  {applications, [kernel, stdlib, crypto, public_key]},
          -  {env, [{user, "bar"]}, % <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< HERE
          -  {mod, {ssh_app, []}},
          -       ...
        • In a .config file:

          erl -config ex1

          where ex1.config contains:

          [
          -{ssh, [{user, "foo"}]}
          -].

        If the option is intended only for a server or for a client, it may be set in -this way:

        [
        -{ssh, [{server_options,[{user, "foo"}]},
        -       {client_options,[{user, "bar"}]}
        -].

        A server (daemon) will use the user name foo, and a client will use the name + ssh_xfer]}, + {registered, []}, + {applications, [kernel, stdlib, crypto, public_key]}, + {env, [{user, "bar"]}, % <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< HERE + {mod, {ssh_app, []}}, + ...

  • In a .config file:

    erl -config ex1

    where ex1.config contains:

    [
    +{ssh, [{user, "foo"}]}
    +].
  • If the option is intended only for a server or for a client, it may be set in +this way:

    [
    +{ssh, [{server_options,[{user, "foo"}]},
    +       {client_options,[{user, "bar"}]}
    +].

    A server (daemon) will use the user name foo, and a client will use the name bar.

    @@ -124,17 +124,17 @@ 'hmac-sha1']}]}, {compression,[{client2server,[none,'zlib@openssh.com',zlib]}, {server2client,[none,'zlib@openssh.com',zlib]}]}]

    Note that the algorithms in the file ex2.config is not yet applied. They will -be when we start ssh:

    2> ssh:start().
    +be when we start ssh:

    2> ssh:start().
     ok
    -3> ssh:default_algorithms().
    -[{kex,['ecdh-sha2-nistp384']},
    - {public_key,['ssh-rsa']},
    - {cipher,[{client2server,['aes192-ctr']},
    -          {server2client,['aes192-ctr']}]},
    - {mac,[{client2server,['hmac-sha1']},
    -       {server2client,['hmac-sha1']}]},
    - {compression,[{client2server,[none,'zlib@openssh.com',zlib]},
    -               {server2client,[none,'zlib@openssh.com',zlib]}]}]
    +3> ssh:default_algorithms().
    +[{kex,['ecdh-sha2-nistp384']},
    + {public_key,['ssh-rsa']},
    + {cipher,[{client2server,['aes192-ctr']},
    +          {server2client,['aes192-ctr']}]},
    + {mac,[{client2server,['hmac-sha1']},
    +       {server2client,['hmac-sha1']}]},
    + {compression,[{client2server,[none,'zlib@openssh.com',zlib]},
    +               {server2client,[none,'zlib@openssh.com',zlib]}]}]
     4>

    We see that the algorithm set is changed to the one in the ex2.config. Since compression is not specified in the file, the hard-coded default is still used for that entry.

    Establishing a connection (ssh:connect et al) or starting a daemon (ssh:daemon)

    Both when the client establishes a connection with ssh:connect or other @@ -147,65 +147,65 @@ modify_algorithms on all levels in order starting with level 0 are applied.

    We continue the example above by connecting to a server and modifying the kex algorithm set. We remove the only one ('ecdh-sha2-nistp384') and add -'curve25519-sha256@libssh.org' by appending it to the now empty list:

    4> {ok,C} = ssh:connect(loopback, 22,
    -                        [{modify_algorithms,
    -                                 [{rm,
    -                                     [ {kex,['ecdh-sha2-nistp384']} ]
    -				  },
    -                                  {append,
    -			             [ {kex,['curve25519-sha256@libssh.org']} ]
    -				  }
    -				 ]
    -	                 }
    -                        ]).
    -{ok,>0.118.0>}

    We check which algorithms are negotiated by the client and the server, and note -that the (only) kex algorithm 'curve25519-sha256@libssh.org' was selected:

    5> ssh:connection_info(C, algorithms).
    -{algorithms,[{kex,'curve25519-sha256@libssh.org'},
    -             {hkey,'ssh-rsa'},
    -             {send_mac,'hmac-sha1'},
    -             {recv_mac,'hmac-sha1'},
    -             {encrypt,'aes192-ctr'},
    -             {decrypt,'aes192-ctr'},
    -             {compress,none},
    -             {decompress,none},
    -             {send_ext_info,false},
    -             {recv_ext_info,true}]}

    Example of modify_algorithms handling

    We will now check if the +'curve25519-sha256@libssh.org' by appending it to the now empty list:

    4> {ok,C} = ssh:connect(loopback, 22,
    +                        [{modify_algorithms,
    +                                 [{rm,
    +                                     [ {kex,['ecdh-sha2-nistp384']} ]
    +				  },
    +                                  {append,
    +			             [ {kex,['curve25519-sha256@libssh.org']} ]
    +				  }
    +				 ]
    +	                 }
    +                        ]).
    +{ok,>0.118.0>}

    We check which algorithms are negotiated by the client and the server, and note +that the (only) kex algorithm 'curve25519-sha256@libssh.org' was selected:

    5> ssh:connection_info(C, algorithms).
    +{algorithms,[{kex,'curve25519-sha256@libssh.org'},
    +             {hkey,'ssh-rsa'},
    +             {send_mac,'hmac-sha1'},
    +             {recv_mac,'hmac-sha1'},
    +             {encrypt,'aes192-ctr'},
    +             {decrypt,'aes192-ctr'},
    +             {compress,none},
    +             {decompress,none},
    +             {send_ext_info,false},
    +             {recv_ext_info,true}]}

    Example of modify_algorithms handling

    We will now check if the modify_algorithms on a lower level is applied to a preferred_algorithms on a higher level. We will do that by enabling the ssh-dss algorithm that is supported, -but not in the default set.

    The config file ex3.config has the contents:

    [
    - {ssh, [{modify_algorithms,
    -         [ {prepend, [{public_key, ['ssh-dss']}]} ]
    -        }]}
    -].

    A newly started erlang shell shows that no 'ssh-dss' is present in the -public_key entry:

    1> proplists:get_value(public_key, ssh:default_algorithms()).
    -['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
    +but not in the default set.

    The config file ex3.config has the contents:

    [
    + {ssh, [{modify_algorithms,
    +         [ {prepend, [{public_key, ['ssh-dss']}]} ]
    +        }]}
    +].

    A newly started erlang shell shows that no 'ssh-dss' is present in the +public_key entry:

    1> proplists:get_value(public_key, ssh:default_algorithms()).
    +['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
      'ecdsa-sha2-nistp256','ssh-ed25519','ssh-ed448',
    - 'rsa-sha2-256','rsa-sha2-512','ssh-rsa']
    -2>

    A call to ssh:connect/3 removes all algorithms but one of each type:

    2> ssh:start().
    + 'rsa-sha2-256','rsa-sha2-512','ssh-rsa']
    +2>

    A call to ssh:connect/3 removes all algorithms but one of each type:

    2> ssh:start().
     ok
    -3> {ok,C} = ssh:connect(loopback, 22,
    -                        [{preferred_algorithms,
    -                         [{public_key, ['ecdsa-sha2-nistp256']},
    -			  {kex, ['ecdh-sha2-nistp256']},
    -		          {cipher, ['chacha20-poly1305@openssh.com']},
    -			  {mac, ['hmac-sha2-256']},
    -			  {compression, [none]}
    -			  ]}
    -			 ]).
    -{ok,<0.101.0>}
    -4> ssh:connection_info(C,algorithms).
    -{algorithms,[{kex,'ecdh-sha2-nistp256'},
    -             {hkey,'ssh-dss'},
    -             {send_mac,'chacha20-poly1305@openssh.com'},
    -             {recv_mac,'chacha20-poly1305@openssh.com'},
    -             {encrypt,'chacha20-poly1305@openssh.com'},
    -             {decrypt,'chacha20-poly1305@openssh.com'},
    -             {compress,none},
    -             {decompress,none},
    -             {send_ext_info,false},
    -             {recv_ext_info,true}]}
    +3> {ok,C} = ssh:connect(loopback, 22,
    +                        [{preferred_algorithms,
    +                         [{public_key, ['ecdsa-sha2-nistp256']},
    +			  {kex, ['ecdh-sha2-nistp256']},
    +		          {cipher, ['chacha20-poly1305@openssh.com']},
    +			  {mac, ['hmac-sha2-256']},
    +			  {compression, [none]}
    +			  ]}
    +			 ]).
    +{ok,<0.101.0>}
    +4> ssh:connection_info(C,algorithms).
    +{algorithms,[{kex,'ecdh-sha2-nistp256'},
    +             {hkey,'ssh-dss'},
    +             {send_mac,'chacha20-poly1305@openssh.com'},
    +             {recv_mac,'chacha20-poly1305@openssh.com'},
    +             {encrypt,'chacha20-poly1305@openssh.com'},
    +             {decrypt,'chacha20-poly1305@openssh.com'},
    +             {compress,none},
    +             {decompress,none},
    +             {send_ext_info,false},
    +             {recv_ext_info,true}]}
     5>

    But 'ssh-dss' is selected although the call inserted only 'ecdsa-sha2-nistp256' as acceptable.

    This example showed that we could augment the set of algorithms with a config-file without the need to change the actual call.

    For demonstration purposes we used prepend instead of append. This forces /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh.epub/OEBPS/configure_algos.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh.epub/OEBPS/configure_algos.xhtml 2025-05-10 20:19:19.389283656 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh.epub/OEBPS/configure_algos.xhtml 2025-05-10 20:19:19.397283729 +0000 @@ -65,29 +65,29 @@ supported by the:

    • crypto app,
    • The cryptolib OTP is linked with, usually the one the OS uses, probably OpenSSL,
    • and finally what the SSH app implements

    Due to this, it impossible to list in documentation what algorithms that are available in a certain installation.

    There is an important command to list the actual algorithms and their ordering: -ssh:default_algorithms/0.

    0> ssh:default_algorithms().
    -[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
    +ssh:default_algorithms/0.

    0> ssh:default_algorithms().
    +[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
            'ecdh-sha2-nistp256','diffie-hellman-group-exchange-sha256',
            'diffie-hellman-group16-sha512',
            'diffie-hellman-group18-sha512',
            'diffie-hellman-group14-sha256',
            'diffie-hellman-group14-sha1',
    -       'diffie-hellman-group-exchange-sha1']},
    - {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
    +       'diffie-hellman-group-exchange-sha1']},
    + {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
                   'ecdsa-sha2-nistp256','ssh-rsa','rsa-sha2-256',
    -              'rsa-sha2-512','ssh-dss']},
    - {cipher,[{client2server,['aes256-gcm@openssh.com',
    +              'rsa-sha2-512','ssh-dss']},
    + {cipher,[{client2server,['aes256-gcm@openssh.com',
                               'aes256-ctr','aes192-ctr','aes128-gcm@openssh.com',
    -                          'aes128-ctr','aes128-cbc','3des-cbc']},
    -          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
    +                          'aes128-ctr','aes128-cbc','3des-cbc']},
    +          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
                               'aes192-ctr','aes128-gcm@openssh.com','aes128-ctr',
    -                          'aes128-cbc','3des-cbc']}]},
    - {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']},
    -       {server2client,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']}]},
    - {compression,[{client2server,[none,'zlib@openssh.com',zlib]},
    -               {server2client,[none,'zlib@openssh.com',zlib]}]}]

    To change the algorithm list, there are two options which can be used in + 'aes128-cbc','3des-cbc']}]}, + {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}, + {server2client,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}]}, + {compression,[{client2server,[none,'zlib@openssh.com',zlib]}, + {server2client,[none,'zlib@openssh.com',zlib]}]}]

    To change the algorithm list, there are two options which can be used in ssh:connect/2,3,4 and ssh:daemon/2,3. The options could of course be used in all other functions that initiates connections.

    The options are @@ -110,28 +110,28 @@ Example 1

    Replace the kex algorithms list with the single algorithm -'diffie-hellman-group14-sha256':

    1> ssh:chk_algos_opts(
    -               [{preferred_algorithms,
    -                     [{kex, ['diffie-hellman-group14-sha256']}
    -                     ]
    -                }
    -              ]).
    -[{kex,['diffie-hellman-group14-sha256']},
    - {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
    +'diffie-hellman-group14-sha256':

    1> ssh:chk_algos_opts(
    +               [{preferred_algorithms,
    +                     [{kex, ['diffie-hellman-group14-sha256']}
    +                     ]
    +                }
    +              ]).
    +[{kex,['diffie-hellman-group14-sha256']},
    + {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
                   'ecdsa-sha2-nistp256','ssh-rsa','rsa-sha2-256',
    -              'rsa-sha2-512','ssh-dss']},
    - {cipher,[{client2server,['aes256-gcm@openssh.com',
    +              'rsa-sha2-512','ssh-dss']},
    + {cipher,[{client2server,['aes256-gcm@openssh.com',
                               'aes256-ctr','aes192-ctr','aes128-gcm@openssh.com',
    -                          'aes128-ctr','aes128-cbc','3des-cbc']},
    -          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
    +                          'aes128-ctr','aes128-cbc','3des-cbc']},
    +          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
                               'aes192-ctr','aes128-gcm@openssh.com','aes128-ctr',
    -                          'aes128-cbc','3des-cbc']}]},
    - {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']},
    -       {server2client,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']}]},
    - {compression,[{client2server,[none,'zlib@openssh.com',zlib]},
    -               {server2client,[none,'zlib@openssh.com',zlib]}]}]

    Note that the unmentioned lists (public_key, cipher, mac and + 'aes128-cbc','3des-cbc']}]}, + {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}, + {server2client,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}]}, + {compression,[{client2server,[none,'zlib@openssh.com',zlib]}, + {server2client,[none,'zlib@openssh.com',zlib]}]}]

    Note that the unmentioned lists (public_key, cipher, mac and compression) are unchanged.

    @@ -139,30 +139,30 @@ Example 2

    In the lists that are divided in two for the two directions (for example cipher) it is -possible to change both directions at once:

    2> ssh:chk_algos_opts(
    -               [{preferred_algorithms,
    -                     [{cipher,['aes128-ctr']}
    -                     ]
    -                }
    -              ]).
    -[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
    +possible to change both directions at once:

    2> ssh:chk_algos_opts(
    +               [{preferred_algorithms,
    +                     [{cipher,['aes128-ctr']}
    +                     ]
    +                }
    +              ]).
    +[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
            'ecdh-sha2-nistp256','diffie-hellman-group-exchange-sha256',
            'diffie-hellman-group16-sha512',
            'diffie-hellman-group18-sha512',
            'diffie-hellman-group14-sha256',
            'diffie-hellman-group14-sha1',
    -       'diffie-hellman-group-exchange-sha1']},
    - {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
    +       'diffie-hellman-group-exchange-sha1']},
    + {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
                   'ecdsa-sha2-nistp256','ssh-rsa','rsa-sha2-256',
    -              'rsa-sha2-512','ssh-dss']},
    - {cipher,[{client2server,['aes128-ctr']},
    -          {server2client,['aes128-ctr']}]},
    - {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']},
    -       {server2client,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']}]},
    - {compression,[{client2server,[none,'zlib@openssh.com',zlib]},
    -               {server2client,[none,'zlib@openssh.com',zlib]}]}]

    Note that both lists in cipher has been changed to the provided value + 'rsa-sha2-512','ssh-dss']}, + {cipher,[{client2server,['aes128-ctr']}, + {server2client,['aes128-ctr']}]}, + {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}, + {server2client,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}]}, + {compression,[{client2server,[none,'zlib@openssh.com',zlib]}, + {server2client,[none,'zlib@openssh.com',zlib]}]}]

    Note that both lists in cipher has been changed to the provided value ('aes128-ctr').

    @@ -170,56 +170,56 @@ Example 3

    In the lists that are divided in two for the two directions (for example cipher) it is -possible to change only one of the directions:

    3> ssh:chk_algos_opts(
    -               [{preferred_algorithms,
    -                     [{cipher,[{client2server,['aes128-ctr']}]}
    -                     ]
    -                }
    -              ]).
    -[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
    +possible to change only one of the directions:

    3> ssh:chk_algos_opts(
    +               [{preferred_algorithms,
    +                     [{cipher,[{client2server,['aes128-ctr']}]}
    +                     ]
    +                }
    +              ]).
    +[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
            'ecdh-sha2-nistp256','diffie-hellman-group-exchange-sha256',
            'diffie-hellman-group16-sha512',
            'diffie-hellman-group18-sha512',
            'diffie-hellman-group14-sha256',
            'diffie-hellman-group14-sha1',
    -       'diffie-hellman-group-exchange-sha1']},
    - {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
    +       'diffie-hellman-group-exchange-sha1']},
    + {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
                   'ecdsa-sha2-nistp256','ssh-rsa','rsa-sha2-256',
    -              'rsa-sha2-512','ssh-dss']},
    - {cipher,[{client2server,['aes128-ctr']},
    -          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
    +              'rsa-sha2-512','ssh-dss']},
    + {cipher,[{client2server,['aes128-ctr']},
    +          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
                               'aes192-ctr','aes128-gcm@openssh.com','aes128-ctr',
    -                          'aes128-cbc','3des-cbc']}]},
    - {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']},
    -       {server2client,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']}]},
    - {compression,[{client2server,[none,'zlib@openssh.com',zlib]},
    -               {server2client,[none,'zlib@openssh.com',zlib]}]}]

    + 'aes128-cbc','3des-cbc']}]}, + {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}, + {server2client,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}]}, + {compression,[{client2server,[none,'zlib@openssh.com',zlib]}, + {server2client,[none,'zlib@openssh.com',zlib]}]}]

    Example 4

    -

    It is of course possible to change more than one list:

    4> ssh:chk_algos_opts(
    -               [{preferred_algorithms,
    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text)
    --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh.epub/OEBPS/content.opf	2025-05-10 20:19:19.389283656 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh.epub/OEBPS/content.opf	2025-05-10 20:19:19.397283729 +0000
    @@ -4,10 +4,10 @@
              version="3.0">
       
         ssh - 5.2.11
    -    urn:uuid:4474f165-faea-2d90-3c72-0b0f6f7af12c
    +    urn:uuid:d3aca685-4f57-96f5-e41f-d32da4294410
         en
     
    -    2025-05-10T20:12:05Z
    +    2041-06-12T09:32:11Z
     
       
       
    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh.epub/OEBPS/hardening.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh.epub/OEBPS/hardening.xhtml	2025-05-10 20:19:19.389283656 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh.epub/OEBPS/hardening.xhtml	2025-05-10 20:19:19.397283729 +0000
    @@ -109,16 +109,16 @@
     could be replaced with a pwdfun plugin. The arity
     four variant (pwdfun_4()) can also be used for
     introducing delays after failed password checking attempts. Here is a simple
    -example of such a pwdfun:

    fun(User, Password, _PeerAddress, State) ->
    -        case lists:member({User,Password}, my_user_pwds()) of
    +example of such a pwdfun:

    fun(User, Password, _PeerAddress, State) ->
    +        case lists:member({User,Password}, my_user_pwds()) of
                 true ->
    -                {true, undefined}; % Reset delay time
    +                {true, undefined}; % Reset delay time
                 false when State == undefined ->
    -                timer:sleep(1000),
    -                {false, 2000}; % Next delay is 2000 ms
    -            false when is_integer(State) ->
    -                timer:sleep(State),
    -                {false, 2*State} % Double the delay for each failure
    +                timer:sleep(1000),
    +                {false, 2000}; % Next delay is 2000 ms
    +            false when is_integer(State) ->
    +                timer:sleep(State),
    +                {false, 2*State} % Double the delay for each failure
             end
     end.

    If a public key is used for logging in, there is normally no checking of the user name. It could be enabled by setting the option @@ -187,7 +187,7 @@ exploiting known faults or peculiarities learned by reading the public code.

    Each SSH client or daemon presents themselves to each other with brand and version. This may look like

    SSH-2.0-Erlang/4.10

    or

    SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3

    This brand and version may be changed with the option id_string. We start a daemon with that -option:

    	ssh:daemon(1234, [{id_string,"hi there"}, ... ]).

    and the daemon will present itself as:

    SSH-2.0-hi there

    It is possible to replace the string with one randomly generated for each +option:

    	ssh:daemon(1234, [{id_string,"hi there"}, ... ]).

    and the daemon will present itself as:

    SSH-2.0-hi there

    It is possible to replace the string with one randomly generated for each connection attempt. See the reference manual for id_string.

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh.epub/OEBPS/ssh.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh.epub/OEBPS/ssh.xhtml 2025-05-10 20:19:19.389283656 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh.epub/OEBPS/ssh.xhtml 2025-05-10 20:19:19.397283729 +0000 @@ -3363,14 +3363,14 @@

    List of algorithms to use in the algorithm negotiation. The default algs_list/0 can be obtained from default_algorithms/0.

    If an alg_entry() is missing in the algs_list(), the default value is used for -that entry.

    Here is an example of this option:

    	  {preferred_algorithms,
    -	  [{public_key,['ssh-rsa','ssh-dss']},
    -	  {cipher,[{client2server,['aes128-ctr']},
    -          {server2client,['aes128-cbc','3des-cbc']}]},
    -	  {mac,['hmac-sha2-256','hmac-sha1']},
    -	  {compression,[none,zlib]}
    -	  ]
    -	  }

    The example specifies different algorithms in the two directions (client2server +that entry.

    Here is an example of this option:

    	  {preferred_algorithms,
    +	  [{public_key,['ssh-rsa','ssh-dss']},
    +	  {cipher,[{client2server,['aes128-ctr']},
    +          {server2client,['aes128-cbc','3des-cbc']}]},
    +	  {mac,['hmac-sha2-256','hmac-sha1']},
    +	  {compression,[none,zlib]}
    +	  ]
    +	  }

    The example specifies different algorithms in the two directions (client2server and server2client), for cipher but specifies the same algorithms for mac and compression in both directions. The kex (key exchange) is implicit but public_key is set explicitly.

    For background and more examples see the @@ -5198,21 +5198,21 @@

    hostkey_fingerprint([DigestType], HostKey) -> [string()]hostkey_fingerprint(DigestType, HostKey) -> string()

    Calculates a ssh fingerprint from a public host key as openssh does.

    The algorithm in hostkey_fingerprint/1 is md5 to be compatible with older ssh-keygen commands. The string from the second variant is -prepended by the algorithm name in uppercase as in newer ssh-keygen commands.

    Examples:

     2> ssh:hostkey_fingerprint(Key).
    +prepended by the algorithm name in uppercase as in newer ssh-keygen commands.

    Examples:

     2> ssh:hostkey_fingerprint(Key).
      "f5:64:a6:c1:5a:cb:9f:0a:10:46:a2:5c:3e:2f:57:84"
     
    - 3> ssh:hostkey_fingerprint(md5,Key).
    + 3> ssh:hostkey_fingerprint(md5,Key).
      "MD5:f5:64:a6:c1:5a:cb:9f:0a:10:46:a2:5c:3e:2f:57:84"
     
    - 4> ssh:hostkey_fingerprint(sha,Key).
    + 4> ssh:hostkey_fingerprint(sha,Key).
      "SHA1:bSLY/C4QXLDL/Iwmhyg0PGW9UbY"
     
    - 5> ssh:hostkey_fingerprint(sha256,Key).
    + 5> ssh:hostkey_fingerprint(sha256,Key).
      "SHA256:aZGXhabfbf4oxglxltItWeHU7ub3Dc31NcNw2cMJePQ"
     
    - 6> ssh:hostkey_fingerprint([sha,sha256],Key).
    - ["SHA1:bSLY/C4QXLDL/Iwmhyg0PGW9UbY",
    -  "SHA256:aZGXhabfbf4oxglxltItWeHU7ub3Dc31NcNw2cMJePQ"]
    +
    6> ssh:hostkey_fingerprint([sha,sha256],Key). + ["SHA1:bSLY/C4QXLDL/Iwmhyg0PGW9UbY", + "SHA256:aZGXhabfbf4oxglxltItWeHU7ub3Dc31NcNw2cMJePQ"]
    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh.epub/OEBPS/ssh_agent.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh.epub/OEBPS/ssh_agent.xhtml 2025-05-10 20:19:19.389283656 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh.epub/OEBPS/ssh_agent.xhtml 2025-05-10 20:19:19.397283729 +0000 @@ -30,11 +30,11 @@ authentication.

    Ssh_agent implements the ssh_client_key_api, to allow it to be used by setting the option key_cb when starting a client (with for example ssh:connect, -ssh:shell ).

          {key_cb, {ssh_agent, []}}

    The agent communication is established through a UNIX domain socket. By default, +ssh:shell ).

          {key_cb, {ssh_agent, []}}

    The agent communication is established through a UNIX domain socket. By default, the socket path will be fetched from the SSH_AUTH_SOCK environment variable, which is the default socket path in the agent implementation of OpenSSH.

    In order to set a different socket path the socket_path -option can be set.

          {key_cb, {ssh_agent, [{socket_path, SocketPath}]}}

    Note

    The functions are Callbacks for the SSH app. They are not intended to be +option can be set.

          {key_cb, {ssh_agent, [{socket_path, SocketPath}]}}

    Note

    The functions are Callbacks for the SSH app. They are not intended to be called from the user's code!

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh.epub/OEBPS/using_ssh.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh.epub/OEBPS/using_ssh.xhtml 2025-05-10 20:19:19.385283619 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh.epub/OEBPS/using_ssh.xhtml 2025-05-10 20:19:19.393283693 +0000 @@ -35,9 +35,9 @@ Using the Erlang ssh Terminal Client

    The user otptest, which has bash as default shell, uses the ssh:shell/1 -client to connect to the OpenSSH daemon running on a host called ssh.example.com:

    1> ssh:start().
    +client to connect to the OpenSSH daemon running on a host called ssh.example.com:

    1> ssh:start().
     ok
    -2> {ok, S} = ssh:shell("ssh.example.com").
    +2> {ok, S} = ssh:shell("ssh.example.com").
     otptest@ssh.example.com:> pwd
     /home/otptest
     otptest@ssh.example.com:> exit
    @@ -56,11 +56,11 @@
     [...]
     $bash> ssh-keygen -t rsa -f /tmp/otptest_user/.ssh/id_rsa
     [...]

    Step 2. Create the file /tmp/otptest_user/.ssh/authorized_keys and add the -content of /tmp/otptest_user/.ssh/id_rsa.pub.

    Step 3. Start the Erlang ssh daemon:

    1> ssh:start().
    +content of /tmp/otptest_user/.ssh/id_rsa.pub.

    Step 3. Start the Erlang ssh daemon:

    1> ssh:start().
     ok
    -2> {ok, Sshd} = ssh:daemon(8989, [{system_dir, "/tmp/ssh_daemon"},
    -                                  {user_dir, "/tmp/otptest_user/.ssh"}]).
    -{ok,<0.54.0>}
    +2> {ok, Sshd} = ssh:daemon(8989, [{system_dir, "/tmp/ssh_daemon"},
    +                                  {user_dir, "/tmp/otptest_user/.ssh"}]).
    +{ok,<0.54.0>}
     3>

    Step 4. Use the OpenSSH client from a shell to connect to the Erlang ssh daemon:

    $bash> ssh ssh.example.com -p 8989  -i /tmp/otptest_user/.ssh/id_rsa \
                       -o UserKnownHostsFile=/tmp/otptest_user/.ssh/known_hosts
    @@ -71,10 +71,10 @@
     Eshell V5.10  (abort with ^G)
     1>

    There are two ways of shutting down an ssh daemon, see Step 5a and Step 5b.

    Step 5a. Shut down the Erlang ssh daemon so that it stops the listener but -leaves existing connections, started by the listener, operational:

    3> ssh:stop_listener(Sshd).
    +leaves existing connections, started by the listener, operational:

    3> ssh:stop_listener(Sshd).
     ok
     4>

    Step 5b. Shut down the Erlang ssh daemon so that it stops the listener and -all connections started by the listener:

    3> ssh:stop_daemon(Sshd).
    +all connections started by the listener:

    3> ssh:stop_daemon(Sshd).
     ok
     4>

    @@ -90,35 +90,35 @@

    In the following example, the Erlang shell is the client process that receives the channel replies as Erlang messages.

    Do an one-time execution of a remote OS command ("pwd") over ssh to the ssh -server of the OS at the host "ssh.example.com":

    1> ssh:start().
    +server of the OS at the host "ssh.example.com":

    1> ssh:start().
     ok
    -2> {ok, ConnectionRef} = ssh:connect("ssh.example.com", 22, []).
    -{ok,<0.57.0>}
    -3> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    -{ok,0}
    -4> success = ssh_connection:exec(ConnectionRef, ChannelId, "pwd", infinity).
    -5> flush(). % Get all pending messages. NOTE: ordering may vary!
    -Shell got {ssh_cm,<0.57.0>,{data,0,0,<<"/home/otptest\n">>}}
    -Shell got {ssh_cm,<0.57.0>,{eof,0}}
    -Shell got {ssh_cm,<0.57.0>,{exit_status,0,0}}
    -Shell got {ssh_cm,<0.57.0>,{closed,0}}
    +2> {ok, ConnectionRef} = ssh:connect("ssh.example.com", 22, []).
    +{ok,<0.57.0>}
    +3> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    +{ok,0}
    +4> success = ssh_connection:exec(ConnectionRef, ChannelId, "pwd", infinity).
    +5> flush(). % Get all pending messages. NOTE: ordering may vary!
    +Shell got {ssh_cm,<0.57.0>,{data,0,0,<<"/home/otptest\n">>}}
    +Shell got {ssh_cm,<0.57.0>,{eof,0}}
    +Shell got {ssh_cm,<0.57.0>,{exit_status,0,0}}
    +Shell got {ssh_cm,<0.57.0>,{closed,0}}
     ok
    -6> ssh:connection_info(ConnectionRef, channels).
    -{channels,[]}
    +6> ssh:connection_info(ConnectionRef, channels).
    +{channels,[]}
     7>

    See ssh_connection and ssh_connection:exec/4 for finding documentation of the channel messages.

    To collect the channel messages in a program, use receive...end instead of flush/1:

    5> receive
    -5>     {ssh_cm, ConnectionRef, {data, ChannelId, Type, Result}} when Type == 0 ->
    -5>         {ok,Result}
    -5>     {ssh_cm, ConnectionRef, {data, ChannelId, Type, Result}} when Type == 1 ->
    -5>         {error,Result}
    +5>     {ssh_cm, ConnectionRef, {data, ChannelId, Type, Result}} when Type == 0 ->
    +5>         {ok,Result}
    +5>     {ssh_cm, ConnectionRef, {data, ChannelId, Type, Result}} when Type == 1 ->
    +5>         {error,Result}
     5> end.
    -{ok,<<"/home/otptest\n">>}
    +{ok,<<"/home/otptest\n">>}
     6>

    Note that only the exec channel is closed after the one-time execution. The connection is still up and can handle previously opened channels. It is also possible to open a new channel:

    % try to open a new channel to check if the ConnectionRef is still open
    -7> {ok, NewChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    -{ok,1}
    +7> {ok, NewChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    +{ok,1}
     8>

    To close the connection, call the function ssh:close(ConnectionRef). As an alternative, set the option {idle_time, 1} when opening the @@ -133,23 +133,23 @@ "command" must be as if entered into the erlang shell, that is a sequence of Erlang expressions ended by a period (.). Variables bound in that sequence will keep their bindings throughout the expression -sequence. The bindings are disposed when the result is returned.

    Here is an example of a suitable expression sequence:

    A=1, B=2, 3 == (A + B).

    It evaluates to true if submitted to the Erlang daemon started in +sequence. The bindings are disposed when the result is returned.

    Here is an example of a suitable expression sequence:

    A=1, B=2, 3 == (A + B).

    It evaluates to true if submitted to the Erlang daemon started in Step 3 above:

    $bash> ssh ssh.example.com -p 8989 "A=1, B=2, 3 == (A + B)."
     true
     $bash>

    The same example but now using the Erlang ssh client to contact the Erlang -server:

    1> {ok, ConnectionRef} = ssh:connect("ssh.example.com", 8989, []).
    -{ok,<0.216.0>}
    -2> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    -{ok,0}
    -3> success = ssh_connection:exec(ConnectionRef, ChannelId,
    +server:

    1> {ok, ConnectionRef} = ssh:connect("ssh.example.com", 8989, []).
    +{ok,<0.216.0>}
    +2> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    +{ok,0}
    +3> success = ssh_connection:exec(ConnectionRef, ChannelId,
                                      "A=1, B=2, 3 == (A + B).",
    -                                 infinity).
    +                                 infinity).
     success
    -4> flush().
    -Shell got {ssh_cm,<0.216.0>,{data,0,0,<<"true">>}}
    -Shell got {ssh_cm,<0.216.0>,{exit_status,0,0}}
    -Shell got {ssh_cm,<0.216.0>,{eof,0}}
    -Shell got {ssh_cm,<0.216.0>,{closed,0}}
    +4> flush().
    +Shell got {ssh_cm,<0.216.0>,{data,0,0,<<"true">>}}
    +Shell got {ssh_cm,<0.216.0>,{exit_status,0,0}}
    +Shell got {ssh_cm,<0.216.0>,{eof,0}}
    +Shell got {ssh_cm,<0.216.0>,{closed,0}}
     ok
     5>

    Note that Erlang shell specific functions and control sequences like for example h(). are not supported.

    @@ -170,36 +170,36 @@ write something: [a,b,c]. {ok,[a,b,c]} $bash>

    The same example but using the Erlang ssh client:

    
    -Eshell V10.5.2  (abort with ^G)
    -1> ssh:start().
    +Eshell V10.5.2  (abort with ^G)
    +1> ssh:start().
     ok
    -2> {ok, ConnectionRef} = ssh:connect(loopback, 8989, []).
    -{ok,<0.92.0>}
    -3> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    -{ok,0}
    -4> success = ssh_connection:exec(ConnectionRef, ChannelId,
    +2> {ok, ConnectionRef} = ssh:connect(loopback, 8989, []).
    +{ok,<0.92.0>}
    +3> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    +{ok,0}
    +4> success = ssh_connection:exec(ConnectionRef, ChannelId,
                                      "io:read(\"write something: \").",
    -                                 infinity).
    +                                 infinity).
     success
    -5> flush().
    -Shell got {ssh_cm,<0.92.0>,{data,0,0,<<"write something: ">>}}
    +5> flush().
    +Shell got {ssh_cm,<0.92.0>,{data,0,0,<<"write something: ">>}}
     ok
     % All data is sent as binaries with string contents:
    -6> ok = ssh_connection:send(ConnectionRef, ChannelId, <<"[a,b,c].">>).
    +6> ok = ssh_connection:send(ConnectionRef, ChannelId, <<"[a,b,c].">>).
     ok
    -7> flush().
    +7> flush().
     ok
     %% Nothing is received, because the io:read/1
     %% requires the input line to end with a newline.
     
     %% Send a newline (it could have been included in the last send):
    -8> ssh_connection:send(ConnectionRef, ChannelId, <<"\n">>).
    +8> ssh_connection:send(ConnectionRef, ChannelId, <<"\n">>).
     ok
    -9> flush().
    -Shell got {ssh_cm,<0.92.0>,{data,0,0,<<"{ok,[a,b,c]}">>}}
    -Shell got {ssh_cm,<0.92.0>,{exit_status,0,0}}
    -Shell got {ssh_cm,<0.92.0>,{eof,0}}
    -Shell got {ssh_cm,<0.92.0>,{closed,0}}
    +9> flush().
    +Shell got {ssh_cm,<0.92.0>,{data,0,0,<<"{ok,[a,b,c]}">>}}
    +Shell got {ssh_cm,<0.92.0>,{exit_status,0,0}}
    +Shell got {ssh_cm,<0.92.0>,{eof,0}}
    +Shell got {ssh_cm,<0.92.0>,{closed,0}}
     ok
     10>

    @@ -216,44 +216,44 @@ ssh:daemon/2,3 and exec_daemon_option() for details.

    Examples of the two ways to configure the exec evaluator:

    1. Disable one-time execution.
      To modify the daemon start example above to reject one-time execution requests, we change Step 3 by adding the -option {exec, disabled} to:
    1> ssh:start().
    +option {exec, disabled} to:
    1> ssh:start().
     ok
    -2> {ok, Sshd} = ssh:daemon(8989, [{system_dir, "/tmp/ssh_daemon"},
    -                                  {user_dir, "/tmp/otptest_user/.ssh"},
    -                                  {exec, disabled}
    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh.html	2025-05-10 20:19:19.609285651 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh.html	2025-05-10 20:19:19.609285651 +0000
    @@ -3489,14 +3489,14 @@
     
     

    List of algorithms to use in the algorithm negotiation. The default algs_list/0 can be obtained from default_algorithms/0.

    If an alg_entry() is missing in the algs_list(), the default value is used for -that entry.

    Here is an example of this option:

    	  {preferred_algorithms,
    -	  [{public_key,['ssh-rsa','ssh-dss']},
    -	  {cipher,[{client2server,['aes128-ctr']},
    -          {server2client,['aes128-cbc','3des-cbc']}]},
    -	  {mac,['hmac-sha2-256','hmac-sha1']},
    -	  {compression,[none,zlib]}
    -	  ]
    -	  }

    The example specifies different algorithms in the two directions (client2server +that entry.

    Here is an example of this option:

    	  {preferred_algorithms,
    +	  [{public_key,['ssh-rsa','ssh-dss']},
    +	  {cipher,[{client2server,['aes128-ctr']},
    +          {server2client,['aes128-cbc','3des-cbc']}]},
    +	  {mac,['hmac-sha2-256','hmac-sha1']},
    +	  {compression,[none,zlib]}
    +	  ]
    +	  }

    The example specifies different algorithms in the two directions (client2server and server2client), for cipher but specifies the same algorithms for mac and compression in both directions. The kex (key exchange) is implicit but public_key is set explicitly.

    For background and more examples see the @@ -5339,21 +5339,21 @@

    hostkey_fingerprint([DigestType], HostKey) -> [string()]hostkey_fingerprint(DigestType, HostKey) -> string()

    Calculates a ssh fingerprint from a public host key as openssh does.

    The algorithm in hostkey_fingerprint/1 is md5 to be compatible with older ssh-keygen commands. The string from the second variant is -prepended by the algorithm name in uppercase as in newer ssh-keygen commands.

    Examples:

     2> ssh:hostkey_fingerprint(Key).
    +prepended by the algorithm name in uppercase as in newer ssh-keygen commands.

    Examples:

     2> ssh:hostkey_fingerprint(Key).
      "f5:64:a6:c1:5a:cb:9f:0a:10:46:a2:5c:3e:2f:57:84"
     
    - 3> ssh:hostkey_fingerprint(md5,Key).
    + 3> ssh:hostkey_fingerprint(md5,Key).
      "MD5:f5:64:a6:c1:5a:cb:9f:0a:10:46:a2:5c:3e:2f:57:84"
     
    - 4> ssh:hostkey_fingerprint(sha,Key).
    + 4> ssh:hostkey_fingerprint(sha,Key).
      "SHA1:bSLY/C4QXLDL/Iwmhyg0PGW9UbY"
     
    - 5> ssh:hostkey_fingerprint(sha256,Key).
    + 5> ssh:hostkey_fingerprint(sha256,Key).
      "SHA256:aZGXhabfbf4oxglxltItWeHU7ub3Dc31NcNw2cMJePQ"
     
    - 6> ssh:hostkey_fingerprint([sha,sha256],Key).
    - ["SHA1:bSLY/C4QXLDL/Iwmhyg0PGW9UbY",
    -  "SHA256:aZGXhabfbf4oxglxltItWeHU7ub3Dc31NcNw2cMJePQ"]
    +
    6> ssh:hostkey_fingerprint([sha,sha256],Key). + ["SHA1:bSLY/C4QXLDL/Iwmhyg0PGW9UbY", + "SHA256:aZGXhabfbf4oxglxltItWeHU7ub3Dc31NcNw2cMJePQ"]
    @@ -5936,7 +5936,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_agent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_agent.html 2025-05-10 20:19:19.645285976 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_agent.html 2025-05-10 20:19:19.645285976 +0000 @@ -135,11 +135,11 @@ authentication.

    Ssh_agent implements the ssh_client_key_api, to allow it to be used by setting the option key_cb when starting a client (with for example ssh:connect, -ssh:shell ).

          {key_cb, {ssh_agent, []}}

    The agent communication is established through a UNIX domain socket. By default, +ssh:shell ).

          {key_cb, {ssh_agent, []}}

    The agent communication is established through a UNIX domain socket. By default, the socket path will be fetched from the SSH_AUTH_SOCK environment variable, which is the default socket path in the agent implementation of OpenSSH.

    In order to set a different socket path the socket_path -option can be set.

          {key_cb, {ssh_agent, [{socket_path, SocketPath}]}}

    Note

    The functions are Callbacks for the SSH app. They are not intended to be +option can be set.

          {key_cb, {ssh_agent, [{socket_path, SocketPath}]}}

    Note

    The functions are Callbacks for the SSH app. They are not intended to be called from the user's code!

    @@ -567,7 +567,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_app.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_app.html 2025-05-10 20:19:19.673286230 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_app.html 2025-05-10 20:19:19.673286230 +0000 @@ -351,7 +351,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_client_channel.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_client_channel.html 2025-05-10 20:19:19.709286557 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_client_channel.html 2025-05-10 20:19:19.709286557 +0000 @@ -992,7 +992,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_client_key_api.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_client_key_api.html 2025-05-10 20:19:19.737286811 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_client_key_api.html 2025-05-10 20:19:19.737286811 +0000 @@ -541,7 +541,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_connection.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_connection.html 2025-05-10 20:19:19.785287246 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_connection.html 2025-05-10 20:19:19.785287246 +0000 @@ -2015,7 +2015,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_file.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_file.html 2025-05-10 20:19:19.817287537 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_file.html 2025-05-10 20:19:19.825287609 +0000 @@ -1040,7 +1040,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_server_channel.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_server_channel.html 2025-05-10 20:19:19.845287790 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_server_channel.html 2025-05-10 20:19:19.849287827 +0000 @@ -387,7 +387,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_server_key_api.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_server_key_api.html 2025-05-10 20:19:19.873288044 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_server_key_api.html 2025-05-10 20:19:19.873288044 +0000 @@ -331,7 +331,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_sftp.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_sftp.html 2025-05-10 20:19:19.917288443 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_sftp.html 2025-05-10 20:19:19.941288661 +0000 @@ -2920,7 +2920,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_sftpd.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_sftpd.html 2025-05-10 20:19:19.965288878 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/ssh_sftpd.html 2025-05-10 20:19:19.969288915 +0000 @@ -244,7 +244,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/terminology.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/terminology.html 2025-05-10 20:19:19.989289096 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/terminology.html 2025-05-10 20:19:19.993289132 +0000 @@ -247,7 +247,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/using_ssh.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/using_ssh.html 2025-05-10 20:19:20.045289603 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.11/doc/html/using_ssh.html 2025-05-10 20:19:20.045289603 +0000 @@ -140,9 +140,9 @@ Using the Erlang ssh Terminal Client

    The user otptest, which has bash as default shell, uses the ssh:shell/1 -client to connect to the OpenSSH daemon running on a host called ssh.example.com:

    1> ssh:start().
    +client to connect to the OpenSSH daemon running on a host called ssh.example.com:

    1> ssh:start().
     ok
    -2> {ok, S} = ssh:shell("ssh.example.com").
    +2> {ok, S} = ssh:shell("ssh.example.com").
     otptest@ssh.example.com:> pwd
     /home/otptest
     otptest@ssh.example.com:> exit
    @@ -161,11 +161,11 @@
     [...]
     $bash> ssh-keygen -t rsa -f /tmp/otptest_user/.ssh/id_rsa
     [...]

    Step 2. Create the file /tmp/otptest_user/.ssh/authorized_keys and add the -content of /tmp/otptest_user/.ssh/id_rsa.pub.

    Step 3. Start the Erlang ssh daemon:

    1> ssh:start().
    +content of /tmp/otptest_user/.ssh/id_rsa.pub.

    Step 3. Start the Erlang ssh daemon:

    1> ssh:start().
     ok
    -2> {ok, Sshd} = ssh:daemon(8989, [{system_dir, "/tmp/ssh_daemon"},
    -                                  {user_dir, "/tmp/otptest_user/.ssh"}]).
    -{ok,<0.54.0>}
    +2> {ok, Sshd} = ssh:daemon(8989, [{system_dir, "/tmp/ssh_daemon"},
    +                                  {user_dir, "/tmp/otptest_user/.ssh"}]).
    +{ok,<0.54.0>}
     3>

    Step 4. Use the OpenSSH client from a shell to connect to the Erlang ssh daemon:

    $bash> ssh ssh.example.com -p 8989  -i /tmp/otptest_user/.ssh/id_rsa \
                       -o UserKnownHostsFile=/tmp/otptest_user/.ssh/known_hosts
    @@ -176,10 +176,10 @@
     Eshell V5.10  (abort with ^G)
     1>

    There are two ways of shutting down an ssh daemon, see Step 5a and Step 5b.

    Step 5a. Shut down the Erlang ssh daemon so that it stops the listener but -leaves existing connections, started by the listener, operational:

    3> ssh:stop_listener(Sshd).
    +leaves existing connections, started by the listener, operational:

    3> ssh:stop_listener(Sshd).
     ok
     4>

    Step 5b. Shut down the Erlang ssh daemon so that it stops the listener and -all connections started by the listener:

    3> ssh:stop_daemon(Sshd).
    +all connections started by the listener:

    3> ssh:stop_daemon(Sshd).
     ok
     4>

    @@ -195,35 +195,35 @@

    In the following example, the Erlang shell is the client process that receives the channel replies as Erlang messages.

    Do an one-time execution of a remote OS command ("pwd") over ssh to the ssh -server of the OS at the host "ssh.example.com":

    1> ssh:start().
    +server of the OS at the host "ssh.example.com":

    1> ssh:start().
     ok
    -2> {ok, ConnectionRef} = ssh:connect("ssh.example.com", 22, []).
    -{ok,<0.57.0>}
    -3> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    -{ok,0}
    -4> success = ssh_connection:exec(ConnectionRef, ChannelId, "pwd", infinity).
    -5> flush(). % Get all pending messages. NOTE: ordering may vary!
    -Shell got {ssh_cm,<0.57.0>,{data,0,0,<<"/home/otptest\n">>}}
    -Shell got {ssh_cm,<0.57.0>,{eof,0}}
    -Shell got {ssh_cm,<0.57.0>,{exit_status,0,0}}
    -Shell got {ssh_cm,<0.57.0>,{closed,0}}
    +2> {ok, ConnectionRef} = ssh:connect("ssh.example.com", 22, []).
    +{ok,<0.57.0>}
    +3> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    +{ok,0}
    +4> success = ssh_connection:exec(ConnectionRef, ChannelId, "pwd", infinity).
    +5> flush(). % Get all pending messages. NOTE: ordering may vary!
    +Shell got {ssh_cm,<0.57.0>,{data,0,0,<<"/home/otptest\n">>}}
    +Shell got {ssh_cm,<0.57.0>,{eof,0}}
    +Shell got {ssh_cm,<0.57.0>,{exit_status,0,0}}
    +Shell got {ssh_cm,<0.57.0>,{closed,0}}
     ok
    -6> ssh:connection_info(ConnectionRef, channels).
    -{channels,[]}
    +6> ssh:connection_info(ConnectionRef, channels).
    +{channels,[]}
     7>

    See ssh_connection and ssh_connection:exec/4 for finding documentation of the channel messages.

    To collect the channel messages in a program, use receive...end instead of flush/1:

    5> receive
    -5>     {ssh_cm, ConnectionRef, {data, ChannelId, Type, Result}} when Type == 0 ->
    -5>         {ok,Result}
    -5>     {ssh_cm, ConnectionRef, {data, ChannelId, Type, Result}} when Type == 1 ->
    -5>         {error,Result}
    +5>     {ssh_cm, ConnectionRef, {data, ChannelId, Type, Result}} when Type == 0 ->
    +5>         {ok,Result}
    +5>     {ssh_cm, ConnectionRef, {data, ChannelId, Type, Result}} when Type == 1 ->
    +5>         {error,Result}
     5> end.
    -{ok,<<"/home/otptest\n">>}
    +{ok,<<"/home/otptest\n">>}
     6>

    Note that only the exec channel is closed after the one-time execution. The connection is still up and can handle previously opened channels. It is also possible to open a new channel:

    % try to open a new channel to check if the ConnectionRef is still open
    -7> {ok, NewChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    -{ok,1}
    +7> {ok, NewChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    +{ok,1}
     8>

    To close the connection, call the function ssh:close(ConnectionRef). As an alternative, set the option {idle_time, 1} when opening the @@ -238,23 +238,23 @@ "command" must be as if entered into the erlang shell, that is a sequence of Erlang expressions ended by a period (.). Variables bound in that sequence will keep their bindings throughout the expression -sequence. The bindings are disposed when the result is returned.

    Here is an example of a suitable expression sequence:

    A=1, B=2, 3 == (A + B).

    It evaluates to true if submitted to the Erlang daemon started in +sequence. The bindings are disposed when the result is returned.

    Here is an example of a suitable expression sequence:

    A=1, B=2, 3 == (A + B).

    It evaluates to true if submitted to the Erlang daemon started in Step 3 above:

    $bash> ssh ssh.example.com -p 8989 "A=1, B=2, 3 == (A + B)."
     true
     $bash>

    The same example but now using the Erlang ssh client to contact the Erlang -server:

    1> {ok, ConnectionRef} = ssh:connect("ssh.example.com", 8989, []).
    -{ok,<0.216.0>}
    -2> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    -{ok,0}
    -3> success = ssh_connection:exec(ConnectionRef, ChannelId,
    +server:

    1> {ok, ConnectionRef} = ssh:connect("ssh.example.com", 8989, []).
    +{ok,<0.216.0>}
    +2> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    +{ok,0}
    +3> success = ssh_connection:exec(ConnectionRef, ChannelId,
                                      "A=1, B=2, 3 == (A + B).",
    -                                 infinity).
    +                                 infinity).
     success
    -4> flush().
    -Shell got {ssh_cm,<0.216.0>,{data,0,0,<<"true">>}}
    -Shell got {ssh_cm,<0.216.0>,{exit_status,0,0}}
    -Shell got {ssh_cm,<0.216.0>,{eof,0}}
    -Shell got {ssh_cm,<0.216.0>,{closed,0}}
    +4> flush().
    +Shell got {ssh_cm,<0.216.0>,{data,0,0,<<"true">>}}
    +Shell got {ssh_cm,<0.216.0>,{exit_status,0,0}}
    +Shell got {ssh_cm,<0.216.0>,{eof,0}}
    +Shell got {ssh_cm,<0.216.0>,{closed,0}}
     ok
     5>

    Note that Erlang shell specific functions and control sequences like for example h(). are not supported.

    @@ -275,36 +275,36 @@ write something: [a,b,c]. {ok,[a,b,c]} $bash>

    The same example but using the Erlang ssh client:

    
    -Eshell V10.5.2  (abort with ^G)
    -1> ssh:start().
    +Eshell V10.5.2  (abort with ^G)
    +1> ssh:start().
     ok
    -2> {ok, ConnectionRef} = ssh:connect(loopback, 8989, []).
    -{ok,<0.92.0>}
    -3> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    -{ok,0}
    -4> success = ssh_connection:exec(ConnectionRef, ChannelId,
    +2> {ok, ConnectionRef} = ssh:connect(loopback, 8989, []).
    +{ok,<0.92.0>}
    +3> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    +{ok,0}
    +4> success = ssh_connection:exec(ConnectionRef, ChannelId,
                                      "io:read(\"write something: \").",
    -                                 infinity).
    +                                 infinity).
     success
    -5> flush().
    -Shell got {ssh_cm,<0.92.0>,{data,0,0,<<"write something: ">>}}
    +5> flush().
    +Shell got {ssh_cm,<0.92.0>,{data,0,0,<<"write something: ">>}}
     ok
     % All data is sent as binaries with string contents:
    -6> ok = ssh_connection:send(ConnectionRef, ChannelId, <<"[a,b,c].">>).
    +6> ok = ssh_connection:send(ConnectionRef, ChannelId, <<"[a,b,c].">>).
     ok
    -7> flush().
    +7> flush().
     ok
     %% Nothing is received, because the io:read/1
     %% requires the input line to end with a newline.
     
     %% Send a newline (it could have been included in the last send):
    -8> ssh_connection:send(ConnectionRef, ChannelId, <<"\n">>).
    +8> ssh_connection:send(ConnectionRef, ChannelId, <<"\n">>).
     ok
    -9> flush().
    -Shell got {ssh_cm,<0.92.0>,{data,0,0,<<"{ok,[a,b,c]}">>}}
    -Shell got {ssh_cm,<0.92.0>,{exit_status,0,0}}
    -Shell got {ssh_cm,<0.92.0>,{eof,0}}
    -Shell got {ssh_cm,<0.92.0>,{closed,0}}
    +9> flush().
    +Shell got {ssh_cm,<0.92.0>,{data,0,0,<<"{ok,[a,b,c]}">>}}
    +Shell got {ssh_cm,<0.92.0>,{exit_status,0,0}}
    +Shell got {ssh_cm,<0.92.0>,{eof,0}}
    +Shell got {ssh_cm,<0.92.0>,{closed,0}}
     ok
     10>

    @@ -321,44 +321,44 @@ ssh:daemon/2,3 and exec_daemon_option() for details.

    Examples of the two ways to configure the exec evaluator:

    1. Disable one-time execution.
      To modify the daemon start example above to reject one-time execution requests, we change Step 3 by adding the -option {exec, disabled} to:
    1> ssh:start().
    +option {exec, disabled} to:
    1> ssh:start().
     ok
    -2> {ok, Sshd} = ssh:daemon(8989, [{system_dir, "/tmp/ssh_daemon"},
    -                                  {user_dir, "/tmp/otptest_user/.ssh"},
    -                                  {exec, disabled}
    /usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/404.html differs (HTML document, UTF-8 Unicode text)
    --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/404.html	2025-05-10 20:19:20.065289785 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/404.html	2025-05-10 20:19:20.065289785 +0000
    @@ -147,7 +147,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/api-reference.html 2025-05-10 20:19:20.085289966 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/api-reference.html 2025-05-10 20:19:20.085289966 +0000 @@ -213,7 +213,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/notes.html 2025-05-10 20:19:20.165290692 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/notes.html 2025-05-10 20:19:20.165290692 +0000 @@ -3551,7 +3551,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/search.html 2025-05-10 20:19:20.189290909 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/search.html 2025-05-10 20:19:20.189290909 +0000 @@ -145,7 +145,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl.epub/OEBPS/content.opf 2025-05-10 20:19:20.221291199 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl.epub/OEBPS/content.opf 2025-05-10 20:19:20.229291272 +0000 @@ -4,10 +4,10 @@ version="3.0"> ssl - 11.2.12 - urn:uuid:ea0db3f7-3266-42fd-a569-4c61c015b7dd + urn:uuid:e72dba20-57f2-0b4d-14ba-90e53a20a1cc en - 2025-05-10T20:11:49Z + 2041-06-12T09:31:56Z /usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl.epub/OEBPS/ssl.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl.epub/OEBPS/ssl.xhtml 2025-05-10 20:19:20.217291163 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl.epub/OEBPS/ssl.xhtml 2025-05-10 20:19:20.225291236 +0000 @@ -26,9 +26,9 @@

    Interface functions for TLS (Transport Layer Security) and DTLS (Datagram Transport Layer Security).

    Note

    The application's name is still SSL because the first versions of the TLS protocol were named SSL (Secure Socket Layer). However, no version -of the old SSL protocol is supported by this application.

    Example:

    1> ssl:start(), ssl:connect("google.com", 443, [{verify, verify_peer},
    -    {cacerts, public_key:cacerts_get()}]).
    -{ok,{sslsocket, [...]}}

    See Examples for detailed usage and more examples of +of the old SSL protocol is supported by this application.

    Example:

    1> ssl:start(), ssl:connect("google.com", 443, [{verify, verify_peer},
    +    {cacerts, public_key:cacerts_get()}]).
    +{ok,{sslsocket, [...]}}

    See Examples for detailed usage and more examples of this API.

    Special Erlang node configuration for the application can be found in SSL Application.

    @@ -2436,26 +2436,26 @@ signature schemes supplied by the signature_algs_cert option.

    The TLS-1.2 default is Default_TLS_12_Alg_Pairs interleaved with rsa_pss_schemes since ssl-11.0 (Erlang/OTP 25). pss_pss is -preferred over pss_rsae, which in turn is preferred over rsa.

    The list for Default_TLS_12_Alg_Pairs is defined as follows:

    [
    -{sha512, ecdsa},
    -{sha512, rsa},
    -{sha384, ecdsa},
    -{sha384, rsa},
    -{sha256, ecdsa},
    -{sha256, rsa}
    -]

    Change

    • Support for {md5, rsa} was removed from the TLS-1.2 default in +preferred over pss_rsae, which in turn is preferred over rsa.

      The list for Default_TLS_12_Alg_Pairs is defined as follows:

      [
      +{sha512, ecdsa},
      +{sha512, rsa},
      +{sha384, ecdsa},
      +{sha384, rsa},
      +{sha256, ecdsa},
      +{sha256, rsa}
      +]

      Change

      • Support for {md5, rsa} was removed from the TLS-1.2 default in ssl-8.0 (Erlang/OTP 22).
      • Support for {sha, _} (SHA1) and {sha224, _} was removed -from the TLS-1.2 default in ssl-11.0 (Erlang/OTP 26).

      The list for rsa_pss_schemes is defined as follows:

      [rsa_pss_pss_sha512,
      +from the TLS-1.2 default in ssl-11.0 (Erlang/OTP 26).

    The list for rsa_pss_schemes is defined as follows:

    [rsa_pss_pss_sha512,
     rsa_pss_pss_sha384,
     rsa_pss_pss_sha256,
     rsa_pss_rsae_sha512,
     rsa_pss_rsae_sha384,
    -rsa_pss_rsae_sha256]

    The list of TLS_13_Legacy_Schemes is defined as follows:

    [
    +rsa_pss_rsae_sha256]

    The list of TLS_13_Legacy_Schemes is defined as follows:

    [
     %% Legacy algorithms only applicable to certificate signatures
     rsa_pkcs1_sha512, %% Corresponds to {sha512, rsa}
     rsa_pkcs1_sha384, %% Corresponds to {sha384, rsa}
     rsa_pkcs1_sha256, %% Corresponds to {sha256, rsa}
    -]

    The list of Default_TLS_13_Schemes is defined as follows:

    [
    +]

    The list of Default_TLS_13_Schemes is defined as follows:

    [
     %% EDDSA
     eddsa_ed25519,
     eddsa_ed448
    @@ -2540,8 +2540,8 @@
     
           
     
    -

    Claim an intermediate CA in the chain as trusted.

    fun(Chain::[public_key:der_encoded()]) ->
    -      {trusted_ca, DerCert::public_key:der_encoded()} | unknown_ca.

    TLS then uses public_key:pkix_path_validation/3 with the selected CA +

    Claim an intermediate CA in the chain as trusted.

    fun(Chain::[public_key:der_encoded()]) ->
    +      {trusted_ca, DerCert::public_key:der_encoded()} | unknown_ca.

    TLS then uses public_key:pkix_path_validation/3 with the selected CA as the trusted anchor and verifies the rest of the chain.

    @@ -2983,7 +2983,7 @@ being sent and disables the hostname verification check.

  • {customize_hostname_check, HostNameCheckOpts} - Customization option

    Customizes the hostname verification of the peer certificate, as various protocols that use TLS, such as HTTP or LDAP, may require different approaches. For example, here is how to use standard hostname checking for HTTPS implemented in -Public_Key:

    {customize_hostname_check, [{match_fun, public_key:pkix_verify_hostname_match_fun(https)}]}

    For futher description of the customize options, see +Public_Key:

    {customize_hostname_check, [{match_fun, public_key:pkix_verify_hostname_match_fun(https)}]}

    For futher description of the customize options, see public_key:pkix_verify_hostname/3.

  • {client_certificate_authorities, UseCertAuth} - Inter-op hint option

    If UseCertAuth is set to true, sends the certificate authorities extension in the TLS-1.3 client hello. The default is false. Note that setting UseCertAuth to true can result in a significant @@ -3127,7 +3127,7 @@

    Options only relevant for TLS-1.3.

    • {session_tickets, SessionTickets} - Use of session tickets

      Configures the session ticket functionality. Allowed values are disabled, manual, and auto. If it is set to manual the client will send the ticket -information to user process in a 3-tuple:

      {ssl, session_ticket, {SNI, TicketData}}

      where SNI is the ServerNameIndication and TicketData is the extended ticket +information to user process in a 3-tuple:

      {ssl, session_ticket, {SNI, TicketData}}

      where SNI is the ServerNameIndication and TicketData is the extended ticket data that can be used in subsequent session resumptions.

      If it is set to auto, the client automatically handles received tickets and tries to use them when making new TLS connections (session resumption with pre-shared keys).

      Ticket lifetime, the number of tickets sent by the server, and the @@ -3137,7 +3137,7 @@ mandatory option in manual mode ({session_tickets, manual}).

      Note

      Session tickets are only sent to the user if option session_tickets is set to manual

      This option is supported by TLS-1.3. See also SSL User's Guide, Session Tickets and Session Resumption in TLS 1.3.

    • {early_data, EarlyData}

      Configures the early data to be sent by the client.

      To verify that the server has the intention to process the early -data, the following tuple is sent to the user process:

      {ssl, SslSocket, {early_data, Result}}

      where Result is either accepted or rejected.

      Warning

      It is the responsibility of the user to handle rejected EarlyData and to +data, the following tuple is sent to the user process:

      {ssl, SslSocket, {early_data, Result}}

      where Result is either accepted or rejected.

      Warning

      It is the responsibility of the user to handle rejected EarlyData and to resend when appropriate.

    • {middlebox_comp_mode, MiddleBoxMode}

      Configures the middlebox compatibility mode for a TLS-1.3 connection.

      A significant number of middleboxes misbehave when a TLS-1.3 connection is negotiated. Implementations can increase the chance of making connections through those middleboxes by adapting the TLS-1.3 @@ -3576,20 +3576,20 @@ peer certificate in a valid certification path. So, if depth is 0 the PEER must be signed by the trusted ROOT-CA directly; if 1 the path can be PEER, CA, ROOT-CA; if 2 the path can be PEER, CA, CA, ROOT-CA, and so on. The default -value is 10. Used to mitigate DoS attack possibilities.

    • {verify_fun, Verify} - Customize certificate path validation

      The verification fun is to be defined as follows:

      fun(OtpCert :: #'OTPCertificate'{},
      -    Event, InitialUserState :: term()) ->
      -  {valid, UserState :: term()} |
      -  {fail, Reason :: term()} | {unknown, UserState :: term()}.
      -
      -fun(OtpCert :: #'OTPCertificate'{}, DerCert :: public_key:der_encoded(),
      -    Event, InitialUserState :: term()) ->
      -  {valid, UserState :: term()} |
      -  {fail, Reason :: term()} | {unknown, UserState :: term()}.
      +value is 10. Used to mitigate DoS attack possibilities.

    • {verify_fun, Verify} - Customize certificate path validation

      The verification fun is to be defined as follows:

      fun(OtpCert :: #'OTPCertificate'{},
      +    Event, InitialUserState :: term()) ->
      +  {valid, UserState :: term()} |
      +  {fail, Reason :: term()} | {unknown, UserState :: term()}.
      +
      +fun(OtpCert :: #'OTPCertificate'{}, DerCert :: public_key:der_encoded(),
      +    Event, InitialUserState :: term()) ->
      +  {valid, UserState :: term()} |
      +  {fail, Reason :: term()} | {unknown, UserState :: term()}.
       
       Types:
      -      Event = {bad_cert, Reason :: atom() |
      -              {revoked, atom()}} |
      -      {extension, #'Extension'{}} |
      +      Event = {bad_cert, Reason :: atom() |
      +              {revoked, atom()}} |
      +      {extension, #'Extension'{}} |
                     valid |
                     valid_peer

      The verification fun is called during the X.509-path validation when an error occurs or an extension unknown to the SSL application is @@ -3606,25 +3606,25 @@ handshake does not terminate regardless of verification failures, and the connection is established.

    • If called with an extension unknown to the user application, the fun is to return {unknown, UserState}.

    Note that if the fun returns unknown for an extension marked as critical, -validation will fail.

    Default option verify_fun in verify_peer mode:

    {fun(_, _, {bad_cert, _} = Reason, _) ->
    -   {fail, Reason};
    -    (_, _, {extension, _}, UserState) ->
    -   {unknown, UserState};
    -    (_, _, valid, UserState) ->
    -   {valid, UserState};
    -    (_, _, valid_peer, UserState) ->
    -       {valid, UserState}
    - end, []}

    Default option verify_fun in mode verify_none:

     {fun(_, _, {bad_cert, _}, UserState) ->
    -   {valid, UserState};
    -    (_, _, {extension, #'Extension'{critical = true}}, UserState) ->
    -   {valid, UserState};
    -    (_, _, {extension, _}, UserState) ->
    -   {unknown, UserState};
    -    (_, _, valid, UserState) ->
    -   {valid, UserState};
    -    (_, _, valid_peer, UserState) ->
    -       {valid, UserState}
    - end, []}

    The possible path validation errors are given in the form {bad_cert, Reason}, +validation will fail.

    Default option verify_fun in verify_peer mode:

    {fun(_, _, {bad_cert, _} = Reason, _) ->
    +   {fail, Reason};
    +    (_, _, {extension, _}, UserState) ->
    +   {unknown, UserState};
    +    (_, _, valid, UserState) ->
    +   {valid, UserState};
    +    (_, _, valid_peer, UserState) ->
    +       {valid, UserState}
    + end, []}

    Default option verify_fun in mode verify_none:

     {fun(_, _, {bad_cert, _}, UserState) ->
    +   {valid, UserState};
    +    (_, _, {extension, #'Extension'{critical = true}}, UserState) ->
    +   {valid, UserState};
    +    (_, _, {extension, _}, UserState) ->
    +   {unknown, UserState};
    +    (_, _, valid, UserState) ->
    +   {valid, UserState};
    +    (_, _, valid_peer, UserState) ->
    +       {valid, UserState}
    + end, []}

    The possible path validation errors are given in the form {bad_cert, Reason}, where Reason is:

    • unknown_ca

      No trusted CA was found in the trusted store. The trusted CA is normally a so-called ROOT CA, which is a self-signed certificate. Trust can be claimed for an intermediate CA (the trusted anchor does not have to be @@ -3774,11 +3774,11 @@ enforced. If SecureRenegotiate is false secure renegotiation will still be used if possible, but it falls back to insecure renegotiation if the peer does not support if RFC -5746.

    • {user_lookup_fun, {LookupFun, UserState}} - PSK/SRP cipher suite option

      The lookup fun is to be defined as follows:

      fun(psk, PSKIdentity :: binary(), UserState :: term()) ->
      -  {ok, SharedSecret :: binary()} | error;
      -fun(srp, Username :: binary(), UserState :: term()) ->
      -  {ok, {SRPParams :: srp_param_type(), Salt :: binary(),
      -        DerivedKey :: binary()}} | error.

      For Pre-Shared Key (PSK) cipher suites, the lookup fun is called by the client +5746.

    • {user_lookup_fun, {LookupFun, UserState}} - PSK/SRP cipher suite option

      The lookup fun is to be defined as follows:

      fun(psk, PSKIdentity :: binary(), UserState :: term()) ->
      +  {ok, SharedSecret :: binary()} | error;
      +fun(srp, Username :: binary(), UserState :: term()) ->
      +  {ok, {SRPParams :: srp_param_type(), Salt :: binary(),
      +        DerivedKey :: binary()}} | error.

      For Pre-Shared Key (PSK) cipher suites, the lookup fun is called by the client and server to determine the shared secret. When called by the client, PSKIdentity is the hint presented by the server or undefined. When called by the server, PSKIdentity is the identity presented by the client.

      For Secure Remote Password (SRP), the fun is only used by the server to obtain @@ -4141,8 +4141,8 @@ -

      Opens a TLS/DTLS connection.

      connect(TCPSocket, TLSOptions, Timeout).

      Upgrades a gen_tcp (or equivalent) connected socket to a TLS socket by -performing the client-side TLS handshake.

      connect(Host, Port, TLSOptions).

      Opens a TLS/DTLS connection to Host, Port. This call is equivalent to:

      connect(Host, Port, TLSOptions, infinity).
      +

      Opens a TLS/DTLS connection.

      connect(TCPSocket, TLSOptions, Timeout).

      Upgrades a gen_tcp (or equivalent) connected socket to a TLS socket by +performing the client-side TLS handshake.

      connect(Host, Port, TLSOptions).

      Opens a TLS/DTLS connection to Host, Port. This call is equivalent to:

      connect(Host, Port, TLSOptions, infinity).
      @@ -4273,7 +4273,7 @@ /usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl.epub/OEBPS/ssl_distribution.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl.epub/OEBPS/ssl_distribution.xhtml 2025-05-10 20:19:20.217291163 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl.epub/OEBPS/ssl_distribution.xhtml 2025-05-10 20:19:20.225291236 +0000 @@ -42,14 +42,14 @@ applications. Such a script is located in the bin directory of the Erlang distribution. The source for the script is found under the Erlang installation top directory under releases/<OTP version>/start_clean.rel.

      Do the following:

      • Copy that script to another location (and preferably another name).
      • Add the applications Crypto, Public Key, and SSL with their current version -numbers after the STDLIB application.

      The following shows an example .rel file with TLS added:

            {release, {"OTP  APN 181 01","R15A"}, {erts, "5.9"},
      -      [{kernel,"2.15"},
      -      {stdlib,"1.18"},
      -      {crypto, "2.0.3"},
      -      {public_key, "0.12"},
      -      {asn1, "4.0"},
      -      {ssl, "5.0"}
      -      ]}.

      The version numbers differ in your system. Whenever one of the applications +numbers after the STDLIB application.

    The following shows an example .rel file with TLS added:

          {release, {"OTP  APN 181 01","R15A"}, {erts, "5.9"},
    +      [{kernel,"2.15"},
    +      {stdlib,"1.18"},
    +      {crypto, "2.0.3"},
    +      {public_key, "0.12"},
    +      {asn1, "4.0"},
    +      {ssl, "5.0"}
    +      ]}.

    The version numbers differ in your system. Whenever one of the applications included in the script is upgraded, change the script.

    Do the following:

    • Build the boot script.

      Assuming the .rel file is stored in a file start_ssl.rel in the current directory, a boot script can be built as follows:

       1> systools:make_script("start_ssl",[]).

    There is now a start_ssl.boot file in the current directory.

    Do the following:

    • Test the boot script. To do this, start Erlang with the -boot command-line parameter specifying this boot script (with its full path, but without the @@ -96,10 +96,10 @@ so beware!

      For TLS to work, at least a public key and a certificate must be specified for the server side and the client needs to specify CAs that it trusts (client certification is optional and requires more configuration).

      In the following example (to keep it simple), the PEM file "/home/me/ssl/erlserver.pem" -contains both the server certificate and its private key .

      Create a file named for example "/home/me/ssl/ssl_test@myhost.conf":

      [{server,
      -  [{certfile, "/home/me/ssl/erlserver.pem"}]},
      - {client,
      -  [{cacertfile, "/home/me/ssl/client_trusted.pem"}]}].

      And then start the node like this (line breaks in the command are for +contains both the server certificate and its private key .

      Create a file named for example "/home/me/ssl/ssl_test@myhost.conf":

      [{server,
      +  [{certfile, "/home/me/ssl/erlserver.pem"}]},
      + {client,
      +  [{cacertfile, "/home/me/ssl/client_trusted.pem"}]}].

      And then start the node like this (line breaks in the command are for readability, and shall not be there when typed):

      $ erl -boot /home/me/ssl/start_ssl -proto_dist inet_tls
         -ssl_dist_optfile "/home/me/ssl/ssl_test@myhost.conf"
         -sname ssl_test

      The options in the {server, Opts} tuple are used when calling @@ -169,19 +169,19 @@ -ssl_dist_opt server_secure_renegotiate true client_secure_renegotiate true" $ export ERL_FLAGS $ erl -sname ssl_test -Erlang (BEAM) emulator version 5.0 [source] +Erlang (BEAM) emulator version 5.0 [source] -Eshell V5.0 (abort with ^G) -(ssl_test@myhost)1> init:get_arguments(). -[{root,["/usr/local/erlang"]}, - {progname,["erl "]}, - {sname,["ssl_test"]}, - {boot,["/home/me/ssl/start_ssl"]}, - {proto_dist,["inet_tls"]}, - {ssl_dist_opt,["server_certfile","/home/me/ssl/erlserver.pem"]}, - {ssl_dist_opt,["server_secure_renegotiate","true", - "client_secure_renegotiate","true"] - {home,["/home/me"]}]

  • The init:get_arguments() call verifies that the correct arguments are supplied +Eshell V5.0 (abort with ^G) +(ssl_test@myhost)1> init:get_arguments(). +[{root,["/usr/local/erlang"]}, + {progname,["erl "]}, + {sname,["ssl_test"]}, + {boot,["/home/me/ssl/start_ssl"]}, + {proto_dist,["inet_tls"]}, + {ssl_dist_opt,["server_certfile","/home/me/ssl/erlserver.pem"]}, + {ssl_dist_opt,["server_secure_renegotiate","true", + "client_secure_renegotiate","true"] + {home,["/home/me"]}]

    The init:get_arguments() call verifies that the correct arguments are supplied to the emulator.

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl.epub/OEBPS/using_ssl.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl.epub/OEBPS/using_ssl.xhtml 2025-05-10 20:19:20.217291163 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl.epub/OEBPS/using_ssl.xhtml 2025-05-10 20:19:20.225291236 +0000 @@ -44,38 +44,38 @@ Basic Client

    -
     1 > ssl:start(), ssl:connect("google.com", 443, [{verify, verify_peer},
    -                                                 {cacerts, public_key:cacerts_get()}]).
    -   {ok,{sslsocket, [...]}}

    +
     1 > ssl:start(), ssl:connect("google.com", 443, [{verify, verify_peer},
    +                                                 {cacerts, public_key:cacerts_get()}]).
    +   {ok,{sslsocket, [...]}}

    Basic Connection

    -

    Step 1: Start the server side:

    1 server> ssl:start().
    +

    Step 1: Start the server side:

    1 server> ssl:start().
     ok

    Step 2: with alternative certificates, in this example the EDDSA certificate will be preferred if TLS-1.3 is negotiated and the RSA certificate will always -be used for TLS-1.2 as it does not support the EDDSA algorithm:

    2 server> {ok, ListenSocket} =
    -ssl:listen(9999, [{certs_keys, [#{certfile => "eddsacert.pem",
    -                                  keyfile => "eddsakey.pem"},
    -                                #{certfile => "rsacert.pem",
    +be used for TLS-1.2 as it does not support the EDDSA algorithm:

    2 server> {ok, ListenSocket} =
    +ssl:listen(9999, [{certs_keys, [#{certfile => "eddsacert.pem",
    +                                  keyfile => "eddsakey.pem"},
    +                                #{certfile => "rsacert.pem",
                                       keyfile => "rsakey.pem",
    -                                  password => "foobar"}
    -                               ]},{reuseaddr, true}]).
    -{ok,{sslsocket, [...]}}

    Step 3: Do a transport accept on the TLS listen socket:

    3 server> {ok, TLSTransportSocket} = ssl:transport_accept(ListenSocket).
    -{ok,{sslsocket, [...]}}

    Note

    ssl:transport_accept/1 and ssl:handshake/2 are separate functions so that the + password => "foobar"} + ]},{reuseaddr, true}]). +{ok,{sslsocket, [...]}}

    Step 3: Do a transport accept on the TLS listen socket:

    3 server> {ok, TLSTransportSocket} = ssl:transport_accept(ListenSocket).
    +{ok,{sslsocket, [...]}}

    Note

    ssl:transport_accept/1 and ssl:handshake/2 are separate functions so that the handshake part can be called in a new erlang process dedicated to handling the -connection

    Step 4: Start the client side:

    1 client> ssl:start().
    +connection

    Step 4: Start the client side:

    1 client> ssl:start().
     ok

    Be sure to configure trusted certificates to use for server certificate -verification.

    2 client> {ok, Socket} = ssl:connect("localhost", 9999,
    -      [{verify, verify_peer},
    -      {cacertfile, "cacerts.pem"}, {active, once}], infinity).
    -{ok,{sslsocket, [...]}}

    Step 5: Do the TLS handshake:

    4 server> {ok, Socket} = ssl:handshake(TLSTransportSocket).
    -{ok,{sslsocket, [...]}}

    Note

    A real server should use ssl:handshake/2 that has a timeout to avoid DoS -attacks. In the example the timeout defaults to infinty.

    Step 6: Send a message over TLS:

    5 server> ssl:send(Socket, "foo").
    +verification.

    2 client> {ok, Socket} = ssl:connect("localhost", 9999,
    +      [{verify, verify_peer},
    +      {cacertfile, "cacerts.pem"}, {active, once}], infinity).
    +{ok,{sslsocket, [...]}}

    Step 5: Do the TLS handshake:

    4 server> {ok, Socket} = ssl:handshake(TLSTransportSocket).
    +{ok,{sslsocket, [...]}}

    Note

    A real server should use ssl:handshake/2 that has a timeout to avoid DoS +attacks. In the example the timeout defaults to infinty.

    Step 6: Send a message over TLS:

    5 server> ssl:send(Socket, "foo").
     ok

    Step 7: Flush the shell message queue to see that the message sent on the -server side is recived by the client side:

    3 client> flush().
    -Shell got {ssl,{sslsocket,[...]},"foo"}
    +server side is recived by the client side:

    3 client> flush().
    +Shell got {ssl,{sslsocket,[...]},"foo"}
     ok

    @@ -87,27 +87,27 @@ communication channel by using TLS. Note that the client and server need to agree to do the upgrade in the protocol doing the communication. This is concept is often referenced as STARTLS and used in many protocols such as SMTP, -FTPS and HTTPS via a proxy.

    Warning

    Maximum security recommendations are however moving away from such solutions.

    To upgrade to a TLS connection:

    Step 1: Start the server side:

    1 server> ssl:start().
    +FTPS and HTTPS via a proxy.

    Warning

    Maximum security recommendations are however moving away from such solutions.

    To upgrade to a TLS connection:

    Step 1: Start the server side:

    1 server> ssl:start().
       ok

    Step 2: Create a normal TCP listen socket and ensure active is set to false and not set to any active mode otherwise TLS handshake messages can be -delivered to the wrong process.

    2 server> {ok, ListenSocket} = gen_tcp:listen(9999, [{reuseaddr, true},
    -  {active, false}]).
    -  {ok, #Port<0.475>}

    Step 3: Accept client connection:

    3 server> {ok, Socket} = gen_tcp:accept(ListenSocket).
    -  {ok, #Port<0.476>}

    Step 4: Start the client side:

    1 client> ssl:start().
    -  ok
    2 client> {ok, Socket} = gen_tcp:connect("localhost", 9999,  [], infinity).

    Step 5: Do the TLS handshake:

    4 server> {ok, TLSSocket} = ssl:handshake(Socket, [{verify, verify_peer},
    -  {fail_if_no_peer_cert, true},
    -  {cacertfile, "cacerts.pem"},
    -  {certs_keys, [#{certfile => "cert.pem", keyfile => "key.pem"}]}]).
    -  {ok,{sslsocket,[...]}}

    Step 6: Upgrade to a TLS connection. The client and server must agree upon the +delivered to the wrong process.

    2 server> {ok, ListenSocket} = gen_tcp:listen(9999, [{reuseaddr, true},
    +  {active, false}]).
    +  {ok, #Port<0.475>}

    Step 3: Accept client connection:

    3 server> {ok, Socket} = gen_tcp:accept(ListenSocket).
    +  {ok, #Port<0.476>}

    Step 4: Start the client side:

    1 client> ssl:start().
    +  ok
    2 client> {ok, Socket} = gen_tcp:connect("localhost", 9999,  [], infinity).

    Step 5: Do the TLS handshake:

    4 server> {ok, TLSSocket} = ssl:handshake(Socket, [{verify, verify_peer},
    +  {fail_if_no_peer_cert, true},
    +  {cacertfile, "cacerts.pem"},
    +  {certs_keys, [#{certfile => "cert.pem", keyfile => "key.pem"}]}]).
    +  {ok,{sslsocket,[...]}}

    Step 6: Upgrade to a TLS connection. The client and server must agree upon the upgrade. The server must be prepared to be a TLS server before the client can do -a successful connect.

    3 client>{ok, TLSSocket} = ssl:connect(Socket, [{verify, verify_peer},
    -  {cacertfile, "cacerts.pem"},
    -  {certs_keys, [#{certfile => "cert.pem", keyfile => "key.pem"}]}], infinity).
    -{ok,{sslsocket,[...]}}

    Step 7: Send a message over TLS:

    4 client> ssl:send(TLSSocket, "foo").
    -      ok

    Step 8: Set active once on the TLS socket:

    5 server> ssl:setopts(TLSSocket, [{active, once}]).
    +a successful connect.

    3 client>{ok, TLSSocket} = ssl:connect(Socket, [{verify, verify_peer},
    +  {cacertfile, "cacerts.pem"},
    +  {certs_keys, [#{certfile => "cert.pem", keyfile => "key.pem"}]}], infinity).
    +{ok,{sslsocket,[...]}}

    Step 7: Send a message over TLS:

    4 client> ssl:send(TLSSocket, "foo").
    +      ok

    Step 8: Set active once on the TLS socket:

    5 server> ssl:setopts(TLSSocket, [{active, once}]).
           ok

    Step 9: Flush the shell message queue to see that the message sent on the -client side is recived by the server side:

    5 server> flush().
    -      Shell got {ssl,{sslsocket,[...]},"foo"}
    +client side is recived by the server side:

    5 server> flush().
    +      Shell got {ssl,{sslsocket,[...]},"foo"}
           ok

    @@ -115,34 +115,34 @@ Customizing cipher suites

    Fetch default cipher suite list for a TLS/DTLS version. Change default to all to -get all possible cipher suites.

    1>  Default = ssl:cipher_suites(default, 'tlsv1.2').
    -    [#{cipher => aes_256_gcm,key_exchange => ecdhe_ecdsa,
    -    mac => aead,prf => sha384}, ....]

    In OTP 20 it is desirable to remove all cipher suites that uses rsa key exchange +get all possible cipher suites.

    1>  Default = ssl:cipher_suites(default, 'tlsv1.2').
    +    [#{cipher => aes_256_gcm,key_exchange => ecdhe_ecdsa,
    +    mac => aead,prf => sha384}, ....]

    In OTP 20 it is desirable to remove all cipher suites that uses rsa key exchange (removed from default in 21)

    2> NoRSA =
    -    ssl:filter_cipher_suites(Default,
    -                             [{key_exchange, fun(rsa) -> false;
    -                                                (_) -> true
    -                                             end}]).
    -    [...]

    Pick just a few suites

     3> Suites =
    - ssl:filter_cipher_suites(Default,
    -                             [{key_exchange, fun(ecdh_ecdsa) -> true;
    -                                                (_) -> false
    -                                             end},
    -                              {cipher, fun(aes_128_cbc) -> true;
    -                                          (_) ->false
    -                                       end}]).
    -
    -[#{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,
    -   mac => sha256,prf => sha256},
    - #{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,mac => sha,
    -   prf => default_prf}]

    Make some particular suites the most preferred, or least preferred by changing -prepend to append.

     4>ssl:prepend_cipher_suites(Suites, Default).
    -  [#{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,
    -     mac => sha256,prf => sha256},
    -   #{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,mac => sha,
    -     prf => default_prf},
    -   #{cipher => aes_256_cbc,key_exchange => ecdhe_ecdsa,
    -     mac => sha384,prf => sha384}, ...]

    + ssl:filter_cipher_suites(Default, + [{key_exchange, fun(rsa) -> false; + (_) -> true + end}]). + [...]

    Pick just a few suites

     3> Suites =
    + ssl:filter_cipher_suites(Default,
    +                             [{key_exchange, fun(ecdh_ecdsa) -> true;
    +                                                (_) -> false
    +                                             end},
    +                              {cipher, fun(aes_128_cbc) -> true;
    +                                          (_) ->false
    +                                       end}]).
    +
    +[#{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,
    +   mac => sha256,prf => sha256},
    + #{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,mac => sha,
    +   prf => default_prf}]

    Make some particular suites the most preferred, or least preferred by changing +prepend to append.

     4>ssl:prepend_cipher_suites(Suites, Default).
    +  [#{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,
    +     mac => sha256,prf => sha256},
    +   #{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,mac => sha,
    +     prf => default_prf},
    +   #{cipher => aes_256_cbc,key_exchange => ecdhe_ecdsa,
    +     mac => sha384,prf => sha384}, ...]

    @@ -160,9 +160,9 @@ suite that is chosen, which is not the case in TLS-1.3.

    Using the function ssl:signature_algs/2 will let you inspect different aspects of possible configurations for your system. For example if TLS-1.3 and TLS-1.2 is supported the default signature_algorithm list in OTP-26 and cryptolib from -OpenSSL 3.0.2 would look like:

     1>  ssl:signature_algs(default, 'tlsv1.3').
    +OpenSSL 3.0.2 would look like:

     1>  ssl:signature_algs(default, 'tlsv1.3').
      %% TLS-1.3 schemes
    - [eddsa_ed25519,eddsa_ed448,ecdsa_secp521r1_sha512,
    + [eddsa_ed25519,eddsa_ed448,ecdsa_secp521r1_sha512,
       ecdsa_secp384r1_sha384,ecdsa_secp256r1_sha256,
       rsa_pss_pss_sha512,rsa_pss_pss_sha384,rsa_pss_pss_sha256,
       rsa_pss_rsae_sha512,rsa_pss_rsae_sha384,rsa_pss_rsae_sha256,
    @@ -170,12 +170,12 @@
       %% (would have a tuple name in TLS-1.2 only configuration)
       rsa_pkcs1_sha512,rsa_pkcs1_sha384,rsa_pkcs1_sha256
       %% TLS 1.2 algorithms
    -  {sha512,ecdsa},
    -  {sha384,ecdsa},
    -  {sha256,ecdsa}]

    If you want to add support for non default supported algorithms you should + {sha512,ecdsa}, + {sha384,ecdsa}, + {sha256,ecdsa}]

    If you want to add support for non default supported algorithms you should append them to the default list as the configuration is in prefered order, -something like this:

        MySignatureAlgs = ssl:signature_algs(default, 'tlsv1.3') ++ [{sha, rsa}, {sha, dsa}],
    -    ssl:connect(Host,Port,[{signature_algs, MySignatureAlgs,...]}),
    +something like this:

        MySignatureAlgs = ssl:signature_algs(default, 'tlsv1.3') ++ [{sha, rsa}, {sha, dsa}],
    +    ssl:connect(Host,Port,[{signature_algs, MySignatureAlgs,...]}),
         ...

    See also ssl:signature_algs/2 and sign_algo()

    @@ -183,20 +183,20 @@ /usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl.html 2025-05-10 20:19:20.421293013 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl.html 2025-05-10 20:19:20.421293013 +0000 @@ -131,9 +131,9 @@

    Interface functions for TLS (Transport Layer Security) and DTLS (Datagram Transport Layer Security).

    Note

    The application's name is still SSL because the first versions of the TLS protocol were named SSL (Secure Socket Layer). However, no version -of the old SSL protocol is supported by this application.

    Example:

    1> ssl:start(), ssl:connect("google.com", 443, [{verify, verify_peer},
    -    {cacerts, public_key:cacerts_get()}]).
    -{ok,{sslsocket, [...]}}

    See Examples for detailed usage and more examples of +of the old SSL protocol is supported by this application.

    Example:

    1> ssl:start(), ssl:connect("google.com", 443, [{verify, verify_peer},
    +    {cacerts, public_key:cacerts_get()}]).
    +{ok,{sslsocket, [...]}}

    See Examples for detailed usage and more examples of this API.

    Special Erlang node configuration for the application can be found in SSL Application.

    @@ -2557,26 +2557,26 @@ signature schemes supplied by the signature_algs_cert option.

    The TLS-1.2 default is Default_TLS_12_Alg_Pairs interleaved with rsa_pss_schemes since ssl-11.0 (Erlang/OTP 25). pss_pss is -preferred over pss_rsae, which in turn is preferred over rsa.

    The list for Default_TLS_12_Alg_Pairs is defined as follows:

    [
    -{sha512, ecdsa},
    -{sha512, rsa},
    -{sha384, ecdsa},
    -{sha384, rsa},
    -{sha256, ecdsa},
    -{sha256, rsa}
    -]

    Change

    • Support for {md5, rsa} was removed from the TLS-1.2 default in +preferred over pss_rsae, which in turn is preferred over rsa.

      The list for Default_TLS_12_Alg_Pairs is defined as follows:

      [
      +{sha512, ecdsa},
      +{sha512, rsa},
      +{sha384, ecdsa},
      +{sha384, rsa},
      +{sha256, ecdsa},
      +{sha256, rsa}
      +]

      Change

      • Support for {md5, rsa} was removed from the TLS-1.2 default in ssl-8.0 (Erlang/OTP 22).
      • Support for {sha, _} (SHA1) and {sha224, _} was removed -from the TLS-1.2 default in ssl-11.0 (Erlang/OTP 26).

      The list for rsa_pss_schemes is defined as follows:

      [rsa_pss_pss_sha512,
      +from the TLS-1.2 default in ssl-11.0 (Erlang/OTP 26).

    The list for rsa_pss_schemes is defined as follows:

    [rsa_pss_pss_sha512,
     rsa_pss_pss_sha384,
     rsa_pss_pss_sha256,
     rsa_pss_rsae_sha512,
     rsa_pss_rsae_sha384,
    -rsa_pss_rsae_sha256]

    The list of TLS_13_Legacy_Schemes is defined as follows:

    [
    +rsa_pss_rsae_sha256]

    The list of TLS_13_Legacy_Schemes is defined as follows:

    [
     %% Legacy algorithms only applicable to certificate signatures
     rsa_pkcs1_sha512, %% Corresponds to {sha512, rsa}
     rsa_pkcs1_sha384, %% Corresponds to {sha384, rsa}
     rsa_pkcs1_sha256, %% Corresponds to {sha256, rsa}
    -]

    The list of Default_TLS_13_Schemes is defined as follows:

    [
    +]

    The list of Default_TLS_13_Schemes is defined as follows:

    [
     %% EDDSA
     eddsa_ed25519,
     eddsa_ed448
    @@ -2666,8 +2666,8 @@
     
           
     
    -

    Claim an intermediate CA in the chain as trusted.

    fun(Chain::[public_key:der_encoded()]) ->
    -      {trusted_ca, DerCert::public_key:der_encoded()} | unknown_ca.

    TLS then uses public_key:pkix_path_validation/3 with the selected CA +

    Claim an intermediate CA in the chain as trusted.

    fun(Chain::[public_key:der_encoded()]) ->
    +      {trusted_ca, DerCert::public_key:der_encoded()} | unknown_ca.

    TLS then uses public_key:pkix_path_validation/3 with the selected CA as the trusted anchor and verifies the rest of the chain.

    @@ -3119,7 +3119,7 @@ being sent and disables the hostname verification check.

  • {customize_hostname_check, HostNameCheckOpts} - Customization option

    Customizes the hostname verification of the peer certificate, as various protocols that use TLS, such as HTTP or LDAP, may require different approaches. For example, here is how to use standard hostname checking for HTTPS implemented in -Public_Key:

    {customize_hostname_check, [{match_fun, public_key:pkix_verify_hostname_match_fun(https)}]}

    For futher description of the customize options, see +Public_Key:

    {customize_hostname_check, [{match_fun, public_key:pkix_verify_hostname_match_fun(https)}]}

    For futher description of the customize options, see public_key:pkix_verify_hostname/3.

  • {client_certificate_authorities, UseCertAuth} - Inter-op hint option

    If UseCertAuth is set to true, sends the certificate authorities extension in the TLS-1.3 client hello. The default is false. Note that setting UseCertAuth to true can result in a significant @@ -3263,7 +3263,7 @@

    Options only relevant for TLS-1.3.

    • {session_tickets, SessionTickets} - Use of session tickets

      Configures the session ticket functionality. Allowed values are disabled, manual, and auto. If it is set to manual the client will send the ticket -information to user process in a 3-tuple:

      {ssl, session_ticket, {SNI, TicketData}}

      where SNI is the ServerNameIndication and TicketData is the extended ticket +information to user process in a 3-tuple:

      {ssl, session_ticket, {SNI, TicketData}}

      where SNI is the ServerNameIndication and TicketData is the extended ticket data that can be used in subsequent session resumptions.

      If it is set to auto, the client automatically handles received tickets and tries to use them when making new TLS connections (session resumption with pre-shared keys).

      Ticket lifetime, the number of tickets sent by the server, and the @@ -3273,7 +3273,7 @@ mandatory option in manual mode ({session_tickets, manual}).

      Note

      Session tickets are only sent to the user if option session_tickets is set to manual

      This option is supported by TLS-1.3. See also SSL User's Guide, Session Tickets and Session Resumption in TLS 1.3.

    • {early_data, EarlyData}

      Configures the early data to be sent by the client.

      To verify that the server has the intention to process the early -data, the following tuple is sent to the user process:

      {ssl, SslSocket, {early_data, Result}}

      where Result is either accepted or rejected.

      Warning

      It is the responsibility of the user to handle rejected EarlyData and to +data, the following tuple is sent to the user process:

      {ssl, SslSocket, {early_data, Result}}

      where Result is either accepted or rejected.

      Warning

      It is the responsibility of the user to handle rejected EarlyData and to resend when appropriate.

    • {middlebox_comp_mode, MiddleBoxMode}

      Configures the middlebox compatibility mode for a TLS-1.3 connection.

      A significant number of middleboxes misbehave when a TLS-1.3 connection is negotiated. Implementations can increase the chance of making connections through those middleboxes by adapting the TLS-1.3 @@ -3722,20 +3722,20 @@ peer certificate in a valid certification path. So, if depth is 0 the PEER must be signed by the trusted ROOT-CA directly; if 1 the path can be PEER, CA, ROOT-CA; if 2 the path can be PEER, CA, CA, ROOT-CA, and so on. The default -value is 10. Used to mitigate DoS attack possibilities.

    • {verify_fun, Verify} - Customize certificate path validation

      The verification fun is to be defined as follows:

      fun(OtpCert :: #href_anchor"ss">'OTPCertificate'{},
      -    Event, InitialUserState :: term()) ->
      -  {valid, UserState :: term()} |
      -  {fail, Reason :: term()} | {unknown, UserState :: term()}.
      -
      -fun(OtpCert :: #'OTPCertificate'{}, DerCert :: public_key:der_encoded(),
      -    Event, InitialUserState :: term()) ->
      -  {valid, UserState :: term()} |
      -  {fail, Reason :: term()} | {unknown, UserState :: term()}.
      +value is 10. Used to mitigate DoS attack possibilities.

    • {verify_fun, Verify} - Customize certificate path validation

      The verification fun is to be defined as follows:

      fun(OtpCert :: #href_anchor"ss">'OTPCertificate'{},
      +    Event, InitialUserState :: term()) ->
      +  {valid, UserState :: term()} |
      +  {fail, Reason :: term()} | {unknown, UserState :: term()}.
      +
      +fun(OtpCert :: #'OTPCertificate'{}, DerCert :: public_key:der_encoded(),
      +    Event, InitialUserState :: term()) ->
      +  {valid, UserState :: term()} |
      +  {fail, Reason :: term()} | {unknown, UserState :: term()}.
       
       Types:
      -      Event = {bad_cert, Reason :: atom() |
      -              {revoked, atom()}} |
      -      {extension, #'Extension'{}} |
      +      Event = {bad_cert, Reason :: atom() |
      +              {revoked, atom()}} |
      +      {extension, #'Extension'{}} |
                     valid |
                     valid_peer

      The verification fun is called during the X.509-path validation when an error occurs or an extension unknown to the SSL application is @@ -3752,25 +3752,25 @@ handshake does not terminate regardless of verification failures, and the connection is established.

    • If called with an extension unknown to the user application, the fun is to return {unknown, UserState}.

    Note that if the fun returns unknown for an extension marked as critical, -validation will fail.

    Default option verify_fun in verify_peer mode:

    {fun(_, _, {bad_cert, _} = Reason, _) ->
    -   {fail, Reason};
    -    (_, _, {extension, _}, UserState) ->
    -   {unknown, UserState};
    -    (_, _, valid, UserState) ->
    -   {valid, UserState};
    -    (_, _, valid_peer, UserState) ->
    -       {valid, UserState}
    - end, []}

    Default option verify_fun in mode verify_none:

     {fun(_, _, {bad_cert, _}, UserState) ->
    -   {valid, UserState};
    -    (_, _, {extension, #'Extension'{critical = true}}, UserState) ->
    -   {valid, UserState};
    -    (_, _, {extension, _}, UserState) ->
    -   {unknown, UserState};
    -    (_, _, valid, UserState) ->
    -   {valid, UserState};
    -    (_, _, valid_peer, UserState) ->
    -       {valid, UserState}
    - end, []}

    The possible path validation errors are given in the form {bad_cert, Reason}, +validation will fail.

    Default option verify_fun in verify_peer mode:

    {fun(_, _, {bad_cert, _} = Reason, _) ->
    +   {fail, Reason};
    +    (_, _, {extension, _}, UserState) ->
    +   {unknown, UserState};
    +    (_, _, valid, UserState) ->
    +   {valid, UserState};
    +    (_, _, valid_peer, UserState) ->
    +       {valid, UserState}
    + end, []}

    Default option verify_fun in mode verify_none:

     {fun(_, _, {bad_cert, _}, UserState) ->
    +   {valid, UserState};
    +    (_, _, {extension, #'Extension'{critical = true}}, UserState) ->
    +   {valid, UserState};
    +    (_, _, {extension, _}, UserState) ->
    +   {unknown, UserState};
    +    (_, _, valid, UserState) ->
    +   {valid, UserState};
    +    (_, _, valid_peer, UserState) ->
    +       {valid, UserState}
    + end, []}

    The possible path validation errors are given in the form {bad_cert, Reason}, where Reason is:

    • unknown_ca

      No trusted CA was found in the trusted store. The trusted CA is normally a so-called ROOT CA, which is a self-signed certificate. Trust can be claimed for an intermediate CA (the trusted anchor does not have to be @@ -3920,11 +3920,11 @@ enforced. If SecureRenegotiate is false secure renegotiation will still be used if possible, but it falls back to insecure renegotiation if the peer does not support if RFC -5746.

    • {user_lookup_fun, {LookupFun, UserState}} - PSK/SRP cipher suite option

      The lookup fun is to be defined as follows:

      fun(psk, PSKIdentity :: binary(), UserState :: term()) ->
      -  {ok, SharedSecret :: binary()} | error;
      -fun(srp, Username :: binary(), UserState :: term()) ->
      -  {ok, {SRPParams :: srp_param_type(), Salt :: binary(),
      -        DerivedKey :: binary()}} | error.

      For Pre-Shared Key (PSK) cipher suites, the lookup fun is called by the client +5746.

    • {user_lookup_fun, {LookupFun, UserState}} - PSK/SRP cipher suite option

      The lookup fun is to be defined as follows:

      fun(psk, PSKIdentity :: binary(), UserState :: term()) ->
      +  {ok, SharedSecret :: binary()} | error;
      +fun(srp, Username :: binary(), UserState :: term()) ->
      +  {ok, {SRPParams :: srp_param_type(), Salt :: binary(),
      +        DerivedKey :: binary()}} | error.

      For Pre-Shared Key (PSK) cipher suites, the lookup fun is called by the client and server to determine the shared secret. When called by the client, PSKIdentity is the hint presented by the server or undefined. When called by the server, PSKIdentity is the identity presented by the client.

      For Secure Remote Password (SRP), the fun is only used by the server to obtain @@ -4307,8 +4307,8 @@ -

      Opens a TLS/DTLS connection.

      connect(TCPSocket, TLSOptions, Timeout).

      Upgrades a gen_tcp (or equivalent) connected socket to a TLS socket by -performing the client-side TLS handshake.

      connect(Host, Port, TLSOptions).

      Opens a TLS/DTLS connection to Host, Port. This call is equivalent to:

      connect(Host, Port, TLSOptions, infinity).
      +

      Opens a TLS/DTLS connection.

      connect(TCPSocket, TLSOptions, Timeout).

      Upgrades a gen_tcp (or equivalent) connected socket to a TLS socket by +performing the client-side TLS handshake.

      connect(Host, Port, TLSOptions).

      Opens a TLS/DTLS connection to Host, Port. This call is equivalent to:

      connect(Host, Port, TLSOptions, infinity).
      @@ -4444,7 +4444,7 @@ /usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_app.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_app.html 2025-05-10 20:19:20.453293303 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_app.html 2025-05-10 20:19:20.453293303 +0000 @@ -277,7 +277,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_crl_cache.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_crl_cache.html 2025-05-10 20:19:20.477293520 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_crl_cache.html 2025-05-10 20:19:20.477293520 +0000 @@ -369,7 +369,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_crl_cache_api.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_crl_cache_api.html 2025-05-10 20:19:20.505293774 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_crl_cache_api.html 2025-05-10 20:19:20.505293774 +0000 @@ -509,7 +509,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_distribution.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_distribution.html 2025-05-10 20:19:20.533294028 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_distribution.html 2025-05-10 20:19:20.533294028 +0000 @@ -147,14 +147,14 @@ applications. Such a script is located in the bin directory of the Erlang distribution. The source for the script is found under the Erlang installation top directory under releases/<OTP version>/start_clean.rel.

      Do the following:

      • Copy that script to another location (and preferably another name).
      • Add the applications Crypto, Public Key, and SSL with their current version -numbers after the STDLIB application.

      The following shows an example .rel file with TLS added:

            {release, {"OTP  APN 181 01","R15A"}, {erts, "5.9"},
      -      [{kernel,"2.15"},
      -      {stdlib,"1.18"},
      -      {crypto, "2.0.3"},
      -      {public_key, "0.12"},
      -      {asn1, "4.0"},
      -      {ssl, "5.0"}
      -      ]}.

      The version numbers differ in your system. Whenever one of the applications +numbers after the STDLIB application.

    The following shows an example .rel file with TLS added:

          {release, {"OTP  APN 181 01","R15A"}, {erts, "5.9"},
    +      [{kernel,"2.15"},
    +      {stdlib,"1.18"},
    +      {crypto, "2.0.3"},
    +      {public_key, "0.12"},
    +      {asn1, "4.0"},
    +      {ssl, "5.0"}
    +      ]}.

    The version numbers differ in your system. Whenever one of the applications included in the script is upgraded, change the script.

    Do the following:

    • Build the boot script.

      Assuming the .rel file is stored in a file start_ssl.rel in the current directory, a boot script can be built as follows:

       1> systools:make_script("start_ssl",[]).

    There is now a start_ssl.boot file in the current directory.

    Do the following:

    • Test the boot script. To do this, start Erlang with the -boot command-line parameter specifying this boot script (with its full path, but without the @@ -201,10 +201,10 @@ so beware!

      For TLS to work, at least a public key and a certificate must be specified for the server side and the client needs to specify CAs that it trusts (client certification is optional and requires more configuration).

      In the following example (to keep it simple), the PEM file "/home/me/ssl/erlserver.pem" -contains both the server certificate and its private key .

      Create a file named for example "/home/me/ssl/ssl_test@myhost.conf":

      [{server,
      -  [{certfile, "/home/me/ssl/erlserver.pem"}]},
      - {client,
      -  [{cacertfile, "/home/me/ssl/client_trusted.pem"}]}].

      And then start the node like this (line breaks in the command are for +contains both the server certificate and its private key .

      Create a file named for example "/home/me/ssl/ssl_test@myhost.conf":

      [{server,
      +  [{certfile, "/home/me/ssl/erlserver.pem"}]},
      + {client,
      +  [{cacertfile, "/home/me/ssl/client_trusted.pem"}]}].

      And then start the node like this (line breaks in the command are for readability, and shall not be there when typed):

      $ erl -boot /home/me/ssl/start_ssl -proto_dist inet_tls
         -ssl_dist_optfile "/home/me/ssl/ssl_test@myhost.conf"
         -sname ssl_test

      The options in the {server, Opts} tuple are used when calling @@ -274,19 +274,19 @@ -ssl_dist_opt server_secure_renegotiate true client_secure_renegotiate true" $ export ERL_FLAGS $ erl -sname ssl_test -Erlang (BEAM) emulator version 5.0 [source] +Erlang (BEAM) emulator version 5.0 [source] -Eshell V5.0 (abort with ^G) -(ssl_test@myhost)1> init:get_arguments(). -[{root,["/usr/local/erlang"]}, - {progname,["erl "]}, - {sname,["ssl_test"]}, - {boot,["/home/me/ssl/start_ssl"]}, - {proto_dist,["inet_tls"]}, - {ssl_dist_opt,["server_certfile","/home/me/ssl/erlserver.pem"]}, - {ssl_dist_opt,["server_secure_renegotiate","true", - "client_secure_renegotiate","true"] - {home,["/home/me"]}]

  • The init:get_arguments() call verifies that the correct arguments are supplied +Eshell V5.0 (abort with ^G) +(ssl_test@myhost)1> init:get_arguments(). +[{root,["/usr/local/erlang"]}, + {progname,["erl "]}, + {sname,["ssl_test"]}, + {boot,["/home/me/ssl/start_ssl"]}, + {proto_dist,["inet_tls"]}, + {ssl_dist_opt,["server_certfile","/home/me/ssl/erlserver.pem"]}, + {ssl_dist_opt,["server_secure_renegotiate","true", + "client_secure_renegotiate","true"] + {home,["/home/me"]}]

    The init:get_arguments() call verifies that the correct arguments are supplied to the emulator.

    @@ -338,7 +338,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_protocol.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_protocol.html 2025-05-10 20:19:20.557294245 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_protocol.html 2025-05-10 20:19:20.557294245 +0000 @@ -279,7 +279,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_session_cache_api.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_session_cache_api.html 2025-05-10 20:19:20.585294499 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/ssl_session_cache_api.html 2025-05-10 20:19:20.585294499 +0000 @@ -723,7 +723,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/standards_compliance.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/standards_compliance.html 2025-05-10 20:19:20.625294862 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/standards_compliance.html 2025-05-10 20:19:20.625294862 +0000 @@ -260,7 +260,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/using_ssl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/using_ssl.html 2025-05-10 20:19:20.685295406 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.12/doc/html/using_ssl.html 2025-05-10 20:19:20.685295406 +0000 @@ -149,38 +149,38 @@ Basic Client

    -
     1 > ssl:start(), ssl:connect("google.com", 443, [{verify, verify_peer},
    -                                                 {cacerts, public_key:cacerts_get()}]).
    -   {ok,{sslsocket, [...]}}

    +
     1 > ssl:start(), ssl:connect("google.com", 443, [{verify, verify_peer},
    +                                                 {cacerts, public_key:cacerts_get()}]).
    +   {ok,{sslsocket, [...]}}

    Basic Connection

    -

    Step 1: Start the server side:

    1 server> ssl:start().
    +

    Step 1: Start the server side:

    1 server> ssl:start().
     ok

    Step 2: with alternative certificates, in this example the EDDSA certificate will be preferred if TLS-1.3 is negotiated and the RSA certificate will always -be used for TLS-1.2 as it does not support the EDDSA algorithm:

    2 server> {ok, ListenSocket} =
    -ssl:listen(9999, [{certs_keys, [#{certfile => "eddsacert.pem",
    -                                  keyfile => "eddsakey.pem"},
    -                                #{certfile => "rsacert.pem",
    +be used for TLS-1.2 as it does not support the EDDSA algorithm:

    2 server> {ok, ListenSocket} =
    +ssl:listen(9999, [{certs_keys, [#{certfile => "eddsacert.pem",
    +                                  keyfile => "eddsakey.pem"},
    +                                #{certfile => "rsacert.pem",
                                       keyfile => "rsakey.pem",
    -                                  password => "foobar"}
    -                               ]},{reuseaddr, true}]).
    -{ok,{sslsocket, [...]}}

    Step 3: Do a transport accept on the TLS listen socket:

    3 server> {ok, TLSTransportSocket} = ssl:transport_accept(ListenSocket).
    -{ok,{sslsocket, [...]}}

    Note

    ssl:transport_accept/1 and ssl:handshake/2 are separate functions so that the + password => "foobar"} + ]},{reuseaddr, true}]). +{ok,{sslsocket, [...]}}

    Step 3: Do a transport accept on the TLS listen socket:

    3 server> {ok, TLSTransportSocket} = ssl:transport_accept(ListenSocket).
    +{ok,{sslsocket, [...]}}

    Note

    ssl:transport_accept/1 and ssl:handshake/2 are separate functions so that the handshake part can be called in a new erlang process dedicated to handling the -connection

    Step 4: Start the client side:

    1 client> ssl:start().
    +connection

    Step 4: Start the client side:

    1 client> ssl:start().
     ok

    Be sure to configure trusted certificates to use for server certificate -verification.

    2 client> {ok, Socket} = ssl:connect("localhost", 9999,
    -      [{verify, verify_peer},
    -      {cacertfile, "cacerts.pem"}, {active, once}], infinity).
    -{ok,{sslsocket, [...]}}

    Step 5: Do the TLS handshake:

    4 server> {ok, Socket} = ssl:handshake(TLSTransportSocket).
    -{ok,{sslsocket, [...]}}

    Note

    A real server should use ssl:handshake/2 that has a timeout to avoid DoS -attacks. In the example the timeout defaults to infinty.

    Step 6: Send a message over TLS:

    5 server> ssl:send(Socket, "foo").
    +verification.

    2 client> {ok, Socket} = ssl:connect("localhost", 9999,
    +      [{verify, verify_peer},
    +      {cacertfile, "cacerts.pem"}, {active, once}], infinity).
    +{ok,{sslsocket, [...]}}

    Step 5: Do the TLS handshake:

    4 server> {ok, Socket} = ssl:handshake(TLSTransportSocket).
    +{ok,{sslsocket, [...]}}

    Note

    A real server should use ssl:handshake/2 that has a timeout to avoid DoS +attacks. In the example the timeout defaults to infinty.

    Step 6: Send a message over TLS:

    5 server> ssl:send(Socket, "foo").
     ok

    Step 7: Flush the shell message queue to see that the message sent on the -server side is recived by the client side:

    3 client> flush().
    -Shell got {ssl,{sslsocket,[...]},"foo"}
    +server side is recived by the client side:

    3 client> flush().
    +Shell got {ssl,{sslsocket,[...]},"foo"}
     ok

    @@ -192,27 +192,27 @@ communication channel by using TLS. Note that the client and server need to agree to do the upgrade in the protocol doing the communication. This is concept is often referenced as STARTLS and used in many protocols such as SMTP, -FTPS and HTTPS via a proxy.

    Warning

    Maximum security recommendations are however moving away from such solutions.

    To upgrade to a TLS connection:

    Step 1: Start the server side:

    1 server> ssl:start().
    +FTPS and HTTPS via a proxy.

    Warning

    Maximum security recommendations are however moving away from such solutions.

    To upgrade to a TLS connection:

    Step 1: Start the server side:

    1 server> ssl:start().
       ok

    Step 2: Create a normal TCP listen socket and ensure active is set to false and not set to any active mode otherwise TLS handshake messages can be -delivered to the wrong process.

    2 server> {ok, ListenSocket} = gen_tcp:listen(9999, [{reuseaddr, true},
    -  {active, false}]).
    -  {ok, #Port<0.475>}

    Step 3: Accept client connection:

    3 server> {ok, Socket} = gen_tcp:accept(ListenSocket).
    -  {ok, #Port<0.476>}

    Step 4: Start the client side:

    1 client> ssl:start().
    -  ok
    2 client> {ok, Socket} = gen_tcp:connect("localhost", 9999,  [], infinity).

    Step 5: Do the TLS handshake:

    4 server> {ok, TLSSocket} = ssl:handshake(Socket, [{verify, verify_peer},
    -  {fail_if_no_peer_cert, true},
    -  {cacertfile, "cacerts.pem"},
    -  {certs_keys, [#{certfile => "cert.pem", keyfile => "key.pem"}]}]).
    -  {ok,{sslsocket,[...]}}

    Step 6: Upgrade to a TLS connection. The client and server must agree upon the +delivered to the wrong process.

    2 server> {ok, ListenSocket} = gen_tcp:listen(9999, [{reuseaddr, true},
    +  {active, false}]).
    +  {ok, #Port<0.475>}

    Step 3: Accept client connection:

    3 server> {ok, Socket} = gen_tcp:accept(ListenSocket).
    +  {ok, #Port<0.476>}

    Step 4: Start the client side:

    1 client> ssl:start().
    +  ok
    2 client> {ok, Socket} = gen_tcp:connect("localhost", 9999,  [], infinity).

    Step 5: Do the TLS handshake:

    4 server> {ok, TLSSocket} = ssl:handshake(Socket, [{verify, verify_peer},
    +  {fail_if_no_peer_cert, true},
    +  {cacertfile, "cacerts.pem"},
    +  {certs_keys, [#{certfile => "cert.pem", keyfile => "key.pem"}]}]).
    +  {ok,{sslsocket,[...]}}

    Step 6: Upgrade to a TLS connection. The client and server must agree upon the upgrade. The server must be prepared to be a TLS server before the client can do -a successful connect.

    3 client>{ok, TLSSocket} = ssl:connect(Socket, [{verify, verify_peer},
    -  {cacertfile, "cacerts.pem"},
    -  {certs_keys, [#{certfile => "cert.pem", keyfile => "key.pem"}]}], infinity).
    -{ok,{sslsocket,[...]}}

    Step 7: Send a message over TLS:

    4 client> ssl:send(TLSSocket, "foo").
    -      ok

    Step 8: Set active once on the TLS socket:

    5 server> ssl:setopts(TLSSocket, [{active, once}]).
    +a successful connect.

    3 client>{ok, TLSSocket} = ssl:connect(Socket, [{verify, verify_peer},
    +  {cacertfile, "cacerts.pem"},
    +  {certs_keys, [#{certfile => "cert.pem", keyfile => "key.pem"}]}], infinity).
    +{ok,{sslsocket,[...]}}

    Step 7: Send a message over TLS:

    4 client> ssl:send(TLSSocket, "foo").
    +      ok

    Step 8: Set active once on the TLS socket:

    5 server> ssl:setopts(TLSSocket, [{active, once}]).
           ok

    Step 9: Flush the shell message queue to see that the message sent on the -client side is recived by the server side:

    5 server> flush().
    -      Shell got {ssl,{sslsocket,[...]},"foo"}
    +client side is recived by the server side:

    5 server> flush().
    +      Shell got {ssl,{sslsocket,[...]},"foo"}
           ok

    @@ -220,34 +220,34 @@ Customizing cipher suites

    Fetch default cipher suite list for a TLS/DTLS version. Change default to all to -get all possible cipher suites.

    1>  Default = ssl:cipher_suites(default, 'tlsv1.2').
    -    [#{cipher => aes_256_gcm,key_exchange => ecdhe_ecdsa,
    -    mac => aead,prf => sha384}, ....]

    In OTP 20 it is desirable to remove all cipher suites that uses rsa key exchange +get all possible cipher suites.

    1>  Default = ssl:cipher_suites(default, 'tlsv1.2').
    +    [#{cipher => aes_256_gcm,key_exchange => ecdhe_ecdsa,
    +    mac => aead,prf => sha384}, ....]

    In OTP 20 it is desirable to remove all cipher suites that uses rsa key exchange (removed from default in 21)

    2> NoRSA =
    -    ssl:filter_cipher_suites(Default,
    -                             [{key_exchange, fun(rsa) -> false;
    -                                                (_) -> true
    -                                             end}]).
    -    [...]

    Pick just a few suites

     3> Suites =
    - ssl:filter_cipher_suites(Default,
    -                             [{key_exchange, fun(ecdh_ecdsa) -> true;
    -                                                (_) -> false
    -                                             end},
    -                              {cipher, fun(aes_128_cbc) -> true;
    -                                          (_) ->false
    -                                       end}]).
    -
    -[#{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,
    -   mac => sha256,prf => sha256},
    - #{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,mac => sha,
    -   prf => default_prf}]

    Make some particular suites the most preferred, or least preferred by changing -prepend to append.

     4>ssl:prepend_cipher_suites(Suites, Default).
    -  [#{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,
    -     mac => sha256,prf => sha256},
    -   #{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,mac => sha,
    -     prf => default_prf},
    -   #{cipher => aes_256_cbc,key_exchange => ecdhe_ecdsa,
    -     mac => sha384,prf => sha384}, ...]

    + ssl:filter_cipher_suites(Default, + [{key_exchange, fun(rsa) -> false; + (_) -> true + end}]). + [...]

    Pick just a few suites

     3> Suites =
    + ssl:filter_cipher_suites(Default,
    +                             [{key_exchange, fun(ecdh_ecdsa) -> true;
    +                                                (_) -> false
    +                                             end},
    +                              {cipher, fun(aes_128_cbc) -> true;
    +                                          (_) ->false
    +                                       end}]).
    +
    +[#{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,
    +   mac => sha256,prf => sha256},
    + #{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,mac => sha,
    +   prf => default_prf}]

    Make some particular suites the most preferred, or least preferred by changing +prepend to append.

     4>ssl:prepend_cipher_suites(Suites, Default).
    +  [#{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,
    +     mac => sha256,prf => sha256},
    +   #{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,mac => sha,
    +     prf => default_prf},
    +   #{cipher => aes_256_cbc,key_exchange => ecdhe_ecdsa,
    +     mac => sha384,prf => sha384}, ...]

    @@ -265,9 +265,9 @@ suite that is chosen, which is not the case in TLS-1.3.

    Using the function ssl:signature_algs/2 will let you inspect different aspects of possible configurations for your system. For example if TLS-1.3 and TLS-1.2 is supported the default signature_algorithm list in OTP-26 and cryptolib from -OpenSSL 3.0.2 would look like:

     1>  ssl:signature_algs(default, 'tlsv1.3').
    +OpenSSL 3.0.2 would look like:

     1>  ssl:signature_algs(default, 'tlsv1.3').
      %% TLS-1.3 schemes
    - [eddsa_ed25519,eddsa_ed448,ecdsa_secp521r1_sha512,
    + [eddsa_ed25519,eddsa_ed448,ecdsa_secp521r1_sha512,
       ecdsa_secp384r1_sha384,ecdsa_secp256r1_sha256,
       rsa_pss_pss_sha512,rsa_pss_pss_sha384,rsa_pss_pss_sha256,
       rsa_pss_rsae_sha512,rsa_pss_rsae_sha384,rsa_pss_rsae_sha256,
    @@ -275,12 +275,12 @@
       %% (would have a tuple name in TLS-1.2 only configuration)
       rsa_pkcs1_sha512,rsa_pkcs1_sha384,rsa_pkcs1_sha256
       %% TLS 1.2 algorithms
    -  {sha512,ecdsa},
    -  {sha384,ecdsa},
    -  {sha256,ecdsa}]

    If you want to add support for non default supported algorithms you should + {sha512,ecdsa}, + {sha384,ecdsa}, + {sha256,ecdsa}]

    If you want to add support for non default supported algorithms you should append them to the default list as the configuration is in prefered order, -something like this:

        MySignatureAlgs = ssl:signature_algs(default, 'tlsv1.3') ++ [{sha, rsa}, {sha, dsa}],
    -    ssl:connect(Host,Port,[{signature_algs, MySignatureAlgs,...]}),
    +something like this:

        MySignatureAlgs = ssl:signature_algs(default, 'tlsv1.3') ++ [{sha, rsa}, {sha, dsa}],
    +    ssl:connect(Host,Port,[{signature_algs, MySignatureAlgs,...]}),
         ...

    See also ssl:signature_algs/2 and sign_algo()

    @@ -288,20 +288,20 @@ /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/404.html 2025-05-10 20:19:20.709295624 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/404.html 2025-05-10 20:19:20.709295624 +0000 @@ -147,7 +147,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/api-reference.html 2025-05-10 20:19:20.773296204 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/api-reference.html 2025-05-10 20:19:20.773296204 +0000 @@ -827,7 +827,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/argparse.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/argparse.html 2025-05-10 20:19:20.825296675 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/argparse.html 2025-05-10 20:19:20.825296675 +0000 @@ -146,20 +146,20 @@

    argparse is designed to work with escript. The example below is a fully functioning Erlang program accepting two command line arguments and printing their product.

    #href_anchor"w">
    -main(Args) ->
    -    argparse:run(Args, cli(), #{progname => mul}).
    +main(Args) ->
    +    argparse:run(Args, cli(), #{progname => mul}).
     
    -cli() ->
    -    #{
    -        arguments => [
    -            #{name => left, type => integer},
    -            #{name => right, type => integer}
    -        ],
    +cli() ->
    +    #{
    +        arguments => [
    +            #{name => left, type => integer},
    +            #{name => right, type => integer}
    +        ],
             handler =>
    -            fun (#{left := Left, right := Right}) ->
    -                io:format("~b~n", [Left * Right])
    +            fun (#{left := Left, right := Right}) ->
    +                io:format("~b~n", [Left * Right])
                 end
    -    }.

    Running this script with no arguments results in an error, accompanied by the + }.

    Running this script with no arguments results in an error, accompanied by the usage information.

    The cli function defines a single command with embedded handler accepting a map. Keys of the map are argument names as defined by the argument field of the command, left and right in the example. Values are taken from the @@ -173,25 +173,25 @@

    A command may contain nested commands, forming a hierarchy. Arguments defined at the upper level command are automatically added to all nested commands. Nested -commands example (assuming progname is nested):

    cli() ->
    -  #{
    +commands example (assuming progname is nested):

    cli() ->
    +  #{
         %% top level argument applicable to all commands
    -    arguments => [#{name => top}],
    -      commands => #{
    -        "first" => #{
    +    arguments => [#{name => top}],
    +      commands => #{
    +        "first" => #{
               %% argument applicable to "first" command and
               %%  all commands nested into "first"
    -          arguments => [#{name => mid}],
    -          commands => #{
    -            "second" => #{
    +          arguments => [#{name => mid}],
    +          commands => #{
    +            "second" => #{
                   %% argument only applicable for "second" command
    -              arguments => [#{name => bottom}],
    -              handler => fun (A) -> io:format("~p~n", [A]) end
    -          }
    -        }
    -      }
    -    }
    -  }.

    In the example above, a 3-level hierarchy is defined. First is the script itself + arguments => [#{name => bottom}], + handler => fun (A) -> io:format("~p~n", [A]) end + } + } + } + } + }.

    In the example above, a 3-level hierarchy is defined. First is the script itself (nested), accepting the only argument top. Since it has no associated handler, run/3 will not accept user input omitting nested command selection. For this example, user has to supply 5 arguments in the command line, two being @@ -209,14 +209,14 @@ on all operating systems). Both options and positional arguments have 1 or more associated values. See argument specification to find more details about supported combinations.

    In the user input, short options may be concatenated with their values. Long -options support values separated by =. Consider this definition:

    cli() ->
    -  #{
    -    arguments => [
    -      #{name => long, long => "-long"},
    -      #{name => short, short => $s}
    -    ],
    -    handler => fun (Args) -> io:format("~p~n", [Args]) end
    -  }.

    Running ./args --long=VALUE prints #{long => "VALUE"}, running +options support values separated by =. Consider this definition:

    cli() ->
    +  #{
    +    arguments => [
    +      #{name => long, long => "-long"},
    +      #{name => short, short => $s}
    +    ],
    +    handler => fun (Args) -> io:format("~p~n", [Args]) end
    +  }.

    Running ./args --long=VALUE prints #{long => "VALUE"}, running ./args -sVALUE prints #{short => "VALUE"}

    argparse supports boolean flags concatenation: it is possible to shorten -r -f -v to -rfv.

    Shortened option names are not supported: it is not possible to use --my-argum instead of --my-argument-name even when such option can be unambiguously @@ -607,111 +607,111 @@ which case resulting argument map will either contain the default value, or not have the key at all.

    • name - Sets the argument name in the parsed argument map. If help is not defined, name is also used to generate the default usage message.

    • short - Defines a short (single character) form of an optional argument.

      %% Define a command accepting argument named myarg, with short form $a:
      -1> Cmd = #{arguments => [#{name => myarg, short => $a}]}.
      +1> Cmd = #{arguments => [#{name => myarg, short => $a}]}.
       %% Parse command line "-a str":
      -2> {ok, ArgMap, _, _} = argparse:parse(["-a", "str"], Cmd), ArgMap.
      +2> {ok, ArgMap, _, _} = argparse:parse(["-a", "str"], Cmd), ArgMap.
       
      -#{myarg => "str"}
      +#{myarg => "str"}
       
       %% Option value can be concatenated with the switch: "-astr"
      -3> {ok, ArgMap, _, _} = argparse:parse(["-astr"], Cmd), ArgMap.
      +3> {ok, ArgMap, _, _} = argparse:parse(["-astr"], Cmd), ArgMap.
       
      -#{myarg => "str"}

      By default all options expect a single value following the option switch. The -only exception is an option of a boolean type.

    • long - Defines a long form of an optional argument.

      1> Cmd = #{arguments => [#{name => myarg, long => "name"}]}.
      +#{myarg => "str"}

      By default all options expect a single value following the option switch. The +only exception is an option of a boolean type.

    • long - Defines a long form of an optional argument.

      1> Cmd = #{arguments => [#{name => myarg, long => "name"}]}.
       %% Parse command line "-name Erlang":
      -2> {ok, ArgMap, _, _} = argparse:parse(["-name", "Erlang"], Cmd), ArgMap.
      +2> {ok, ArgMap, _, _} = argparse:parse(["-name", "Erlang"], Cmd), ArgMap.
       
      -#{myarg => "Erlang"}
      +#{myarg => "Erlang"}
       %% Or use "=" to separate the switch and the value:
      -3> {ok, ArgMap, _, _} = argparse:parse(["-name=Erlang"], Cmd), ArgMap.
      +3> {ok, ArgMap, _, _} = argparse:parse(["-name=Erlang"], Cmd), ArgMap.
       
      -#{myarg => "Erlang"}

      If neither short not long is defined, the argument is treated as +#{myarg => "Erlang"}

    If neither short not long is defined, the argument is treated as positional.

  • required - Forces the parser to expect the argument to be present in the command line. By default, all positional argument are required, and all options are not.

  • default - Specifies the default value to put in the parsed argument map -if the value is not supplied in the command line.

    1> argparse:parse([], #{arguments => [#{name => myarg, short => $m}]}).
    +if the value is not supplied in the command line.

    1> argparse:parse([], #{arguments => [#{name => myarg, short => $m}]}).
     
    -{ok,#{}, ...
    -2> argparse:parse([], #{arguments => [#{name => myarg, short => $m, default => "def"}]}).
    +{ok,#{}, ...
    +2> argparse:parse([], #{arguments => [#{name => myarg, short => $m, default => "def"}]}).
     
    -{ok,#{myarg => "def"}, ...
  • type - Defines type conversion and validation routine. The default is +{ok,#{myarg => "def"}, ...

  • type - Defines type conversion and validation routine. The default is string, assuming no conversion.

  • nargs - Defines the number of following arguments to consume from the command line. By default, the parser consumes the next argument and converts it into an Erlang term according to the specified type.

    • pos_integer/0 - Consume exactly this number of positional arguments, fail if there is not enough. Value in the argument map contains a list of exactly this length. Example, defining a positional argument expecting 3 -integer values:

      1> Cmd = #{arguments => [#{name => ints, type => integer, nargs => 3}]},
      -argparse:parse(["1", "2", "3"], Cmd).
      +integer values:

      1> Cmd = #{arguments => [#{name => ints, type => integer, nargs => 3}]},
      +argparse:parse(["1", "2", "3"], Cmd).
       
      -{ok, #{ints => [1, 2, 3]}, ...

      Another example defining an option accepted as -env and expecting two -string arguments:

      1> Cmd = #{arguments => [#{name => env, long => "env", nargs => 2}]},
      -argparse:parse(["-env", "key", "value"], Cmd).
      +{ok, #{ints => [1, 2, 3]}, ...

      Another example defining an option accepted as -env and expecting two +string arguments:

      1> Cmd = #{arguments => [#{name => env, long => "env", nargs => 2}]},
      +argparse:parse(["-env", "key", "value"], Cmd).
       
      -{ok, #{env => ["key", "value"]}, ...
    • list - Consume all following arguments until hitting the next option +{ok, #{env => ["key", "value"]}, ...

  • list - Consume all following arguments until hitting the next option (starting with an option prefix). May result in an empty list added to the -arguments map.

    1> Cmd = #{arguments => [
    -  #{name => nodes, long => "nodes", nargs => list},
    -  #{name => verbose, short => $v, type => boolean}
    -]},
    -argparse:parse(["-nodes", "one", "two", "-v"], Cmd).
    +arguments map.

    1> Cmd = #{arguments => [
    +  #{name => nodes, long => "nodes", nargs => list},
    +  #{name => verbose, short => $v, type => boolean}
    +]},
    +argparse:parse(["-nodes", "one", "two", "-v"], Cmd).
     
    -{ok, #{nodes => ["one", "two"], verbose => true}, ...
  • nonempty_list - Same as list, but expects at least one argument. +{ok, #{nodes => ["one", "two"], verbose => true}, ...

  • nonempty_list - Same as list, but expects at least one argument. Returns an error if the following command line argument is an option switch (starting with the prefix).

  • 'maybe' - Consumes the next argument from the command line, if it does not start with an option prefix. Otherwise, adds a default value to the -arguments map.

    1> Cmd = #{arguments => [
    -  #{name => level, short => $l, nargs => 'maybe', default => "error"},
    -  #{name => verbose, short => $v, type => boolean}
    -]},
    -argparse:parse(["-l", "info", "-v"], Cmd).
    +arguments map.

    1> Cmd = #{arguments => [
    +  #{name => level, short => $l, nargs => 'maybe', default => "error"},
    +  #{name => verbose, short => $v, type => boolean}
    +]},
    +argparse:parse(["-l", "info", "-v"], Cmd).
     
    -{ok,#{level => "info",verbose => true}, ...
    +{ok,#{level => "info",verbose => true}, ...
     
     %% When "info" is omitted, argument maps receives the default "error"
    -2> argparse:parse(["-l", "-v"], Cmd).
    +2> argparse:parse(["-l", "-v"], Cmd).
     
    -{ok,#{level => "error",verbose => true}, ...
  • {'maybe', term()} - Consumes the next argument from the command line, +{ok,#{level => "error",verbose => true}, ...

  • {'maybe', term()} - Consumes the next argument from the command line, /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/array.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/array.html 2025-05-10 20:19:20.873297110 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/array.html 2025-05-10 20:19:20.873297110 +0000 @@ -136,14 +136,14 @@ reset/2). If you need to differentiate between unset and set entries, ensure that the default value cannot be confused with the values of set entries.

    The array never shrinks automatically. If an index I has been used to set an entry successfully, all indices in the range [0,I] stay accessible unless the -array size is explicitly changed by calling resize/2.

    Examples:

    Create a fixed-size array with entries 0-9 set to undefined:

    A0 = array:new(10).
    -10 = array:size(A0).

    Create an extendible array and set entry 17 to true, causing the array to grow -automatically:

    A1 = array:set(17, true, array:new()).
    -18 = array:size(A1).

    Read back a stored value:

    true = array:get(17, A1).

    Accessing an unset entry returns default value:

    undefined = array:get(3, A1)

    Accessing an entry beyond the last set entry also returns the default value, if -the array does not have fixed size:

    undefined = array:get(18, A1).

    "Sparse" functions ignore default-valued entries:

    A2 = array:set(4, false, A1).
    -[{4, false}, {17, true}] = array:sparse_to_orddict(A2).

    An extendible array can be made fixed-size later:

    A3 = array:fix(A2).

    A fixed-size array does not grow automatically and does not allow accesses -beyond the last set entry:

    {'EXIT',{badarg,_}} = (catch array:set(18, true, A3)).
    -{'EXIT',{badarg,_}} = (catch array:get(18, A3)).
    +array size is explicitly changed by calling resize/2.

    Examples:

    Create a fixed-size array with entries 0-9 set to undefined:

    A0 = array:new(10).
    +10 = array:size(A0).

    Create an extendible array and set entry 17 to true, causing the array to grow +automatically:

    A1 = array:set(17, true, array:new()).
    +18 = array:size(A1).

    Read back a stored value:

    true = array:get(17, A1).

    Accessing an unset entry returns default value:

    undefined = array:get(3, A1)

    Accessing an entry beyond the last set entry also returns the default value, if +the array does not have fixed size:

    undefined = array:get(18, A1).

    "Sparse" functions ignore default-valued entries:

    A2 = array:set(4, false, A1).
    +[{4, false}, {17, true}] = array:sparse_to_orddict(A2).

    An extendible array can be made fixed-size later:

    A3 = array:fix(A2).

    A fixed-size array does not grow automatically and does not allow accesses +beyond the last set entry:

    {'EXIT',{badarg,_}} = (catch array:set(18, true, A3)).
    +{'EXIT',{badarg,_}} = (catch array:get(18, A3)).
    @@ -1184,7 +1184,7 @@ array size; this also implies {fixed, true}. If N is not a non-negative integer, the call fails with reason badarg.

  • fixed or {fixed, true} - Creates a fixed-size array. See also fix/1.

  • {fixed, false} - Creates an extendible (non-fixed-size) array.

  • {default, Value} - Sets the default value for the array to Value.

  • Options are processed in the order they occur in the list, that is, later options have higher precedence.

    The default value is used as the value of uninitialized entries, and cannot be -changed once the array has been created.

    Examples:

    array:new(100)

    creates a fixed-size array of size 100.

    array:new({default,0})

    creates an empty, extendible array whose default value is 0.

    array:new([{size,10},{fixed,false},{default,-1}])

    creates an extendible array with initial size 10 whose default value is -1.

    See also fix/1, from_list/2, get/2, new/0, new/2, set/3.

    +changed once the array has been created.

    Examples:

    array:new(100)

    creates a fixed-size array of size 100.

    array:new({default,0})

    creates an empty, extendible array whose default value is 0.

    array:new([{size,10},{fixed,false},{default,-1}])

    creates an extendible array with initial size 10 whose default value is -1.

    See also fix/1, from_list/2, get/2, new/0, new/2, set/3.

    @@ -1217,7 +1217,7 @@ Options override parameter Size.

    If Options is a list, this is equivalent to new([{size, Size} | Options]), otherwise it is equivalent to new([{size, Size} | [Options]]). However, using this function -directly is more efficient.

    Example:

    array:new(100, {default,0})

    creates a fixed-size array of size 100, whose default value is 0.

    See also new/1.

    +directly is more efficient.

    Example:

    array:new(100, {default,0})

    creates a fixed-size array of size 100, whose default value is 0.

    See also new/1.

    @@ -1659,7 +1659,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/assert_hrl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/assert_hrl.html 2025-05-10 20:19:20.897297328 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/assert_hrl.html 2025-05-10 20:19:20.897297328 +0000 @@ -132,7 +132,7 @@ Description

    The include file assert.hrl provides macros for inserting assertions in your -program code.

    Include the following directive in the module from which the function is called:

    -include_lib("stdlib/include/assert.hrl").

    When an assertion succeeds, the assert macro yields the atom ok. When an +program code.

    Include the following directive in the module from which the function is called:

    -include_lib("stdlib/include/assert.hrl").

    When an assertion succeeds, the assert macro yields the atom ok. When an assertion fails, an exception of type error is generated. The associated error term has the form {Macro, Info}. Macro is the macro name, for example, assertEqual. Info is a list of tagged values, such as @@ -160,7 +160,7 @@

    • assert(BoolExpr)

    • assert(BoolExpr, Comment) - Tests that BoolExpr completes normally returning true.

    • assertNot(BoolExpr)

    • assertNot(BoolExpr, Comment) - Tests that BoolExpr completes normally returning false.

    • assertMatch(GuardedPattern, Expr)

    • assertMatch(GuardedPattern, Expr, Comment) - Tests that Expr completes -normally yielding a value that matches GuardedPattern, for example:

      ?assertMatch({bork, _}, f())

      Notice that a guard when ... can be included:

      ?assertMatch({bork, X} when X > 0, f())
    • assertNotMatch(GuardedPattern, Expr)

    • assertNotMatch(GuardedPattern, Expr, Comment) - Tests that Expr +normally yielding a value that matches GuardedPattern, for example:

      ?assertMatch({bork, _}, f())

      Notice that a guard when ... can be included:

      ?assertMatch({bork, X} when X > 0, f())
    • assertNotMatch(GuardedPattern, Expr)

    • assertNotMatch(GuardedPattern, Expr, Comment) - Tests that Expr completes normally yielding a value that does not match GuardedPattern.

      As in assertMatch, GuardedPattern can have a when part.

    • assertEqual(ExpectedValue, Expr)

    • assertEqual(ExpectedValue, Expr, Comment) - Tests that Expr completes normally yielding a value that is exactly equal to ExpectedValue.

    • assertNotEqual(ExpectedValue, Expr)

    • assertNotEqual(ExpectedValue, Expr, Comment) - Tests that Expr completes normally yielding a value that is not exactly equal to @@ -222,7 +222,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/base64.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/base64.html 2025-05-10 20:19:20.929297617 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/base64.html 2025-05-10 20:19:20.929297617 +0000 @@ -671,15 +671,15 @@

      Decodes a base64 string encoded using the standard alphabet according to RFC 4648 Section 4 to plain ASCII.

      The function will strips away any whitespace characters and check for the -the correct number of = padding characters at the end of the encoded string.

      See decode_options/0 for details on which options can be passed.

      Example:

      1> base64:decode("AQIDBA==").
      +the correct number of = padding characters at the end of the encoded string.

      See decode_options/0 for details on which options can be passed.

      Example:

      1> base64:decode("AQIDBA==").
       <<1,2,3,4>>
      -2> base64:decode("AQ ID BA==").
      +2> base64:decode("AQ ID BA==").
       <<1,2,3,4>>
      -3> base64:decode("AQIDBA=").
      +3> base64:decode("AQIDBA=").
       ** exception error: missing_padding
            in function  base64:decode_list/7 (base64.erl, line 734)
               *** data to decode is missing final = padding characters, if this is intended, use the `padding => false` option
      -4> base64:decode("AQIDBA=", #{ padding => false }).
      +4> base64:decode("AQIDBA=", #{ padding => false }).
       <<1,2,3,4>>
      @@ -934,9 +934,9 @@

      Decodes a base64 "mime" string encoded using the standard alphabet according to RFC 4648 Section 4 to plain ASCII.

      The function will strips away any illegal characters. It does not check for the -the correct number of = padding characters at the end of the encoded string.

      See decode_options/0 for details on which options can be passed.

      Example:

      1> base64:mime_decode("AQIDBA==").
      +the correct number of = padding characters at the end of the encoded string.

      See decode_options/0 for details on which options can be passed.

      Example:

      1> base64:mime_decode("AQIDBA==").
       <<1,2,3,4>>
      -2> base64:mime_decode("AQIDB=A=").
      +2> base64:mime_decode("AQIDB=A=").
       <<1,2,3,4>>
      @@ -1033,7 +1033,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/beam_lib.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/beam_lib.html 2025-05-10 20:19:20.981298089 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/beam_lib.html 2025-05-10 20:19:20.981298089 +0000 @@ -151,8 +151,8 @@ Reconstruct Source Code

      The following example shows how to reconstruct Erlang source code from the debug -information in a BEAM file Beam:

      {ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(Beam,[abstract_code]).
      -io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).

      +information in a BEAM file Beam:

      {ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(Beam,[abstract_code]).
      +io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).

      @@ -182,13 +182,13 @@ user's home directory and then filename:basedir(user_config, "erlang"). If the file is found and contains a key, beam_lib implicitly creates a crypto key fun -and registers it.

      File .erlang.crypt is to contain a single list of tuples:

      {debug_info, Mode, Module, Key}

      Mode is the type of crypto algorithm; currently, the only allowed value is +and registers it.

      File .erlang.crypt is to contain a single list of tuples:

      {debug_info, Mode, Module, Key}

      Mode is the type of crypto algorithm; currently, the only allowed value is des3_cbc. Module is either an atom, in which case Key is only used for the module Module, or [], in which case Key is used for all modules. Key is the non-empty key string.

      Key in the first tuple where both Mode and Module match is used.

      The following is an example of an .erlang.crypt file that returns the same key -for all modules:

      [{debug_info, des3_cbc, [], "%>7}|pc/DM6Cga*68$Mw]L#&_Gejr]G^"}].

      The following is a slightly more complicated example of an .erlang.crypt -providing one key for module t and another key for all other modules:

      [{debug_info, des3_cbc, t, "My KEY"},
      - {debug_info, des3_cbc, [], "%>7}|pc/DM6Cga*68$Mw]L#&_Gejr]G^"}].

      Note

      Do not use any of the keys in these examples. Use your own keys.

      +for all modules:

      [{debug_info, des3_cbc, [], "%>7}|pc/DM6Cga*68$Mw]L#&_Gejr]G^"}].

      The following is a slightly more complicated example of an .erlang.crypt +providing one key for module t and another key for all other modules:

      [{debug_info, des3_cbc, t, "My KEY"},
      + {debug_info, des3_cbc, [], "%>7}|pc/DM6Cga*68$Mw]L#&_Gejr]G^"}].

      Note

      Do not use any of the keys in these examples. Use your own keys.

      @@ -1556,11 +1556,11 @@

      Registers an unary fun that is called if beam_lib must read an debug_info chunk that has been encrypted. The fun is held in a process that is started by the function.

      If a fun is already registered when attempting to register a fun, -{error, exists} is returned.

      The fun must handle the following arguments:

      CryptoKeyFun(init) -> ok | {ok, NewCryptoKeyFun} | {error, Term}

      Called when the fun is registered, in the process that holds the fun. Here the +{error, exists} is returned.

      The fun must handle the following arguments:

      CryptoKeyFun(init) -> ok | {ok, NewCryptoKeyFun} | {error, Term}

      Called when the fun is registered, in the process that holds the fun. Here the crypto key fun can do any necessary initializations. If {ok, NewCryptoKeyFun} is returned, NewCryptoKeyFun is registered instead of CryptoKeyFun. If {error, Term} is returned, the registration is aborted and -crypto_key_fun/1 also returns {error, Term}.

      CryptoKeyFun({debug_info, Mode, Module, Filename}) -> Key

      Called when the key is needed for module Module in the file named Filename. +crypto_key_fun/1 also returns {error, Term}.

      CryptoKeyFun({debug_info, Mode, Module, Filename}) -> Key

      Called when the key is needed for module Module in the file named Filename. Mode is the type of crypto algorithm; currently, the only possible value is des3_cbc. The call is to fail (raise an exception) if no key is available.

      CryptoKeyFun(clear) -> term()

      Called before the fun is unregistered. Here any cleaning up can be done. The return value is not important, but is passed back to the caller of @@ -1927,14 +1927,14 @@ -vsn(Vsn).

      If this attribute is not specified, the version defaults to the checksum of the module. Notice that if version Vsn is not a list, it is made into one, that is {ok,{Module,[Vsn]}} is returned. If there are many -vsn -module attributes, the result is the concatenated list of versions.

      Examples:

      1> beam_lib:version(a). % -vsn(1).
      -{ok,{a,[1]}}
      -2> beam_lib:version(b). % -vsn([1]).
      -{ok,{b,[1]}}
      -3> beam_lib:version(c). % -vsn([1]). -vsn(2).
      -{ok,{c,[1,2]}}
      -4> beam_lib:version(d). % no -vsn attribute
      -{ok,{d,[275613208176997377698094100858909383631]}}
      +module attributes, the result is the concatenated list of versions.

      Examples:

      1> beam_lib:version(a). % -vsn(1).
      +{ok,{a,[1]}}
      +2> beam_lib:version(b). % -vsn([1]).
      +{ok,{b,[1]}}
      +3> beam_lib:version(c). % -vsn([1]). -vsn(2).
      +{ok,{c,[1,2]}}
      +4> beam_lib:version(d). % no -vsn attribute
      +{ok,{d,[275613208176997377698094100858909383631]}}
      @@ -1963,7 +1963,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/binary.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/binary.html 2025-05-10 20:19:21.037298597 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/binary.html 2025-05-10 20:19:21.037298597 +0000 @@ -643,7 +643,7 @@ -

      Converts Subject to a list of byte/0s, each representing the value of one byte.

      Example:

      1> binary:bin_to_list(<<"erlang">>).
      +

      Converts Subject to a list of byte/0s, each representing the value of one byte.

      Example:

      1> binary:bin_to_list(<<"erlang">>).
       "erlang"
       %% or [101,114,108,97,110,103] in list notation.
      @@ -709,7 +709,7 @@

      Converts Subject to a list of byte/0s, each representing the value of one byte. PosLen or alternatively Pos and Len denote which part of the Subject binary to convert. By default, the entire Subject binary is -converted.

      Example:

      1> binary:bin_to_list(<<"erlang">>, {1,3}).
      +converted.

      Example:

      1> binary:bin_to_list(<<"erlang">>, {1,3}).
       "rla"
       %% or [114,108,97] in list notation.

      If PosLen or alternatively Pos and Len in any way reference outside the binary, a badarg exception is raised.

      @@ -851,7 +851,7 @@ -

      Decodes a hex encoded binary into a binary.

      Example

      1> binary:decode_hex(<<"66">>).
      +

      Decodes a hex encoded binary into a binary.

      Example

      1> binary:decode_hex(<<"66">>).
       <<"f">>
      @@ -917,11 +917,11 @@

      Converts the binary digit representation, in big endian or little endian, of a -positive integer in Subject to an Erlang integer/0.

      Example:

      1> binary:decode_unsigned(<<169,138,199>>).
      +positive integer in Subject to an Erlang integer/0.

      Example:

      1> binary:decode_unsigned(<<169,138,199>>).
       11111111
      -2> binary:decode_unsigned(<<169,138,199>>, big).
      +2> binary:decode_unsigned(<<169,138,199>>, big).
       11111111
      -3> binary:decode_unsigned(<<169,138,199>>, little).
      +3> binary:decode_unsigned(<<169,138,199>>, little).
       13077161
      @@ -984,13 +984,13 @@

      Encodes a binary into a hex encoded binary using the specified case for the -hexadecimal digits "a" to "f".

      The default case is uppercase.

      Example:

      1> binary:encode_hex(<<"f">>).
      +hexadecimal digits "a" to "f".

      The default case is uppercase.

      Example:

      1> binary:encode_hex(<<"f">>).
       <<"66">>
      -2> binary:encode_hex(<<"/">>).
      +2> binary:encode_hex(<<"/">>).
       <<"2F">>
      -3> binary:encode_hex(<<"/">>, lowercase).
      +3> binary:encode_hex(<<"/">>, lowercase).
       <<"2f">>
      -4> binary:encode_hex(<<"/">>, uppercase).
      +4> binary:encode_hex(<<"/">>, uppercase).
       <<"2F">>
      @@ -1053,11 +1053,11 @@

      Converts a positive integer to the smallest possible representation in a binary -digit representation, either big endian or little endian.

      Example:

      1> binary:encode_unsigned(11111111).
      +digit representation, either big endian or little endian.

      Example:

      1> binary:encode_unsigned(11111111).
       <<169,138,199>>
      -2> binary:encode_unsigned(11111111, big).
      +2> binary:encode_unsigned(11111111, big).
       <<169,138,199>>
      -2> binary:encode_unsigned(11111111, little).
      +2> binary:encode_unsigned(11111111, little).
       <<199,138,169>>
      @@ -1181,9 +1181,9 @@

      Returns the length of the longest common prefix of the binaries in list -Binaries.

      Example:

      1> binary:longest_common_prefix([<<"erlang">>, <<"ergonomy">>]).
      +Binaries.

      Example:

      1> binary:longest_common_prefix([<<"erlang">>, <<"ergonomy">>]).
       2
      -2> binary:longest_common_prefix([<<"erlang">>, <<"perl">>]).
      +2> binary:longest_common_prefix([<<"erlang">>, <<"perl">>]).
       0

      If Binaries is not a flat non-empty list of binaries, a badarg exception is raised.

      @@ -1216,9 +1216,9 @@

      Returns the length of the longest common suffix of the binaries in list -Binaries.

      Example:

      1> binary:longest_common_suffix([<<"erlang">>, <<"fang">>]).
      +Binaries.

      Example:

      1> binary:longest_common_suffix([<<"erlang">>, <<"fang">>]).
       3
      -2> binary:longest_common_suffix([<<"erlang">>, <<"perl">>]).
      +2> binary:longest_common_suffix([<<"erlang">>, <<"perl">>]).
       0

      If Binaries is not a flat non-empty list of binaries, a badarg exception is raised.

      @@ -1294,8 +1294,8 @@

      Searches for the first occurrence of Pattern in Subject and returns the position and length.

      The function returns {Pos, Length} for the binary in Pattern, starting at -the lowest position in Subject.

      Example:

      1> binary:match(<<"abcde">>, [<<"bcde">>, <<"cd">>],[]).
      -{1,4}

      Even though <<"cd">> ends before <<"bcde">>, <<"bcde">> begins first and +the lowest position in Subject.

      Example:

      1> binary:match(<<"abcde">>, [<<"bcde">>, <<"cd">>],[]).
      +{1,4}

      Even though <<"cd">> ends before <<"bcde">>, <<"bcde">> begins first and is therefore the first match. If two overlapping matches begin at the same position, the longest is returned.

      Summary of the options:

      • {scope, {Start, Length}} - Only the specified part is searched. Return values still have offsets from the beginning of Subject. A negative Length @@ -1375,9 +1375,9 @@

        As match/2, but Subject is searched until exhausted and a list of all non-overlapping parts matching Pattern is returned (in order).

        The first and longest match is preferred to a shorter, which is illustrated by -the following example:

        1> binary:matches(<<"abcde">>,
        -                  [<<"bcde">>,<<"bc">>,<<"de">>],[]).
        -[{1,4}]

        The result shows that <<"bcde">> is selected instead of the shorter match +the following example:

        1> binary:matches(<<"abcde">>,
        +                  [<<"bcde">>,<<"bc">>,<<"de">>],[]).
        +[{1,4}]

        The result shows that <<"bcde">> is selected instead of the shorter match <<"bc">> (which would have given raise to one more match, <<"de">>). This corresponds to the behavior of POSIX regular expressions (and programs like awk), but is not consistent with alternative matches in re (and Perl), where @@ -1446,7 +1446,7 @@

        Extracts the part of binary Subject described by PosLen.

        A negative length can be used to extract bytes at the end of a binary:

        1> Bin = <<1,2,3,4,5,6,7,8,9,10>>.
        -2> binary:part(Bin, {byte_size(Bin), -5}).
        +2> binary:part(Bin, {byte_size(Bin), -5}).
         <<6,7,8,9,10>>

        Note

        part/2 and part/3 are also available in the erlang module under the names binary_part/2 and binary_part/3. Those BIFs are allowed in guard tests.

        If PosLen in any way references outside the binary, a badarg exception is @@ -1484,33 +1484,33 @@ it can be useful to get the size of the referenced binary. This function can be used in a program to trigger the use of copy/1. By copying a binary, one can dereference the original, possibly large, binary that a -smaller binary is a reference to.

        Example:

        store(Binary, GBSet) ->
        +smaller binary is a reference to.

        Example:

        store(Binary, GBSet) ->
           NewBin =
        -      case binary:referenced_byte_size(Binary) of
        -          Large when Large > 2 * byte_size(Binary) ->
        -             binary:copy(Binary);
        +      case binary:referenced_byte_size(Binary) of
        +          Large when Large > 2 * byte_size(Binary) ->
        +             binary:copy(Binary);
                   _ ->
                      Binary
               end,
        -  gb_sets:insert(NewBin,GBSet).

        In this example, we chose to copy the binary content before inserting it in + gb_sets:insert(NewBin,GBSet).

        In this example, we chose to copy the binary content before inserting it in gb_sets:set() if it references a binary more than twice the data size we want to keep. Of course, different rules apply when copying to different programs.

        Binary sharing occurs whenever binaries are taken apart. This is the fundamental reason why binaries are fast, decomposition can always be done with O(1) complexity. In rare circumstances this data sharing is however undesirable, why this function together with copy/1 can be useful when optimizing -for memory use.

        Example of binary sharing:

        1> A = binary:copy(<<1>>, 100).
        +for memory use.

        Example of binary sharing:

        1> A = binary:copy(<<1>>, 100).
         <<1,1,1,1,1 ...
        -2> byte_size(A).
        +2> byte_size(A).
         100
        -3> binary:referenced_byte_size(A).
        +3> binary:referenced_byte_size(A).
         100
         4> <<B:10/binary, C:90/binary>> = A.
         <<1,1,1,1,1 ...
        -5> {byte_size(B), binary:referenced_byte_size(B)}.
        -{10,10}
        -6> {byte_size(C), binary:referenced_byte_size(C)}.
        -{90,100}

        In the above example, the small binary B was copied while the larger binary +5> {byte_size(B), binary:referenced_byte_size(B)}. +{10,10} +6> {byte_size(C), binary:referenced_byte_size(C)}. +{90,100}

        In the above example, the small binary B was copied while the larger binary C references binary A.

        Note

        Binary data is shared among processes. If another process still references the larger binary, copying the part this process uses only consumes more memory and does not free up the larger binary for garbage collection. Use this kind @@ -1599,28 +1599,28 @@ at the specified position (or positions) before inserting Replacement into Subject. If Replacement is given as a fun instead, this option is ignored.

        If any position specified in InsPos > size of the replacement binary, a badarg exception is raised.

        Options global and {scope, part()} work as for split/3. The return type is -always a binary/0.

        For a description of Pattern, see compile_pattern/1.

        Examples:

        1> binary:replace(<<"abcde">>, [<<"b">>, <<"d">>], <<"X">>, []).
        +always a binary/0.

        For a description of Pattern, see compile_pattern/1.

        Examples:

        1> binary:replace(<<"abcde">>, [<<"b">>, <<"d">>], <<"X">>, []).
         <<"aXcde">>
         
        -2> binary:replace(<<"abcde">>, [<<"b">>, <<"d">>], <<"X">>, [global]).
        +2> binary:replace(<<"abcde">>, [<<"b">>, <<"d">>], <<"X">>, [global]).
         <<"aXcXe">>
         
        -3> binary:replace(<<"abcde">>, <<"b">>, <<"[]">>, [{insert_replaced, 1}]).
        +3> binary:replace(<<"abcde">>, <<"b">>, <<"[]">>, [{insert_replaced, 1}]).
         <<"a[b]cde">>
         
        -4> binary:replace(<<"abcde">>, [<<"b">>, <<"d">>], <<"[]">>, [global, {insert_replaced, 1}]).
        +4> binary:replace(<<"abcde">>, [<<"b">>, <<"d">>], <<"[]">>, [global, {insert_replaced, 1}]).
         <<"a[b]c[d]e">>
         
        /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/c.html differs (HTML document, UTF-8 Unicode text, with very long lines)
        --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/c.html	2025-05-10 20:19:21.089299068 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/c.html	2025-05-10 20:19:21.089299068 +0000
        @@ -1758,7 +1758,7 @@
               
         
         

        Compiles and then loads the code for a file on all nodes. Options defaults to -[]. Compilation is equivalent to:

        compile:file(File, Options ++ [report_errors, report_warnings])
        +[]. Compilation is equivalent to:

        compile:file(File, Options ++ [report_errors, report_warnings])
        @@ -2105,7 +2105,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/calendar.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/calendar.html 2025-05-10 20:19:21.149299612 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/calendar.html 2025-05-10 20:19:21.149299612 +0000 @@ -1845,10 +1845,10 @@

        Converts an RFC 3339 timestamp into system time. The data format of RFC 3339 timestamps is described by RFC 3339. Starting from OTP 25.1, the minutes part of the time zone is optional.

        Valid option:

        • {unit, Unit} - The time unit of the return value. The default is -second.
        1> calendar:rfc3339_to_system_time("2018-02-01T16:17:58+01:00").
        +second.
      1> calendar:rfc3339_to_system_time("2018-02-01T16:17:58+01:00").
       1517498278
      -2> calendar:rfc3339_to_system_time("2018-02-01 15:18:02.088Z",
      -   [{unit, nanosecond}]).
      +2> calendar:rfc3339_to_system_time("2018-02-01 15:18:02.088Z",
      +   [{unit, nanosecond}]).
       1517498282088000000
      @@ -2018,16 +2018,16 @@ the formatted string includes a fraction of a second. The number of fractional second digits is three, six, or nine depending on what time unit is chosen. For native three fractional digits are included. Notice that trailing zeros -are not removed from the fraction.

    1> calendar:system_time_to_rfc3339(erlang:system_time(second)).
    +are not removed from the fraction.

    1> calendar:system_time_to_rfc3339(erlang:system_time(second)).
     "2018-04-23T14:56:28+02:00"
    -2> calendar:system_time_to_rfc3339(erlang:system_time(second),
    -   [{offset, "-02:00"}]).
    +2> calendar:system_time_to_rfc3339(erlang:system_time(second),
    +   [{offset, "-02:00"}]).
     "2018-04-23T10:56:52-02:00"
    -3> calendar:system_time_to_rfc3339(erlang:system_time(second),
    -   [{offset, -7200}]).
    +3> calendar:system_time_to_rfc3339(erlang:system_time(second),
    +   [{offset, -7200}]).
     "2018-04-23T10:57:05-02:00"
    -4> calendar:system_time_to_rfc3339(erlang:system_time(millisecond),
    -   [{unit, millisecond}, {time_designator, $\s}, {offset, "Z"}]).
    +4> calendar:system_time_to_rfc3339(erlang:system_time(millisecond),
    +   [{unit, millisecond}, {time_designator, $\s}, {offset, "Z"}]).
     "2018-04-23 12:57:20.482Z"
    @@ -2262,7 +2262,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/dets.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/dets.html 2025-05-10 20:19:21.217300229 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/dets.html 2025-05-10 20:19:21.217300229 +0000 @@ -1914,14 +1914,14 @@

    Returns a list of all objects with key Key stored in table Name, for -example:

    2> dets:open_file(abc, [{type, bag}]).
    -{ok,abc}
    -3> dets:insert(abc, {1,2,3}).
    +example:

    2> dets:open_file(abc, [{type, bag}]).
    +{ok,abc}
    +3> dets:insert(abc, {1,2,3}).
     ok
    -4> dets:insert(abc, {1,3,4}).
    +4> dets:insert(abc, {1,3,4}).
     ok
    -5> dets:lookup(abc, 1).
    -[{1,2,3},{1,3,4}]

    If the table type is set, the function returns either the empty list or a list +5> dets:lookup(abc, 1). +[{1,2,3},{1,3,4}]

    If the table type is set, the function returns either the empty list or a list with one object, as there cannot be more than one object with a given key. If the table type is bag or duplicate_bag, the function returns a list of arbitrary length.

    Notice that the order of objects returned is unspecified. In particular, the @@ -2778,11 +2778,11 @@ specification is specified explicitly. This is how to state match specifications that cannot easily be expressed within the syntax provided by qlc.

    The following example uses an explicit match specification to traverse the -table:

    1> dets:open_file(t, []),
    -ok = dets:insert(t, [{1,a},{2,b},{3,c},{4,d}]),
    -MS = ets:fun2ms(fun({X,Y}) when (X > 1) or (X < 5) -> {Y} end),
    -QH1 = dets:table(t, [{traverse, {select, MS}}]).

    An example with implicit match specification:

    2> QH2 = qlc:q([{Y} || {X,Y} <- dets:table(t), (X > 1) or (X < 5)]).

    The latter example is equivalent to the former, which can be verified using -function qlc:info/1:

    3> qlc:info(QH1) =:= qlc:info(QH2).
    +table:

    1> dets:open_file(t, []),
    +ok = dets:insert(t, [{1,a},{2,b},{3,c},{4,d}]),
    +MS = ets:fun2ms(fun({X,Y}) when (X > 1) or (X < 5) -> {Y} end),
    +QH1 = dets:table(t, [{traverse, {select, MS}}]).

    An example with implicit match specification:

    2> QH2 = qlc:q([{Y} || {X,Y} <- dets:table(t), (X > 1) or (X < 5)]).

    The latter example is equivalent to the former, which can be verified using +function qlc:info/1:

    3> qlc:info(QH1) =:= qlc:info(QH2).
     true

    qlc:info/1 returns information about a query handle. In this case identical information is returned for the two query handles.

    @@ -2856,7 +2856,7 @@

    Applies Fun to each object stored in table Name in some unspecified order. Different actions are taken depending on the return value of Fun. The following Fun return values are allowed:

    • continue - Continue to perform the traversal. For example, the following -function can be used to print the contents of a table:

      fun(X) -> io:format("~p~n", [X]), continue end.
    • {continue, Val} - Continue the traversal and accumulate Val. The +function can be used to print the contents of a table:

      fun(X) -> io:format("~p~n", [X]), continue end.
    • {continue, Val} - Continue the traversal and accumulate Val. The following function is supplied to collect all objects of a table in a list:

      fun(X) -> {continue, X} end.
    • {done, Value} - Terminate the traversal and return [Value | Acc].

    Any other value OtherValue returned by Fun terminates the traversal and is returned immediately.

    @@ -2927,7 +2927,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/dict.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/dict.html 2025-05-10 20:19:21.257300592 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/dict.html 2025-05-10 20:19:21.257300592 +0000 @@ -138,13 +138,13 @@ Notes

    Functions append and append_list are included so that keyed values can be -stored in a list accumulator, for example:

    > D0 = dict:new(),
    -  D1 = dict:store(files, [], D0),
    -  D2 = dict:append(files, f1, D1),
    -  D3 = dict:append(files, f2, D2),
    -  D4 = dict:append(files, f3, D3),
    -  dict:fetch(files, D4).
    -[f1,f2,f3]

    This saves the trouble of first fetching a keyed value, appending a new value to +stored in a list accumulator, for example:

    > D0 = dict:new(),
    +  D1 = dict:store(files, [], D0),
    +  D2 = dict:append(files, f1, D1),
    +  D3 = dict:append(files, f2, D2),
    +  D4 = dict:append(files, f3, D3),
    +  dict:fetch(files, D4).
    +[f1,f2,f3]

    This saves the trouble of first fetching a keyed value, appending a new value to the list of stored values, and storing the result.

    Function fetch is to be used if the key is known to be in the dictionary, otherwise function find.

    @@ -905,10 +905,10 @@ the Key-Value pairs from both dictionaries are included in the new dictionary. If a key occurs in both dictionaries, Fun is called with the key and both values to return a new value. merge can be defined as follows, but is -faster:

    merge(Fun, D1, D2) ->
    -    fold(fun (K, V1, D) ->
    -                 update(K, fun (V2) -> Fun(K, V1, V2) end, V1, D)
    -         end, D2, D1).
    +faster:

    merge(Fun, D1, D2) ->
    +    fold(fun (K, V1, D) ->
    +                 update(K, fun (V2) -> Fun(K, V1, V2) end, V1, D)
    +         end, D2, D1).
    @@ -1121,8 +1121,8 @@

    Updates a value in a dictionary by calling Fun on the value to get a new value. If Key is not present in the dictionary, Initial is stored as the -first value. For example, append/3 can be defined as:

    append(Key, Val, D) ->
    -    update(Key, fun (Old) -> Old ++ [Val] end, [Val], D).
    +first value. For example, append/3 can be defined as:

    append(Key, Val, D) ->
    +    update(Key, fun (Old) -> Old ++ [Val] end, [Val], D).
    @@ -1153,8 +1153,8 @@

    Adds Increment to the value associated with Key and stores this value. If Key is not present in the dictionary, Increment is stored as the first -value.

    This can be defined as follows, but is faster:

    update_counter(Key, Incr, D) ->
    -    update(Key, fun (Old) -> Old + Incr end, Incr, D).
    +value.

    This can be defined as follows, but is faster:

    update_counter(Key, Incr, D) ->
    +    update(Key, fun (Old) -> Old + Incr end, Incr, D).
    @@ -1183,7 +1183,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/digraph.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/digraph.html 2025-05-10 20:19:21.305301027 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/digraph.html 2025-05-10 20:19:21.305301027 +0000 @@ -1842,7 +1842,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/digraph_utils.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/digraph_utils.html 2025-05-10 20:19:21.341301353 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/digraph_utils.html 2025-05-10 20:19:21.341301353 +0000 @@ -1044,7 +1044,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/edlin.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/edlin.html 2025-05-10 20:19:21.365301571 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/edlin.html 2025-05-10 20:19:21.365301571 +0000 @@ -344,7 +344,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/edlin_expand.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/edlin_expand.html 2025-05-10 20:19:21.389301789 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/edlin_expand.html 2025-05-10 20:19:21.389301789 +0000 @@ -336,7 +336,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/epp.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/epp.html 2025-05-10 20:19:21.429302151 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/epp.html 2025-05-10 20:19:21.429302151 +0000 @@ -140,7 +140,7 @@ Error Information

    ErrorInfo is the standard ErrorInfo structure that is returned from all I/O -modules. The format is as follows:

    {ErrorLine, Module, ErrorDescriptor}

    A string describing the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)

    +modules. The format is as follows:

    {ErrorLine, Module, ErrorDescriptor}

    A string describing the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)

    @@ -1233,7 +1233,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_anno.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_anno.html 2025-05-10 20:19:21.465302477 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_anno.html 2025-05-10 20:19:21.465302477 +0000 @@ -1267,7 +1267,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_error.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_error.html 2025-05-10 20:19:21.497302767 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_error.html 2025-05-10 20:19:21.497302767 +0000 @@ -317,7 +317,7 @@

    A fun used to format function arguments for BIF and function calls. By default -the following fun will be used:

    fun(Term, I) -> io_lib:print(Term, I, 80, 30) end
    +the following fun will be used:

    fun(Term, I) -> io_lib:print(Term, I, 80, 30) end
    @@ -438,23 +438,23 @@ caused the error starting at 1.

  • general - An error that is not associated with any argument caused the error.

  • reason - If the Reason should be printed differently than the default way.

  • If the text returned includes new-lines, format_exception/4 will indent the -text correctly.

    Example:

    -module(my_error_module).
    --export([atom_to_string/1, format_error/2]).
    +text correctly.

    Example:

    -module(my_error_module).
    +-export([atom_to_string/1, format_error/2]).
     
    -atom_to_string(Arg) when is_atom(Arg) ->
    -  atom_to_list(Arg);
    -atom_to_string(Arg) ->
    -  erlang:error(badarg,[Arg],
    -               [{error_info,#{ module => ?MODULE,
    -                               cause => #{ 1 => "should be an atom" }}}]).
    -
    -format_error(Reason, [{_M,_F,_As,Info}|_]) ->
    -  ErrorInfo = proplists:get_value(error_info, Info, #{}),
    -  ErrorMap = maps:get(cause, ErrorInfo),
    -  ErrorMap#{ general => "optional general information",
    -             reason => io_lib:format("~p: ~p",[?MODULE, Reason]) }.
    1> c(my_error_module).
    -{ok,my_error_module}
    -2> my_error_module:atom_to_string(1).
    +atom_to_string(Arg) when is_atom(Arg) ->
    +  atom_to_list(Arg);
    +atom_to_string(Arg) ->
    +  erlang:error(badarg,[Arg],
    +               [{error_info,#{ module => ?MODULE,
    +                               cause => #{ 1 => "should be an atom" }}}]).
    +
    +format_error(Reason, [{_M,_F,_As,Info}|_]) ->
    +  ErrorInfo = proplists:get_value(error_info, Info, #{}),
    +  ErrorMap = maps:get(cause, ErrorInfo),
    +  ErrorMap#{ general => "optional general information",
    +             reason => io_lib:format("~p: ~p",[?MODULE, Reason]) }.
    1> c(my_error_module).
    +{ok,my_error_module}
    +2> my_error_module:atom_to_string(1).
     ** exception error: my_error_module: badarg
          in function  my_error_module:atom_to_string/1
             called as my_error_module:atom_to_string(1)
    @@ -542,18 +542,18 @@
     
     

    Format the error reason and stack back-trace caught using try ... catch in the same style as the shell formats them.

    Example:

    try
    -    do_something()
    +    do_something()
     catch
         C:R:Stk ->
    -        Message = erl_error:format_exception(C, R, Stk),
    -        io:format(LogFile, "~ts\n", [Message])
    +        Message = erl_error:format_exception(C, R, Stk),
    +        io:format(LogFile, "~ts\n", [Message])
     end

    If error_info is provided with the exception, format_exception will use that information to provide additional information about the exception.

    Example:

    try
    -  erlang:raise(badarg,[],[{error_info,#{}}])
    +  erlang:raise(badarg,[],[{error_info,#{}}])
     catch
         C:R:Stk ->
    -        Message = erl_error:format_exception(C, R, Stk),
    -        io:format(LogFile, "~ts\n", [Message])
    +        Message = erl_error:format_exception(C, R, Stk),
    +        io:format(LogFile, "~ts\n", [Message])
     end

    See erlang:error/3 for details on how to raise an exception with error_info included.

    @@ -584,7 +584,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_eval.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_eval.html 2025-05-10 20:19:21.541303166 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_eval.html 2025-05-10 20:19:21.541303166 +0000 @@ -141,13 +141,13 @@ LocalFunctionHandler can be used to define a function that is called when there is a call to a local function. The argument can have the following formats:

    • {value,Func} - This defines a local function handler that is called -with:

      Func(Name, Arguments)

      Name is the name of the local function (an atom) and Arguments is a list +with:

      Func(Name, Arguments)

      Name is the name of the local function (an atom) and Arguments is a list of the evaluated arguments. The function handler returns the value of the local function. In this case, the current bindings cannot be accessed. To signal an error, the function handler calls exit/1 with a -suitable exit value.

    • {eval,Func} - This defines a local function handler that is called with:

      Func(Name, Arguments, Bindings)

      Name is the name of the local function (an atom), Arguments is a list of +suitable exit value.

    • {eval,Func} - This defines a local function handler that is called with:

      Func(Name, Arguments, Bindings)

      Name is the name of the local function (an atom), Arguments is a list of the unevaluated arguments, and Bindings are the current variable bindings. -The function handler returns:

      {value,Value,NewBindings}

      Value is the value of the local function and NewBindings are the updated +The function handler returns:

      {value,Value,NewBindings}

      Value is the value of the local function and NewBindings are the updated variable bindings. In this case, the function handler must itself evaluate all the function arguments and manage the bindings. To signal an error, the function handler calls exit/1 with a suitable exit value.

    • none - There is no local function handler.

    @@ -161,7 +161,7 @@ expressions.
  • An operator Op/A is called (this is handled as a call to function erlang:Op/A).
  • Exceptions are calls to erlang:apply/2,3; neither of the function handlers are called for such calls. The argument can have the following formats:

    • {value,Func} - This defines a non-local function handler. The function -may be called with two arguments:

      Func(FuncSpec, Arguments)

      or three arguments:

      Func(Anno, FuncSpec, Arguments)

      Anno is the erl_anno:anno() of the node, FuncSpec +may be called with two arguments:

      Func(FuncSpec, Arguments)

      or three arguments:

      Func(Anno, FuncSpec, Arguments)

      Anno is the erl_anno:anno() of the node, FuncSpec is the name of the function on the form {Module,Function} or a fun, and Arguments is a list of the evaluated arguments. The function handler returns the value of the function. To signal an error, the function handler @@ -1425,7 +1425,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_expand_records.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_expand_records.html 2025-05-10 20:19:21.565303384 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_expand_records.html 2025-05-10 20:19:21.565303384 +0000 @@ -236,7 +236,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_features.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_features.html 2025-05-10 20:19:21.589303602 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_features.html 2025-05-10 20:19:21.589303602 +0000 @@ -592,7 +592,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_id_trans.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_id_trans.html 2025-05-10 20:19:21.613303818 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_id_trans.html 2025-05-10 20:19:21.613303818 +0000 @@ -291,7 +291,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_internal.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_internal.html 2025-05-10 20:19:21.641304072 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_internal.html 2025-05-10 20:19:21.641304072 +0000 @@ -580,7 +580,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_lint.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_lint.html 2025-05-10 20:19:21.665304290 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_lint.html 2025-05-10 20:19:21.669304326 +0000 @@ -139,7 +139,7 @@ Error Information

    ErrorInfo is the standard ErrorInfo structure that is returned from all I/O -modules. The format is as follows:

    {ErrorLine, Module, ErrorDescriptor}

    A string describing the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)

    +modules. The format is as follows:

    {ErrorLine, Module, ErrorDescriptor}

    A string describing the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)

    @@ -595,7 +595,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_parse.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_parse.html 2025-05-10 20:19:21.729304870 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_parse.html 2025-05-10 20:19:21.757305124 +0000 @@ -138,7 +138,7 @@ Error Information

    ErrorInfo is the standard ErrorInfo structure that is returned from all I/O modules. -The format is as follows:

    {ErrorLine, Module, ErrorDescriptor}

    A string describing the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)

    +The format is as follows:

    {ErrorLine, Module, ErrorDescriptor}

    A string describing the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)

    @@ -5920,7 +5920,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_pp.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_pp.html 2025-05-10 20:19:21.789305415 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_pp.html 2025-05-10 20:19:21.793305451 +0000 @@ -1005,7 +1005,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_scan.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_scan.html 2025-05-10 20:19:21.821305705 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_scan.html 2025-05-10 20:19:21.829305777 +0000 @@ -136,7 +136,7 @@ Error Information

    ErrorInfo is the standard ErrorInfo structure that is returned from all I/O -modules. The format is as follows:

    {ErrorLocation, Module, ErrorDescriptor}

    A string describing the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)

    +modules. The format is as follows:

    {ErrorLocation, Module, ErrorDescriptor}

    A string describing the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)

    @@ -1345,7 +1345,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_tar.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_tar.html 2025-05-10 20:19:21.861306067 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/erl_tar.html 2025-05-10 20:19:21.873306176 +0000 @@ -1291,14 +1291,14 @@ Notice that there is only an arity-2 read function, not an arity-1 function.

  • (position,{UserData,Position}) - Sets the position of UserData as defined for files in file:position/2

  • Example:

    The following is a complete Fun parameter for reading and writing on files using the file module:

    ExampleFun =
    -   fun(write, {Fd,Data}) ->  file:write(Fd, Data);
    -      (position, {Fd,Pos}) -> file:position(Fd, Pos);
    -      (read2, {Fd,Size}) -> file:read(Fd, Size);
    -      (close, Fd) -> file:close(Fd)
    -   end

    Here Fd was specified to function init/3 as:

    {ok,Fd} = file:open(Name, ...).
    -{ok,TarDesc} = erl_tar:init(Fd, [write], ExampleFun),

    TarDesc is then used:

    erl_tar:add(TarDesc, SomeValueIwantToAdd, FileNameInTarFile),
    +   fun(write, {Fd,Data}) ->  file:write(Fd, Data);
    +      (position, {Fd,Pos}) -> file:position(Fd, Pos);
    +      (read2, {Fd,Size}) -> file:read(Fd, Size);
    +      (close, Fd) -> file:close(Fd)
    +   end

    Here Fd was specified to function init/3 as:

    {ok,Fd} = file:open(Name, ...).
    +{ok,TarDesc} = erl_tar:init(Fd, [write], ExampleFun),

    TarDesc is then used:

    erl_tar:add(TarDesc, SomeValueIwantToAdd, FileNameInTarFile),
     ...,
    -erl_tar:close(TarDesc)

    When the erl_tar core wants to, for example, write a piece of Data, it would +erl_tar:close(TarDesc)

    When the erl_tar core wants to, for example, write a piece of Data, it would call ExampleFun(write, {UserData,Data}).

    Note

    This example with the file module operations is not necessary to use directly, as that is what function open/2 in principle does.

    Warning

    The TarDescriptor term is not a file descriptor. You are advised not to rely on the specific contents of this term, as it can change in future Erlang/OTP @@ -1487,7 +1487,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/escript.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/escript.html 2025-05-10 20:19:21.901306429 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/escript.html 2025-05-10 20:19:21.909306503 +0000 @@ -522,67 +522,67 @@ number of schedulers with +S3. We also extract the different sections from the newly created script:

    > Source = "%% Demo\nmain(_Args) ->\n    io:format(\"~p\",[erlang:system_info(schedulers)]).\n".
     "%% Demo\nmain(_Args) ->\n    io:format(erlang:system_info(schedulers)).\n"
    -> io:format("~s\n", [Source]).
    +> io:format("~s\n", [Source]).
     %% Demo
    -main(_Args) ->
    -    io:format(erlang:system_info(schedulers)).
    +main(_Args) ->
    +    io:format(erlang:system_info(schedulers)).
     
     ok
    -> {ok, Bin} = escript:create(binary, [shebang, comment, {emu_args, "+S3"},
    -                                      {source, list_to_binary(Source)}]).
    -{ok,<<"#!/usr/bin/env escript\n%% This is an -*- erlang -*- file\n%%!+S3"...>>}
    -> file:write_file("demo.escript", Bin).
    +> {ok, Bin} = escript:create(binary, [shebang, comment, {emu_args, "+S3"},
    +                                      {source, list_to_binary(Source)}]).
    +{ok,<<"#!/usr/bin/env escript\n%% This is an -*- erlang -*- file\n%%!+S3"...>>}
    +> file:write_file("demo.escript", Bin).
     ok
    -> os:cmd("escript demo.escript").
    +> os:cmd("escript demo.escript").
     "3"
    -> escript:extract("demo.escript", []).
    -{ok,[{shebang,default}, {comment,default}, {emu_args,"+S3"},
    -     {source,<<"%% Demo\nmain(_Args) ->\n    io:format(erlang:system_info(schedu"...>>}]}

    An escript without header can be created as follows:

    > file:write_file("demo.erl",
    -                  ["%% demo.erl\n-module(demo).\n-export([main/1]).\n\n", Source]).
    +> escript:extract("demo.escript", []).
    +{ok,[{shebang,default}, {comment,default}, {emu_args,"+S3"},
    +     {source,<<"%% Demo\nmain(_Args) ->\n    io:format(erlang:system_info(schedu"...>>}]}

    An escript without header can be created as follows:

    > file:write_file("demo.erl",
    +                  ["%% demo.erl\n-module(demo).\n-export([main/1]).\n\n", Source]).
     ok
    -> {ok, _, BeamCode} = compile:file("demo.erl", [binary, debug_info]).
    -{ok,demo,
    +> {ok, _, BeamCode} = compile:file("demo.erl", [binary, debug_info]).
    +{ok,demo,
         <<70,79,82,49,0,0,2,208,66,69,65,77,65,116,111,109,0,0,0,
    -      79,0,0,0,9,4,100,...>>}
    -> escript:create("demo.beam", [{beam, BeamCode}]).
    +      79,0,0,0,9,4,100,...>>}
    +> escript:create("demo.beam", [{beam, BeamCode}]).
     ok
    -> escript:extract("demo.beam", []).
    -{ok,[{shebang,undefined}, {comment,undefined}, {emu_args,undefined},
    -     {beam,<<70,79,82,49,0,0,3,68,66,69,65,77,65,116,
    -             111,109,0,0,0,83,0,0,0,9,...>>}]}
    -> os:cmd("escript demo.beam").
    +> escript:extract("demo.beam", []).
    +{ok,[{shebang,undefined}, {comment,undefined}, {emu_args,undefined},
    +     {beam,<<70,79,82,49,0,0,3,68,66,69,65,77,65,116,
    +             111,109,0,0,0,83,0,0,0,9,...>>}]}
    +> os:cmd("escript demo.beam").
     "true"

    Here we create an archive script containing both Erlang code and Beam code, then we iterate over all files in the archive and collect their contents and some -information about them:

    > {ok, SourceCode} = file:read_file("demo.erl").
    -{ok,<<"%% demo.erl\n-module(demo).\n-export([main/1]).\n\n%% Demo\nmain(_Arg"...>>}
    -> escript:create("demo.escript",
    -                 [shebang,
    -                  {archive, [{"demo.erl", SourceCode},
    -                             {"demo.beam", BeamCode}], []}]).
    -ok
    -> {ok, [{shebang,default}, {comment,undefined}, {emu_args,undefined},
    -     {archive, ArchiveBin}]} = escript:extract("demo.escript", []).
    -{ok,[{shebang,default}, {comment,undefined}, {emu_args,undefined},
    -     {{archive,<<80,75,3,4,20,0,0,0,8,0,118,7,98,60,105,
    -                152,61,93,107,0,0,0,118,0,...>>}]}
    -> file:write_file("demo.zip", ArchiveBin).
    -ok
    -> zip:foldl(fun(N, I, B, A) -> [{N, I(), B()} | A] end, [], "demo.zip").
    -{ok,[{"demo.beam",
    -      {file_info,748,regular,read_write,
    -                 {{2010,3,2},{0,59,22}},
    -                 {{2010,3,2},{0,59,22}},
    -                 {{2010,3,2},{0,59,22}},
    -                 54,1,0,0,0,0,0},
    +information about them:

    > {ok, SourceCode} = file:read_file("demo.erl").
    +{ok,<<"%% demo.erl\n-module(demo).\n-export([main/1]).\n\n%% Demo\nmain(_Arg"...>>}
    +> escript:create("demo.escript",
    +                 [shebang,
    +                  {archive, [{"demo.erl", SourceCode},
    +                             {"demo.beam", BeamCode}], []}]).
    +ok
    +> {ok, [{shebang,default}, {comment,undefined}, {emu_args,undefined},
    +     {archive, ArchiveBin}]} = escript:extract("demo.escript", []).
    +{ok,[{shebang,default}, {comment,undefined}, {emu_args,undefined},
    +     {{archive,<<80,75,3,4,20,0,0,0,8,0,118,7,98,60,105,
    +                152,61,93,107,0,0,0,118,0,...>>}]}
    +> file:write_file("demo.zip", ArchiveBin).
    +ok
    +> zip:foldl(fun(N, I, B, A) -> [{N, I(), B()} | A] end, [], "demo.zip").
    +{ok,[{"demo.beam",
    +      {file_info,748,regular,read_write,
    +                 {{2010,3,2},{0,59,22}},
    +                 {{2010,3,2},{0,59,22}},
    +                 {{2010,3,2},{0,59,22}},
    +                 54,1,0,0,0,0,0},
           <<70,79,82,49,0,0,2,228,66,69,65,77,65,116,111,109,0,0,0,
    -        83,0,0,...>>},
    -     {"demo.erl",
    -      {file_info,118,regular,read_write,
    -                 {{2010,3,2},{0,59,22}},
    -                 {{2010,3,2},{0,59,22}},
    -                 {{2010,3,2},{0,59,22}},
    -                 54,1,0,0,0,0,0},
    -      <<"%% demo.erl\n-module(demo).\n-export([main/1]).\n\n%% Demo\nmain(_Arg"...>>}]}
    +
    83,0,0,...>>}, + {"demo.erl", + {file_info,118,regular,read_write, + {{2010,3,2},{0,59,22}}, + {{2010,3,2},{0,59,22}}, + {{2010,3,2},{0,59,22}}, + 54,1,0,0,0,0,0}, + <<"%% demo.erl\n-module(demo).\n-export([main/1]).\n\n%% Demo\nmain(_Arg"...>>}]}
    @@ -615,16 +615,16 @@ extracted value is set to the atom default. If a section is missing, the extracted value is set to the atom undefined.

    Option compile_source only affects the result if the escript contains source code. In this case the Erlang code is automatically compiled and -{source, BeamCode} is returned instead of {source, SourceCode}.

    Example:

    > escript:create("demo.escript",
    -                 [shebang, {archive, [{"demo.erl", SourceCode},
    -                                      {"demo.beam", BeamCode}], []}]).
    -ok
    -> {ok, [{shebang,default}, {comment,undefined}, {emu_args,undefined},
    -     {archive, ArchiveBin}]} =
    -              escript:extract("demo.escript", []).
    -{ok,[{{archive,<<80,75,3,4,20,0,0,0,8,0,118,7,98,60,105,
    -                152,61,93,107,0,0,0,118,0,...>>}
    -     {emu_args,undefined}]}
    +{source, BeamCode} is returned instead of {source, SourceCode}.

    Example:

    > escript:create("demo.escript",
    +                 [shebang, {archive, [{"demo.erl", SourceCode},
    +                                      {"demo.beam", BeamCode}], []}]).
    +ok
    +> {ok, [{shebang,default}, {comment,undefined}, {emu_args,undefined},
    +     {archive, ArchiveBin}]} =
    +              escript:extract("demo.escript", []).
    +{ok,[{{archive,<<80,75,3,4,20,0,0,0,8,0,118,7,98,60,105,
    +                152,61,93,107,0,0,0,118,0,...>>}
    +     {emu_args,undefined}]}
    @@ -682,7 +682,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/ets.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/ets.html 2025-05-10 20:19:21.977307119 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/ets.html 2025-05-10 20:19:22.009307409 +0000 @@ -220,10 +220,10 @@ find the next key is not done with such guarantees. This is often not a problem, but may cause rare subtle "unexpected" effects if a concurrent process inserts objects during a traversal. For example, consider one process -doing

    ets:new(t, [ordered_set, named_table]),
    -ets:insert(t, {1}),
    -ets:insert(t, {2}),
    -ets:insert(t, {3}),

    A concurrent call to ets:first(t), done by another process, may then in rare +doing

    ets:new(t, [ordered_set, named_table]),
    +ets:insert(t, {1}),
    +ets:insert(t, {2}),
    +ets:insert(t, {3}),

    A concurrent call to ets:first(t), done by another process, may then in rare cases return 2 even though 2 has never existed in the table ordered as the first key. In the same way, a concurrent call to ets:next(t, 1) may return 3 even though 3 never existed in the table ordered directly after 1.

    Effects like this are improbable but possible. The probability will further be @@ -236,11 +236,11 @@ lookup without any table traversal at all. For ordered_set a partially bound key will limit the traversal to only scan a subset of the table based on term order. A partially bound key is either a list or a tuple with a prefix that is -fully bound. Example:

    1> T = ets:new(t,[ordered_set]), ets:insert(T, {"555-1234", "John Smith"}).
    +fully bound. Example:

    1> T = ets:new(t,[ordered_set]), ets:insert(T, {"555-1234", "John Smith"}).
     true
     2> %% Efficient search of all with area code 555
    -2> ets:match(T,{[$5,$5,$5,$- |'$1'],'$2'}).
    -[["1234","John Smith"]]

    +2> ets:match(T,{[$5,$5,$5,$- |'$1'],'$2'}). +[["1234","John Smith"]]

    @@ -1936,19 +1936,19 @@ -include_lib("stdlib/include/ms_transform.hrl"). to the source file.

    The fun is very restricted, it can take only a single parameter (the object to match): a sole variable or a tuple. It must use the is_ guard tests. Language constructs that have no representation in a match specification (if, case, -receive, and so on) are not allowed.

    The return value is the resulting match specification.

    Example:

    1> ets:fun2ms(fun({M,N}) when N > 3 -> M end).
    -[{{'$1','$2'},[{'>','$2',3}],['$1']}]

    Variables from the environment can be imported, so that the following works:

    2> X=3.
    +receive, and so on) are not allowed.

    The return value is the resulting match specification.

    Example:

    1> ets:fun2ms(fun({M,N}) when N > 3 -> M end).
    +[{{'$1','$2'},[{'>','$2',3}],['$1']}]

    Variables from the environment can be imported, so that the following works:

    2> X=3.
     3
    -3> ets:fun2ms(fun({M,N}) when N > X -> M end).
    -[{{'$1','$2'},[{'>','$2',{const,3}}],['$1']}]

    The imported variables are replaced by match specification const expressions, +3> ets:fun2ms(fun({M,N}) when N > X -> M end). +[{{'$1','$2'},[{'>','$2',{const,3}}],['$1']}]

    The imported variables are replaced by match specification const expressions, which is consistent with the static scoping for Erlang funs. However, local or global function calls cannot be in the guard or body of the fun. Calls to -built-in match specification functions is of course allowed:

    4> ets:fun2ms(fun({M,N}) when N > X, my_fun(M) -> M end).
    +built-in match specification functions is of course allowed:

    4> ets:fun2ms(fun({M,N}) when N > X, my_fun(M) -> M end).
     Error: fun containing local Erlang function calls
    -('my_fun' called in guard) cannot be translated into match_spec
    -{error,transform_error}
    -5> ets:fun2ms(fun({M,N}) when N > X, is_atom(M) -> M end).
    -[{{'$1','$2'},[{'>','$2',{const,3}},{is_atom,'$1'}],['$1']}]

    As shown by the example, the function can be called from the shell also. The fun +('my_fun' called in guard) cannot be translated into match_spec +{error,transform_error} +5> ets:fun2ms(fun({M,N}) when N > X, is_atom(M) -> M end). +[{{'$1','$2'},[{'>','$2',{const,3}},{is_atom,'$1'}],['$1']}]

    As shown by the example, the function can be called from the shell also. The fun must be literally in the call when used from the shell as well.

    Warning

    If the parse_transform is not applied to a module that calls this pseudo function, the call fails in runtime (with a badarg). The ets module exports a function with this name, but it is never to be called except when @@ -2573,12 +2573,12 @@

    Matches the objects in table Table against pattern Pattern.

    A pattern is a term that can contain:

    • Bound parts (Erlang terms)
    • '_' that matches any Erlang term
    • Pattern variables '$N', where N=0,1,...

    The function returns a list with one element for each matching object, where -each element is an ordered list of pattern variable bindings, for example:

    6> ets:match(T, '$1'). % Matches every object in table
    -[[{rufsen,dog,7}],[{brunte,horse,5}],[{ludde,dog,5}]]
    -7> ets:match(T, {'_',dog,'$1'}).
    -[[7],[5]]
    -8> ets:match(T, {'_',cow,'$1'}).
    -[]

    If the key is specified in the pattern, the match is very efficient. If the key +each element is an ordered list of pattern variable bindings, for example:

    6> ets:match(T, '$1'). % Matches every object in table
    +[[{rufsen,dog,7}],[{brunte,horse,5}],[{ludde,dog,5}]]
    +7> ets:match(T, {'_',dog,'$1'}).
    +[[7],[5]]
    +8> ets:match(T, {'_',cow,'$1'}).
    +[]

    If the key is specified in the pattern, the match is very efficient. If the key is not specified, that is, if it is a variable or an underscore, the entire table must be searched. The search time can be substantial if the table is very large.

    For tables of type ordered_set, the result is in the same order as in a @@ -2830,10 +2830,10 @@ execution time):

    Table = ets:new...
     MatchSpec = ...
     % The following call...
    -ets:match_spec_run(ets:tab2list(Table),
    -                   ets:match_spec_compile(MatchSpec)),
    +ets:match_spec_run(ets:tab2list(Table),
    +                   ets:match_spec_compile(MatchSpec)),
     % ...gives the same result as the more common (and more efficient)
    -ets:select(Table, MatchSpec),

    Note

    This function has limited use in normal code. It is used by the dets +ets:select(Table, MatchSpec),

    Note

    This function has limited use in normal code. It is used by the dets module to perform the dets:select/1 operations and by Mnesia during transactions.

    @@ -3196,19 +3196,19 @@ format. Given that the original match specification is kept intact, the continuation can be restored, meaning it can once again be used in subsequent select/1 calls even though it has been stored on disk or on -another node.

    Examples:

    The following sequence of calls may fail:

    T=ets:new(x,[]),
    +another node.

    Examples:

    The following sequence of calls may fail:

    T=ets:new(x,[]),
     ...
    -MS = ets:fun2ms(fun({N,_}=A) when (N rem 10) =:= 0 -> A end),
    -{_,C} = ets:select(T, MS, 10),
    -MaybeBroken = binary_to_term(term_to_binary(C)),
    -ets:select(MaybeBroken).

    The following sequence works, as the call to +MS = ets:fun2ms(fun({N,_}=A) when (N rem 10) =:= 0 -> A end), +{_,C} = ets:select(T, MS, 10), +MaybeBroken = binary_to_term(term_to_binary(C)), +ets:select(MaybeBroken).

    The following sequence works, as the call to repair_continuation/2 reestablishes the -MaybeBroken continuation.

    T=ets:new(x,[]),
    +MaybeBroken continuation.

    T=ets:new(x,[]),
     ...
    -MS = ets:fun2ms(fun({N,_}=A) when (N rem 10) =:= 0 -> A end),
    -{_,C} = ets:select(T,MS,10),
    -MaybeBroken = binary_to_term(term_to_binary(C)),
    -ets:select(ets:repair_continuation(MaybeBroken,MS)).

    Note

    This function is rarely needed in application code. It is used by Mnesia to +MS = ets:fun2ms(fun({N,_}=A) when (N rem 10) =:= 0 -> A end), +{_,C} = ets:select(T,MS,10), +MaybeBroken = binary_to_term(term_to_binary(C)), +ets:select(ets:repair_continuation(MaybeBroken,MS)).

    Note

    This function is rarely needed in application code. It is used by Mnesia to provide distributed select/3 and select/1 sequences. A normal application would either use Mnesia or keep the continuation from being converted to external format.

    The actual behavior of compiled match specifications when recreated from @@ -3253,21 +3253,21 @@ to succeed even if keys are removed during the traversal. The keys for objects inserted or deleted during a traversal may or may not be returned by next/2 depending on the ordering of keys within the table and if -the key exists at the time next/2 is called.

    Example:

    clean_all_with_value(Table,X) ->
    -    safe_fixtable(Table,true),
    -    clean_all_with_value(Table,X,ets:first(Table)),
    -    safe_fixtable(Table,false).
    +the key exists at the time next/2 is called.

    Example:

    clean_all_with_value(Table,X) ->
    +    safe_fixtable(Table,true),
    +    clean_all_with_value(Table,X,ets:first(Table)),
    +    safe_fixtable(Table,false).
     
    -clean_all_with_value(Table,X,'$end_of_table') ->
    +clean_all_with_value(Table,X,'$end_of_table') ->
         true;
    -clean_all_with_value(Table,X,Key) ->
    -    case ets:lookup(Table,Key) of
    -        [{Key,X}] ->
    -            ets:delete(Table,Key);
    +clean_all_with_value(Table,X,Key) ->
    +    case ets:lookup(Table,Key) of
    +        [{Key,X}] ->
    +            ets:delete(Table,Key);
             _ ->
                 true
         end,
    -    clean_all_with_value(Table,X,ets:next(Table,Key)).

    Notice that deleted objects are not freed from a fixed table until it has been + clean_all_with_value(Table,X,ets:next(Table,Key)).

    Notice that deleted objects are not freed from a fixed table until it has been released. If a process fixes a table but never releases it, the memory used by the deleted objects is never freed. The performance of operations on the table also degrades significantly.

    To retrieve information about which processes have fixed which tables, use @@ -3355,7 +3355,7 @@ a list, so that the following code:

    ets:select(Table,[{{'$1','$2','$3'},[],['$$']}])

    gives the same output as:

    ets:select(Table,[{{'$1','$2','$3'},[],[['$1','$2','$3']]}])

    That is, all the bound variables in the match head as a list. If tuples are to be constructed, one has to write a tuple of arity 1 where the single element in the tuple is the tuple one wants to construct (as an ordinary tuple can be -mistaken for a Guard).

    Therefore the following call:

    ets:select(Table,[{{'$1','$2','$1'},[],['$_']}])

    gives the same output as:

    ets:select(Table,[{{'$1','$2','$1'},[],[{{'$1','$2','$3'}}]}])

    This syntax is equivalent to the syntax used in the trace patterns (see the +mistaken for a Guard).

    Therefore the following call:

    ets:select(Table,[{{'$1','$2','$1'},[],['$_']}])

    gives the same output as:

    ets:select(Table,[{{'$1','$2','$1'},[],[{{'$1','$2','$3'}}]}])

    This syntax is equivalent to the syntax used in the trace patterns (see the dbg) module in Runtime_Tools.

    The Guards are constructed as tuples, where the first element is the test name and the remaining elements are the test parameters. To check for a specific type (say a list) of the element bound to the match variable '$1', one would write @@ -3516,16 +3516,16 @@ object. If not, select_replace will fail with badarg without updating any objects.

    For the moment, due to performance and semantic constraints, tables of type bag are not yet supported.

    The function returns the total number of replaced objects.

    Example

    For all 2-tuples with a list in second position, add atom 'marker' first in -the list:

    1> T = ets:new(x,[]), ets:insert(T, {key, [1, 2, 3]}).
    +the list:

    1> T = ets:new(x,[]), ets:insert(T, {key, [1, 2, 3]}).
     true
    -2> MS = ets:fun2ms(fun({K, L}) when is_list(L) -> {K, [marker | L]} end).
    -[{{'$1','$2'},[{is_list,'$2'}],[{{'$1',[marker|'$2']}}]}]
    -3> ets:select_replace(T, MS).
    +2> MS = ets:fun2ms(fun({K, L}) when is_list(L) -> {K, [marker | L]} end).
    +[{{'$1','$2'},[{is_list,'$2'}],[{{'$1',[marker|'$2']}}]}]
    +3> ets:select_replace(T, MS).
     1
    -4> ets:tab2list(T).
    -[{key,[marker,1,2,3]}]

    A generic single object compare-and-swap operation:

    [Old] = ets:lookup(T, Key),
    -New = update_object(Old),
    -Success = (1 =:= ets:select_replace(T, [{Old, [], [{const, New}]}])),
    +4>
    ets:tab2list(T). +[{key,[marker,1,2,3]}]

    A generic single object compare-and-swap operation:

    [Old] = ets:lookup(T, Key),
    +New = update_object(Old),
    +Success = (1 =:= ets:select_replace(T, [{Old, [], [{const, New}]}])),
    @@ -3560,22 +3560,22 @@ ordered_set, the traversal of the table continues to objects with keys earlier in the Erlang term order. The returned list also contains objects with keys in reverse order. For all other table types, the behavior is exactly that of -select/1.

    Example:

    1> T = ets:new(x,[ordered_set]).
    -2> [ ets:insert(T,{N}) || N <- lists:seq(1,10) ].
    +select/1.

    Example:

    1> T = ets:new(x,[ordered_set]).
    +2> [ ets:insert(T,{N}) || N <- lists:seq(1,10) ].
     ...
    -3> {R0,C0} = ets:select_reverse(T,[{'_',[],['$_']}],4).
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/file_sorter.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/file_sorter.html	2025-05-10 20:19:22.049307772 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/file_sorter.html	2025-05-10 20:19:22.061307881 +0000
    @@ -195,35 +195,35 @@
     argument {value, Value}. This makes it easy to initiate the sequence of output
     functions with a value calculated by the input functions.

    As an example, consider sorting the terms on a disk log file. A function that reads chunks from the disk log and returns a list of binaries is used as input. -The results are collected in a list of terms.

    sort(Log) ->
    -    {ok, _} = disk_log:open([{name,Log}, {mode,read_only}]),
    -    Input = input(Log, start),
    -    Output = output([]),
    -    Reply = file_sorter:sort(Input, Output, {format,term}),
    -    ok = disk_log:close(Log),
    +The results are collected in a list of terms.

    sort(Log) ->
    +    {ok, _} = disk_log:open([{name,Log}, {mode,read_only}]),
    +    Input = input(Log, start),
    +    Output = output([]),
    +    Reply = file_sorter:sort(Input, Output, {format,term}),
    +    ok = disk_log:close(Log),
         Reply.
     
    -input(Log, Cont) ->
    -    fun(close) ->
    +input(Log, Cont) ->
    +    fun(close) ->
                 ok;
    -       (read) ->
    -            case disk_log:chunk(Log, Cont) of
    -                {error, Reason} ->
    -                    {error, Reason};
    -                {Cont2, Terms} ->
    -                    {Terms, input(Log, Cont2)};
    -                {Cont2, Terms, _Badbytes} ->
    -                    {Terms, input(Log, Cont2)};
    +       (read) ->
    +            case disk_log:chunk(Log, Cont) of
    +                {error, Reason} ->
    +                    {error, Reason};
    +                {Cont2, Terms} ->
    +                    {Terms, input(Log, Cont2)};
    +                {Cont2, Terms, _Badbytes} ->
    +                    {Terms, input(Log, Cont2)};
                     eof ->
                         end_of_input
                 end
         end.
     
    -output(L) ->
    -    fun(close) ->
    -            lists:append(lists:reverse(L));
    -       (Terms) ->
    -            output([Terms | L])
    +output(L) ->
    +    fun(close) ->
    +            lists:append(lists:reverse(L));
    +       (Terms) ->
    +            output([Terms | L])
         end.

    For more examples of functions as input and output, see the end of the file_sorter module; the term format is implemented with functions.

    The possible values of Reason returned when an error occurs are:

    • bad_object, {bad_object, FileName} - Applying the format function failed for some binary, or the key(s) could not be extracted from some term.
    • {bad_term, FileName} - io:read/2 failed to read some term.
    • {file_error, FileName, file:posix()} - For an explanation of @@ -1914,7 +1914,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/filelib.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/filelib.html 2025-05-10 20:19:22.089308134 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/filelib.html 2025-05-10 20:19:22.097308207 +0000 @@ -1030,15 +1030,15 @@

      Sanitizes the relative path by eliminating ".." and "." components to protect against directory traversal attacks.

      Either returns the sanitized path name, or the atom unsafe if the path is unsafe. -The path is considered unsafe in the following circumstances:

      • The path is not relative.
      • A ".." component would climb up above the root of the relative path.
      • A symbolic link in the path points above the root of the relative path.

      Examples:

      1> {ok, Cwd} = file:get_cwd().
      +The path is considered unsafe in the following circumstances:

      • The path is not relative.
      • A ".." component would climb up above the root of the relative path.
      • A symbolic link in the path points above the root of the relative path.

      Examples:

      1> {ok, Cwd} = file:get_cwd().
       ...
      -2> filelib:safe_relative_path("dir/sub_dir/..", Cwd).
      +2> filelib:safe_relative_path("dir/sub_dir/..", Cwd).
       "dir"
      -3> filelib:safe_relative_path("dir/..", Cwd).
      -[]
      -4> filelib:safe_relative_path("dir/../..", Cwd).
      +3> filelib:safe_relative_path("dir/..", Cwd).
      +[]
      +4> filelib:safe_relative_path("dir/../..", Cwd).
       unsafe
      -5> filelib:safe_relative_path("/abs/path", Cwd).
      +5> filelib:safe_relative_path("/abs/path", Cwd).
       unsafe
    @@ -1138,7 +1138,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/filename.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/filename.html 2025-05-10 20:19:22.129308496 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/filename.html 2025-05-10 20:19:22.141308606 +0000 @@ -526,20 +526,20 @@

    Converts a relative Filename and returns an absolute name. No attempt is made to create the shortest absolute name, as this can give incorrect results on file -systems that allow links.

    Unix examples:

    1> pwd().
    +systems that allow links.

    Unix examples:

    1> pwd().
     "/usr/local"
    -2> filename:absname("foo").
    +2> filename:absname("foo").
     "/usr/local/foo"
    -3> filename:absname("../x").
    +3> filename:absname("../x").
     "/usr/local/../x"
    -4> filename:absname("/").
    -"/"

    Windows examples:

    1> pwd().
    +4> filename:absname("/").
    +"/"

    Windows examples:

    1> pwd().
     "D:/usr/local"
    -2> filename:absname("foo").
    +2> filename:absname("foo").
     "D:/usr/local/foo"
    -3> filename:absname("../x").
    +3> filename:absname("../x").
     "D:/usr/local/../x"
    -4> filename:absname("/").
    +4> filename:absname("/").
     "D:/"
    @@ -679,58 +679,58 @@ Opts the function will default to the native option, that is 'linux', 'darwin' or 'windows', as understood by os:type/0. Anything not recognized as 'darwin' or 'windows' is interpreted as 'linux'.

    The options 'author' and 'version' are only used with 'windows' option -mode.

    • user_cache

      The path location is intended for transient data files on a local machine.

      On Linux: Respects the os environment variable XDG_CACHE_HOME.

      1> filename:basedir(user_cache, "my_application", #{os=>linux}).
      -"/home/otptest/.cache/my_application"

      On Darwin:

      1> filename:basedir(user_cache, "my_application", #{os=>darwin}).
      -"/home/otptest/Library/Caches/my_application"

      On Windows:

      1> filename:basedir(user_cache, "My App").
      +mode.

      • user_cache

        The path location is intended for transient data files on a local machine.

        On Linux: Respects the os environment variable XDG_CACHE_HOME.

        1> filename:basedir(user_cache, "my_application", #{os=>linux}).
        +"/home/otptest/.cache/my_application"

        On Darwin:

        1> filename:basedir(user_cache, "my_application", #{os=>darwin}).
        +"/home/otptest/Library/Caches/my_application"

        On Windows:

        1> filename:basedir(user_cache, "My App").
         "c:/Users/otptest/AppData/Local/My App/Cache"
        -2> filename:basedir(user_cache, "My App").
        +2> filename:basedir(user_cache, "My App").
         "c:/Users/otptest/AppData/Local/My App/Cache"
        -3> filename:basedir(user_cache, "My App", #{author=>"Erlang"}).
        +3> filename:basedir(user_cache, "My App", #{author=>"Erlang"}).
         "c:/Users/otptest/AppData/Local/Erlang/My App/Cache"
        -4> filename:basedir(user_cache, "My App", #{version=>"1.2"}).
        +4> filename:basedir(user_cache, "My App", #{version=>"1.2"}).
         "c:/Users/otptest/AppData/Local/My App/1.2/Cache"
        -5> filename:basedir(user_cache, "My App", #{author=>"Erlang",version=>"1.2"}).
        -"c:/Users/otptest/AppData/Local/Erlang/My App/1.2/Cache"
      • user_config

        The path location is intended for persistent configuration files.

        On Linux: Respects the os environment variable XDG_CONFIG_HOME.

        2> filename:basedir(user_config, "my_application", #{os=>linux}).
        -"/home/otptest/.config/my_application"

        On Darwin:

        2> filename:basedir(user_config, "my_application", #{os=>darwin}).
        -"/home/otptest/Library/Application Support/my_application"

        On Windows:

        1> filename:basedir(user_config, "My App").
        +5> filename:basedir(user_cache, "My App", #{author=>"Erlang",version=>"1.2"}).
        +"c:/Users/otptest/AppData/Local/Erlang/My App/1.2/Cache"
      • user_config

        The path location is intended for persistent configuration files.

        On Linux: Respects the os environment variable XDG_CONFIG_HOME.

        2> filename:basedir(user_config, "my_application", #{os=>linux}).
        +"/home/otptest/.config/my_application"

        On Darwin:

        2> filename:basedir(user_config, "my_application", #{os=>darwin}).
        +"/home/otptest/Library/Application Support/my_application"

        On Windows:

        1> filename:basedir(user_config, "My App").
         "c:/Users/otptest/AppData/Roaming/My App"
        -2> filename:basedir(user_config, "My App", #{author=>"Erlang", version=>"1.2"}).
        -"c:/Users/otptest/AppData/Roaming/Erlang/My App/1.2"
      • user_data

        The path location is intended for persistent data files.

        On Linux: Respects the os environment variable XDG_DATA_HOME.

        3> filename:basedir(user_data, "my_application", #{os=>linux}).
        -"/home/otptest/.local/my_application"

        On Darwin:

        3> filename:basedir(user_data, "my_application", #{os=>darwin}).
        -"/home/otptest/Library/Application Support/my_application"

        On Windows:

        8> filename:basedir(user_data, "My App").
        +2> filename:basedir(user_config, "My App", #{author=>"Erlang", version=>"1.2"}).
        +"c:/Users/otptest/AppData/Roaming/Erlang/My App/1.2"
      • user_data

        The path location is intended for persistent data files.

        On Linux: Respects the os environment variable XDG_DATA_HOME.

        3> filename:basedir(user_data, "my_application", #{os=>linux}).
        +"/home/otptest/.local/my_application"

        On Darwin:

        3> filename:basedir(user_data, "my_application", #{os=>darwin}).
        +"/home/otptest/Library/Application Support/my_application"

        On Windows:

        8> filename:basedir(user_data, "My App").
         "c:/Users/otptest/AppData/Local/My App"
        -9> filename:basedir(user_data, "My App",#{author=>"Erlang",version=>"1.2"}).
        -"c:/Users/otptest/AppData/Local/Erlang/My App/1.2"
      • user_log

        The path location is intended for transient log files on a local machine.

        On Linux: Respects the os environment variable XDG_CACHE_HOME.

        4> filename:basedir(user_log, "my_application", #{os=>linux}).
        -"/home/otptest/.cache/my_application/log"

        On Darwin:

        4> filename:basedir(user_log, "my_application", #{os=>darwin}).
        -"/home/otptest/Library/Logs/my_application"

        On Windows:

        12> filename:basedir(user_log, "My App").
        +9> filename:basedir(user_data, "My App",#{author=>"Erlang",version=>"1.2"}).
        +"c:/Users/otptest/AppData/Local/Erlang/My App/1.2"
      • user_log

        The path location is intended for transient log files on a local machine.

        On Linux: Respects the os environment variable XDG_CACHE_HOME.

        4> filename:basedir(user_log, "my_application", #{os=>linux}).
        +"/home/otptest/.cache/my_application/log"

        On Darwin:

        4> filename:basedir(user_log, "my_application", #{os=>darwin}).
        +"/home/otptest/Library/Logs/my_application"

        On Windows:

        12> filename:basedir(user_log, "My App").
         "c:/Users/otptest/AppData/Local/My App/Logs"
        -13> filename:basedir(user_log, "My App",#{author=>"Erlang",version=>"1.2"}).
        -"c:/Users/otptest/AppData/Local/Erlang/My App/1.2/Logs"
      • site_config

        On Linux: Respects the os environment variable XDG_CONFIG_DIRS.

        5> filename:basedir(site_config, "my_application", #{os=>linux}).
        -["/usr/local/share/my_application",
        - "/usr/share/my_application"]
        -6> os:getenv("XDG_CONFIG_DIRS").
        +13> filename:basedir(user_log, "My App",#{author=>"Erlang",version=>"1.2"}).
        +"c:/Users/otptest/AppData/Local/Erlang/My App/1.2/Logs"
      • site_config

        On Linux: Respects the os environment variable XDG_CONFIG_DIRS.

        5> filename:basedir(site_config, "my_application", #{os=>linux}).
        +["/usr/local/share/my_application",
        + "/usr/share/my_application"]
        +6> os:getenv("XDG_CONFIG_DIRS").
         "/etc/xdg/xdg-ubuntu:/usr/share/upstart/xdg:/etc/xdg"
        -7> filename:basedir(site_config, "my_application", #{os=>linux}).
        -["/etc/xdg/xdg-ubuntu/my_application",
        +7> filename:basedir(site_config, "my_application", #{os=>linux}).
        +["/etc/xdg/xdg-ubuntu/my_application",
          "/usr/share/upstart/xdg/my_application",
        - "/etc/xdg/my_application"]
        -8> os:unsetenv("XDG_CONFIG_DIRS").
        + "/etc/xdg/my_application"]
        +8> os:unsetenv("XDG_CONFIG_DIRS").
         true
        -9> filename:basedir(site_config, "my_application", #{os=>linux}).
        -["/etc/xdg/my_application"]

        On Darwin:

        5> filename:basedir(site_config, "my_application", #{os=>darwin}).
        -["/Library/Application Support/my_application"]
      • site_data

        On Linux: Respects the os environment variable XDG_DATA_DIRS.

        10> os:getenv("XDG_DATA_DIRS").
        +9> filename:basedir(site_config, "my_application", #{os=>linux}).
        +["/etc/xdg/my_application"]

        On Darwin:

        5> filename:basedir(site_config, "my_application", #{os=>darwin}).
        +["/Library/Application Support/my_application"]
      • site_data

        On Linux: Respects the os environment variable XDG_DATA_DIRS.

        10> os:getenv("XDG_DATA_DIRS").
         "/usr/share/ubuntu:/usr/share/gnome:/usr/local/share/:/usr/share/"
        -11> filename:basedir(site_data, "my_application", #{os=>linux}).
        -["/usr/share/ubuntu/my_application",
        +11> filename:basedir(site_data, "my_application", #{os=>linux}).
        +["/usr/share/ubuntu/my_application",
          "/usr/share/gnome/my_application",
          "/usr/local/share/my_application",
        - "/usr/share/my_application"]
        -12> os:unsetenv("XDG_DATA_DIRS").
        + "/usr/share/my_application"]
        +12> os:unsetenv("XDG_DATA_DIRS").
         true
        -13> filename:basedir(site_data, "my_application", #{os=>linux}).
        -["/usr/local/share/my_application",
        - "/usr/share/my_application"]

        On Darwin:

        5> filename:basedir(site_data, "my_application", #{os=>darwin}).
        -["/Library/Application Support/my_application"]
      +13>
      filename:basedir(site_data, "my_application", #{os=>linux}). +["/usr/local/share/my_application", + "/usr/share/my_application"]

      On Darwin:

      5> filename:basedir(site_data, "my_application", #{os=>darwin}).
      +["/Library/Application Support/my_application"]
    @@ -759,12 +759,12 @@

    Returns the last component of Filename, or Filename itself if it does not -contain any directory separators.

    Examples:

    5> filename:basename("foo").
    +contain any directory separators.

    Examples:

    5> filename:basename("foo").
     "foo"
    -6> filename:basename("/usr/foo").
    +6> filename:basename("/usr/foo").
     "foo"
    -7> filename:basename("/").
    -[]
    +7>
    filename:basename("/"). +[]
    @@ -795,15 +795,15 @@

    Returns the last component of Filename with extension Ext stripped.

    This function is to be used to remove a (possible) specific extension. To remove an existing extension when you are unsure which one it is, use -rootname(basename(Filename)).

    Examples:

    8> filename:basename("~/src/kalle.erl", ".erl").
    +rootname(basename(Filename)).

    Examples:

    8> filename:basename("~/src/kalle.erl", ".erl").
     "kalle"
    -9> filename:basename("~/src/kalle.beam", ".erl").
    +9> filename:basename("~/src/kalle.beam", ".erl").
     "kalle.beam"
    -10> filename:basename("~/src/kalle.old.erl", ".erl").
    +10> filename:basename("~/src/kalle.old.erl", ".erl").
     "kalle.old"
    -11> filename:rootname(filename:basename("~/src/kalle.erl")).
    +11> filename:rootname(filename:basename("~/src/kalle.erl")).
     "kalle"
    -12> filename:rootname(filename:basename("~/src/kalle.beam")).
    +12> filename:rootname(filename:basename("~/src/kalle.beam")).
     "kalle"
    @@ -832,10 +832,10 @@ -

    Returns the directory part of Filename.

    Examples:

    13> filename:dirname("/usr/src/kalle.erl").
    +

    Returns the directory part of Filename.

    Examples:

    13> filename:dirname("/usr/src/kalle.erl").
     "/usr/src"
    -14> filename:dirname("kalle.erl").
    -"."
    5> filename:dirname("\\usr\\src/kalle.erl"). % Windows
    +14> filename:dirname("kalle.erl").
    +"."
    5> filename:dirname("\\usr\\src/kalle.erl"). % Windows
     "/usr/src"
    @@ -865,10 +865,10 @@

    Returns the file extension of Filename, including the period. Returns an empty -string if no extension exists.

    Examples:

    15> filename:extension("foo.erl").
    +string if no extension exists.

    Examples:

    15> filename:extension("foo.erl").
     ".erl"
    -16> filename:extension("beam.src/kalle").
    -[]
    +16>
    filename:extension("beam.src/kalle"). +[]
    @@ -928,10 +928,10 @@

    Joins a list of filename Components with directory separators. If one of the elements of Components includes an absolute path, such as "/xxx", the preceding elements, if any, are removed from the result.

    The result is "normalized":

    • Redundant directory separators are removed.
    • In Windows, all directory separators are forward slashes and the drive letter -is in lower case.

    Examples:

    17> filename:join(["/usr", "local", "bin"]).
    +is in lower case.

    Examples:

    17> filename:join(["/usr", "local", "bin"]).
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gb_sets.html differs (HTML document, UTF-8 Unicode text)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gb_sets.html	2025-05-10 20:19:22.173308896 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gb_sets.html	2025-05-10 20:19:22.185309004 +0000
    @@ -2076,7 +2076,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gb_trees.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gb_trees.html 2025-05-10 20:19:22.217309295 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gb_trees.html 2025-05-10 20:19:22.225309368 +0000 @@ -1609,7 +1609,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gen_event.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gen_event.html 2025-05-10 20:19:22.273309803 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gen_event.html 2025-05-10 20:19:22.297310020 +0000 @@ -1303,15 +1303,15 @@ but it may transform some values.

    Two possible use cases for this callback is to remove sensitive information from the state to prevent it from being printed in log files, or to compact large irrelevant status items -that would only clutter the logs.

    Example:

    format_status(Status) ->
    -  maps:map(
    -    fun(state,State) ->
    -            maps:remove(private_key, State);
    -       (message,{password, _Pass}) ->
    -            {password, removed};
    -       (_,Value) ->
    +that would only clutter the logs.

    Example:

    format_status(Status) ->
    +  maps:map(
    +    fun(state,State) ->
    +            maps:remove(private_key, State);
    +       (message,{password, _Pass}) ->
    +            {password, removed};
    +       (_,Value) ->
                 Value
    -    end, Status).

    Note

    This callback is optional, so event handler modules need not export it. + end, Status).

    Note

    This callback is optional, so event handler modules need not export it. If a handler does not export this function, the gen_event module uses the handler state directly for the purposes described below.

    If this callback is exported but fails, to hide possibly sensitive data, the default function will instead return the fact that @@ -2992,7 +2992,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gen_fsm.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gen_fsm.html 2025-05-10 20:19:22.345310455 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gen_fsm.html 2025-05-10 20:19:22.365310637 +0000 @@ -135,163 +135,163 @@ Migration to gen_statem

    Here follows a simple example of turning a gen_fsm into a gen_statem. -The example comes from the previous User's Guide for gen_fsm

    -module(code_lock).
    --define(NAME, code_lock).
    +The example comes from the previous User's Guide for gen_fsm

    -module(code_lock).
    +-define(NAME, code_lock).
     %-define(BEFORE_REWRITE, true).
     
    --ifdef(BEFORE_REWRITE).
    --behaviour(gen_fsm).
    +-ifdef(BEFORE_REWRITE).
    +-behaviour(gen_fsm).
     -else.
    --behaviour(gen_statem).
    +-behaviour(gen_statem).
     -endif.
     
    --export([start_link/1, button/1, stop/0]).
    +-export([start_link/1, button/1, stop/0]).
     
    --ifdef(BEFORE_REWRITE).
    --export([init/1, locked/2, open/2, handle_sync_event/4, handle_event/3,
    -     handle_info/3, terminate/3, code_change/4]).
    +-ifdef(BEFORE_REWRITE).
    +-export([init/1, locked/2, open/2, handle_sync_event/4, handle_event/3,
    +     handle_info/3, terminate/3, code_change/4]).
     -else.
    --export([init/1, callback_mode/0, locked/3, open/3,
    -     terminate/3, code_change/4]).
    +-export([init/1, callback_mode/0, locked/3, open/3,
    +     terminate/3, code_change/4]).
     %% Add callback__mode/0
     %% Change arity of the state functions
     %% Remove handle_info/3
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -start_link(Code) ->
    -    gen_fsm:start_link({local, ?NAME}, ?MODULE, Code, []).
    +-ifdef(BEFORE_REWRITE).
    +start_link(Code) ->
    +    gen_fsm:start_link({local, ?NAME}, ?MODULE, Code, []).
     -else.
    -start_link(Code) ->
    -    gen_statem:start_link({local,?NAME}, ?MODULE, Code, []).
    +start_link(Code) ->
    +    gen_statem:start_link({local,?NAME}, ?MODULE, Code, []).
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -button(Digit) ->
    -    gen_fsm:send_event(?NAME, {button, Digit}).
    +-ifdef(BEFORE_REWRITE).
    +button(Digit) ->
    +    gen_fsm:send_event(?NAME, {button, Digit}).
     -else.
    -button(Digit) ->
    -    gen_statem:cast(?NAME, {button,Digit}).
    +button(Digit) ->
    +    gen_statem:cast(?NAME, {button,Digit}).
         %% send_event is asynchronous and becomes a cast
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -stop() ->
    -    gen_fsm:sync_send_all_state_event(?NAME, stop).
    +-ifdef(BEFORE_REWRITE).
    +stop() ->
    +    gen_fsm:sync_send_all_state_event(?NAME, stop).
     -else.
    -stop() ->
    -    gen_statem:call(?NAME, stop).
    +stop() ->
    +    gen_statem:call(?NAME, stop).
         %% sync_send is synchronous and becomes call
         %% all_state is handled by callback code in gen_statem
     -endif.
     
    -init(Code) ->
    -    do_lock(),
    -    Data = #href_anchor"ss">code => Code, remaining => Code},
    -    {ok, locked, Data}.
    +init(Code) ->
    +    do_lock(),
    +    Data = #href_anchor"ss">code => Code, remaining => Code},
    +    {ok, locked, Data}.
     
    --ifdef(BEFORE_REWRITE).
    +-ifdef(BEFORE_REWRITE).
     -else.
    -callback_mode() ->
    +callback_mode() ->
         state_functions.
     %% state_functions mode is the mode most similar to
     %% gen_fsm. There is also handle_event mode which is
     %% a fairly different concept.
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -locked({button, Digit}, Data0) ->
    -    case analyze_lock(Digit, Data0) of
    -    {open = StateName, Data} ->
    -        {next_state, StateName, Data, 10000};
    -    {StateName, Data} ->
    -        {next_state, StateName, Data}
    +-ifdef(BEFORE_REWRITE).
    +locked({button, Digit}, Data0) ->
    +    case analyze_lock(Digit, Data0) of
    +    {open = StateName, Data} ->
    +        {next_state, StateName, Data, 10000};
    +    {StateName, Data} ->
    +        {next_state, StateName, Data}
         end.
     -else.
    -locked(cast, {button,Digit}, Data0) ->
    -    case analyze_lock(Digit, Data0) of
    -    {open = StateName, Data} ->
    -        {next_state, StateName, Data, 10000};
    -    {StateName, Data} ->
    -        {next_state, StateName, Data}
    +locked(cast, {button,Digit}, Data0) ->
    +    case analyze_lock(Digit, Data0) of
    +    {open = StateName, Data} ->
    +        {next_state, StateName, Data, 10000};
    +    {StateName, Data} ->
    +        {next_state, StateName, Data}
         end;
    -locked({call, From}, Msg, Data) ->
    -    handle_call(From, Msg, Data);
    -locked({info, Msg}, StateName, Data) ->
    -    handle_info(Msg, StateName, Data).
    +locked({call, From}, Msg, Data) ->
    +    handle_call(From, Msg, Data);
    +locked({info, Msg}, StateName, Data) ->
    +    handle_info(Msg, StateName, Data).
     %% Arity differs
     %% All state events are dispatched to handle_call and handle_info help
     %% functions. If you want to handle a call or cast event specifically
     %% for this state you would add a special clause for it above.
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -open(timeout, State) ->
    -     do_lock(),
    -    {next_state, locked, State};
    -open({button,_}, Data) ->
    -    {next_state, locked, Data}.
    +-ifdef(BEFORE_REWRITE).
    +open(timeout, State) ->
    +     do_lock(),
    +    {next_state, locked, State};
    +open({button,_}, Data) ->
    +    {next_state, locked, Data}.
     -else.
    -open(timeout, _, Data) ->
    -    do_lock(),
    -    {next_state, locked, Data};
    -open(cast, {button,_}, Data) ->
    -    {next_state, locked, Data};
    -open({call, From}, Msg, Data) ->
    -    handle_call(From, Msg, Data);
    -open(info, Msg, Data) ->
    -    handle_info(Msg, open, Data).
    +open(timeout, _, Data) ->
    +    do_lock(),
    +    {next_state, locked, Data};
    +open(cast, {button,_}, Data) ->
    +    {next_state, locked, Data};
    +open({call, From}, Msg, Data) ->
    +    handle_call(From, Msg, Data);
    +open(info, Msg, Data) ->
    +    handle_info(Msg, open, Data).
     %% Arity differs
     %% All state events are dispatched to handle_call and handle_info help
     %% functions. If you want to handle a call or cast event specifically
     %% for this state you would add a special clause for it above.
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -handle_sync_event(stop, _From, _StateName, Data) ->
    -    {stop, normal, ok, Data}.
    +-ifdef(BEFORE_REWRITE).
    +handle_sync_event(stop, _From, _StateName, Data) ->
    +    {stop, normal, ok, Data}.
     
    -handle_event(Event, StateName, Data) ->
    -    {stop, {shutdown, {unexpected, Event, StateName}}, Data}.
    +handle_event(Event, StateName, Data) ->
    +    {stop, {shutdown, {unexpected, Event, StateName}}, Data}.
     
    -handle_info(Info, StateName, Data) ->
    -    {stop, {shutdown, {unexpected, Info, StateName}}, StateName, Data}.
    +handle_info(Info, StateName, Data) ->
    +    {stop, {shutdown, {unexpected, Info, StateName}}, StateName, Data}.
     -else.
     -endif.
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gen_server.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gen_server.html	2025-05-10 20:19:22.421311145 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gen_server.html	2025-05-10 20:19:22.441311325 +0000
    @@ -1279,15 +1279,15 @@
     but it may transform some values.

    Two possible use cases for this callback is to remove sensitive information from the state to prevent it from being printed in log files, or to compact large irrelevant status items -that would only clutter the logs.

    Example:

    format_status(Status) ->
    -  maps:map(
    -    fun(state,State) ->
    -            maps:remove(private_key, State);
    -       (message,{password, _Pass}) ->
    -            {password, removed};
    -       (_,Value) ->
    +that would only clutter the logs.

    Example:

    format_status(Status) ->
    +  maps:map(
    +    fun(state,State) ->
    +            maps:remove(private_key, State);
    +       (message,{password, _Pass}) ->
    +            {password, removed};
    +       (_,Value) ->
                 Value
    -    end, Status).

    Note

    This callback is optional, so callback modules need not export it. The + end, Status).

    Note

    This callback is optional, so callback modules need not export it. The gen_server module provides a default implementation of this function that returns the callback module state.

    If this callback is exported but fails, to hide possibly sensitive data, @@ -3008,7 +3008,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gen_statem.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gen_statem.html 2025-05-10 20:19:22.513311979 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/gen_statem.html 2025-05-10 20:19:22.553312341 +0000 @@ -176,7 +176,7 @@ depending on callback mode Release upgrade/downgrade -(code change) +(code change) -----> Module:code_change/4

    State callback

    The state callback for a specific state in a gen_statem is the callback function that is called for all events in this state. It is selected depending on which callback mode @@ -302,97 +302,97 @@ Pushbutton Code -

    The following is the complete callback module file pushbutton.erl:

    -module(pushbutton).
    --behaviour(gen_statem).
    +

    The following is the complete callback module file pushbutton.erl:

    -module(pushbutton).
    +-behaviour(gen_statem).
     
    --export([start/0,push/0,get_count/0,stop/0]).
    --export([terminate/3,code_change/4,init/1,callback_mode/0]).
    --export([on/3,off/3]).
    +-export([start/0,push/0,get_count/0,stop/0]).
    +-export([terminate/3,code_change/4,init/1,callback_mode/0]).
    +-export([on/3,off/3]).
     
    -name() -> pushbutton_statem. % The registered server name
    +name() -> pushbutton_statem. % The registered server name
     
     %% API.  This example uses a registered name name()
     %% and does not link to the caller.
    -start() ->
    -    gen_statem:start({local,name()}, ?MODULE, [], []).
    -push() ->
    -    gen_statem:call(name(), push).
    -get_count() ->
    -    gen_statem:call(name(), get_count).
    -stop() ->
    -    gen_statem:stop(name()).
    +start() ->
    +    gen_statem:start({local,name()}, ?MODULE, [], []).
    +push() ->
    +    gen_statem:call(name(), push).
    +get_count() ->
    +    gen_statem:call(name(), get_count).
    +stop() ->
    +    gen_statem:stop(name()).
     
     %% Mandatory callback functions
    -terminate(_Reason, _State, _Data) ->
    +terminate(_Reason, _State, _Data) ->
         void.
    -code_change(_Vsn, State, Data, _Extra) ->
    -    {ok,State,Data}.
    -init([]) ->
    +code_change(_Vsn, State, Data, _Extra) ->
    +    {ok,State,Data}.
    +init([]) ->
         %% Set the initial state + data.  Data is used only as a counter.
         State = off, Data = 0,
    -    {ok,State,Data}.
    -callback_mode() -> state_functions.
    +    {ok,State,Data}.
    +callback_mode() -> state_functions.
     
     %%% state callback(s)
     
    -off({call,From}, push, Data) ->
    +off({call,From}, push, Data) ->
         %% Go to 'on', increment count and reply
         %% that the resulting status is 'on'
    -    {next_state,on,Data+1,[{reply,From,on}]};
    -off(EventType, EventContent, Data) ->
    -    handle_event(EventType, EventContent, Data).
    +    {next_state,on,Data+1,[{reply,From,on}]};
    +off(EventType, EventContent, Data) ->
    +    handle_event(EventType, EventContent, Data).
     
    -on({call,From}, push, Data) ->
    +on({call,From}, push, Data) ->
         %% Go to 'off' and reply that the resulting status is 'off'
    -    {next_state,off,Data,[{reply,From,off}]};
    -on(EventType, EventContent, Data) ->
    -    handle_event(EventType, EventContent, Data).
    +    {next_state,off,Data,[{reply,From,off}]};
    +on(EventType, EventContent, Data) ->
    +    handle_event(EventType, EventContent, Data).
     
     %% Handle events common to all states
    -handle_event({call,From}, get_count, Data) ->
    +handle_event({call,From}, get_count, Data) ->
         %% Reply with the current count
    -    {keep_state,Data,[{reply,From,Data}]};
    -handle_event(_, _, Data) ->
    +    {keep_state,Data,[{reply,From,Data}]};
    +handle_event(_, _, Data) ->
         %% Ignore all other events
    -    {keep_state,Data}.

    The following is a shell session when running it:

    1> pushbutton:start().
    -{ok,<0.36.0>}
    -2> pushbutton:get_count().
    +    {keep_state,Data}.

    The following is a shell session when running it:

    1> pushbutton:start().
    +{ok,<0.36.0>}
    +2> pushbutton:get_count().
     0
    -3> pushbutton:push().
    +3> pushbutton:push().
     on
    -4> pushbutton:get_count().
    +4> pushbutton:get_count().
     1
    -5> pushbutton:push().
    +5> pushbutton:push().
     off
    -6> pushbutton:get_count().
    +6> pushbutton:get_count().
     1
    -7> pushbutton:stop().
    +7> pushbutton:stop().
     ok
    -8> pushbutton:push().
    +8> pushbutton:push().
     ** exception exit: {noproc,{gen_statem,call,[pushbutton_statem,push,infinity]}}
          in function  gen:do_for_proc/2 (gen.erl, line 261)
          in call from gen_statem:call/3 (gen_statem.erl, line 386)

    To compare styles, here follows the same example using callback mode handle_event_function, or rather, the code to replace after function init/1 -of the pushbutton.erl example file above:

    callback_mode() -> handle_event_function.
    +of the pushbutton.erl example file above:

    callback_mode() -> handle_event_function.
     
     %%% state callback(s)
     
    -handle_event({call,From}, push, off, Data) ->
    +handle_event({call,From}, push, off, Data) ->
         %% Go to 'on', increment count and reply
         %% that the resulting status is 'on'
    -    {next_state,on,Data+1,[{reply,From,on}]};
    -handle_event({call,From}, push, on, Data) ->
    +    {next_state,on,Data+1,[{reply,From,on}]};
    +handle_event({call,From}, push, on, Data) ->
         %% Go to 'off' and reply that the resulting status is 'off'
    -    {next_state,off,Data,[{reply,From,off}]};
    +    {next_state,off,Data,[{reply,From,off}]};
     %%
     %% Event handling common to all states
    -handle_event({call,From}, get_count, State, Data) ->
    +handle_event({call,From}, get_count, State, Data) ->
         %% Reply with the current count
    -    {next_state,State,Data,[{reply,From,Data}]};
    -handle_event(_, _, State, Data) ->
    +    {next_state,State,Data,[{reply,From,Data}]};
    +handle_event(_, _, State, Data) ->
         %% Ignore all other events
    -    {next_state,State,Data}.

    Note

    + {next_state,State,Data}.

    Note

    @@ -3177,15 +3177,15 @@ containing the same keys as the input map, but it may transform some values.

    One use case for this function is to return compact alternative state representations to avoid having large state terms printed in log files. -Another is to hide sensitive data from being written to the error log.

    Example:

    format_status(Status) ->
    -  maps:map(
    -    fun(state,State) ->
    -            maps:remove(private_key, State);
    -       (message,{password, _Pass}) ->
    -            {password, removed};
    -       (_,Value) ->
    +Another is to hide sensitive data from being written to the error log.

    Example:

    format_status(Status) ->
    +  maps:map(
    +    fun(state,State) ->
    +            maps:remove(private_key, State);
    +       (message,{password, _Pass}) ->
    +            {password, removed};
    +       (_,Value) ->
                 Value
    -    end, Status).

    Note

    This callback is optional, so a callback module does not need + end, Status).

    Note

    This callback is optional, so a callback module does not need to export it. The gen_statem module provides a default implementation of this function that returns {State, Data}.

    If this callback is exported but fails, to hide possibly sensitive data, the default function will instead return {State, Info}, @@ -3359,8 +3359,8 @@ to initialize the implementation state and server data.

    Args is the Args argument provided to that start function.

    Note

    Note that if the gen_statem is started through proc_lib and enter_loop/4,5,6, this callback will never be called. Since this callback is not optional -it can in that case be implemented as:

    -spec init(_) -> no_return().
    -init(Args) -> erlang:error(not_implemented, [Args]).
    +it can in that case be implemented as:

    -spec init(_) -> no_return().
    +init(Args) -> erlang:error(not_implemented, [Args]).

    @@ -4793,7 +4793,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/introduction.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/introduction.html 2025-05-10 20:19:22.577312559 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/introduction.html 2025-05-10 20:19:22.581312595 +0000 @@ -189,7 +189,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/io.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/io.html 2025-05-10 20:19:22.633313066 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/io.html 2025-05-10 20:19:22.661313320 +0000 @@ -148,7 +148,7 @@ Error Information

    The ErrorInfo mentioned in this module is the standard ErrorInfo structure -that is returned from all I/O modules. It has the following format:

    {ErrorLocation, Module, ErrorDescriptor}

    A string that describes the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)
    +that is returned from all I/O modules. It has the following format:

    {ErrorLocation, Module, ErrorDescriptor}

    A string that describes the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)
    @@ -1189,12 +1189,12 @@ no IoDevice argument is specified in the function calls in this module.

    It is sometimes desirable to use an explicit IoDevice argument that refers to the default I/O device. This is the case with functions that can access either a file or the default I/O device. The atom standard_io has this -special meaning. The following example illustrates this:

    27> io:read('enter>').
    +special meaning. The following example illustrates this:

    27> io:read('enter>').
     enter>foo.
    -{ok,foo}
    -28> io:read(standard_io, 'enter>').
    +{ok,foo}
    +28> io:read(standard_io, 'enter>').
     enter>bar.
    -{ok,bar}

    By default all I/O sent to standard_io will end up in the user +{ok,bar}

    By default all I/O sent to standard_io will end up in the user I/O device of the node that spawned the calling process.

    standard_io is an alias for group_leader/0, so in order to change where the default input/output requests are sent you can change the group leader of the current process using @@ -1469,33 +1469,33 @@ whitespace characters are stripped. An Erlang string (list of characters) is returned.

    If Unicode translation is in effect (~ts), characters > 255 are accepted, otherwise not. With the translation modifier, the returned list can as a -consequence also contain integers > 255:

    1> io:fread("Prompt> ","~s").
    +consequence also contain integers > 255:

    1> io:fread("Prompt> ","~s").
     Prompt> <Characters beyond latin1 range not printable in this medium>
    -{error,{fread,string}}
    -2> io:fread("Prompt> ","~ts").
    +{error,{fread,string}}
    +2> io:fread("Prompt> ","~ts").
     Prompt> <Characters beyond latin1 range not printable in this medium>
    -{ok,[[1091,1085,1080,1094,1086,1076,1077]]}
  • a - Similar to s, but the resulting string is converted into an +{ok,[[1091,1085,1080,1094,1086,1076,1077]]}

  • a - Similar to s, but the resulting string is converted into an atom.

  • c - The number of characters equal to the field width are read (default is 1) and returned as an Erlang string. However, leading and trailing whitespace characters are not omitted as they are with s. All -characters are returned.

    The Unicode translation modifier works as with s:

    1> io:fread("Prompt> ","~c").
    +characters are returned.

    The Unicode translation modifier works as with s:

    1> io:fread("Prompt> ","~c").
     Prompt> <Character beyond latin1 range not printable in this medium>
    -{error,{fread,string}}
    -2> io:fread("Prompt> ","~tc").
    +{error,{fread,string}}
    +2> io:fread("Prompt> ","~tc").
     Prompt> <Character beyond latin1 range not printable in this medium>
    -{ok,[[1091]]}
  • l - Returns the number of characters that have been scanned up to that +{ok,[[1091]]}

  • l - Returns the number of characters that have been scanned up to that point, including whitespace characters.

  • The function returns:
    • {ok, Terms} - The read was successful and Terms is the list of successfully matched and read items.

    • eof - End of file was encountered.

    • {error, FreadError} - The reading failed and FreadError gives a hint about the error.

    • {error, ErrorDescription} - The read operation failed and parameter -ErrorDescription gives a hint about the error.

    Examples:

    20> io:fread('enter>', "~f~f~f").
    +ErrorDescription gives a hint about the error.

    Examples:

    20> io:fread('enter>', "~f~f~f").
     enter>1.9 35.5e3 15.0
    -{ok,[1.9,3.55e4,15.0]}
    -21> io:fread('enter>', "~10f~d").
    +{ok,[1.9,3.55e4,15.0]}
    +21> io:fread('enter>', "~10f~d").
     enter>     5.67899
    -{ok,[5.678,99]}
    -22> io:fread('enter>', ":~10s:~10c:").
    +{ok,[5.678,99]}
    +22> io:fread('enter>', ":~10s:~10c:").
     enter>:   alan   :   joe    :
    -{ok, ["alan", "   joe    "]}
    +
    {ok, ["alan", " joe "]}
    @@ -1584,7 +1584,7 @@ the output device, and control sequences for formatting, see below. If Format is an atom or a binary, it is first converted to a list with the aid of atom_to_list/1 or -binary_to_list/1. Example:

    1> io:fwrite("Hello world!~n", []).
    +binary_to_list/1. Example:

    1> io:fwrite("Hello world!~n", []).
     Hello world!
     ok

    The general format of a control sequence is ~F.P.PadModC.

    The character C determines the type of control sequence to be used. It is the only required field. All of F, P, Pad, and Mod are optional. For @@ -1602,25 +1602,25 @@ padding character is ' ' (space).

  • Mod is the control sequence modifier. This is one or more characters that change the interpretation of Data.

    The current modifiers are:

    • t - For Unicode translation.

    • l - For stopping p and P from detecting printable characters.

    • k - For use with p, P, w, and W to format maps in map-key ordered order (see maps:iterator_order/0).

    • K - Similar to k, for formatting maps in map-key order, but takes an -extra argument that specifies the maps:iterator_order/0.

      For example:

      > M = #{ a => 1, b => 2 }.
      -#{a => 1,b => 2}
      -> io:format("~Kp~n", [reversed, M]).
      -#{b => 2,a => 1}
      +extra argument that specifies the maps:iterator_order/0.

      For example:

      > M = #{ a => 1, b => 2 }.
      +#{a => 1,b => 2}
      +> io:format("~Kp~n", [reversed, M]).
      +#{b => 2,a => 1}
       ok
  • If F, P, or Pad is a * character, the next argument in Data is used as -the value. For example:

    1> io:fwrite("~*.*.0f~n",[9, 5, 3.14159265]).
    +the value. For example:

    1> io:fwrite("~*.*.0f~n",[9, 5, 3.14159265]).
     003.14159
    -ok

    To use a literal * character as Pad, it must be passed as an argument:

    2> io:fwrite("~*.*.*f~n",[9, 5, $*, 3.14159265]).
    +ok

    To use a literal * character as Pad, it must be passed as an argument:

    2> io:fwrite("~*.*.*f~n",[9, 5, $*, 3.14159265]).
     **3.14159
     ok

    Available control sequences:

    • ~ - Character ~ is written.

    • c - The argument is a number that is interpreted as an ASCII code. The precision is the number of times the character is printed and defaults to the -field width, which in turn defaults to 1. Example:

      1> io:fwrite("|~10.5c|~-10.5c|~5c|~n", [$a, $b, $c]).
      +field width, which in turn defaults to 1. Example:

      1> io:fwrite("|~10.5c|~-10.5c|~5c|~n", [$a, $b, $c]).
       |     aaaaa|bbbbb     |ccccc|
       ok

      If the Unicode translation modifier (t) is in effect, the integer argument can be any number representing a valid Unicode codepoint, otherwise it is to -be an integer less than or equal to 255, otherwise it is masked with 16#FF:

      2> io:fwrite("~tc~n",[1024]).
      -\x{400}
      +be an integer less than or equal to 255, otherwise it is masked with 16#FF:

      2> io:fwrite("~tc~n",[1024]).
      +\x{400}
       ok
      -3> io:fwrite("~c~n",[1024]).
      +3> io:fwrite("~c~n",[1024]).
       ^@
       ok
    • f - The argument is a float that is written as [-]ddd.ddd, where the precision is the number of digits after the decimal point. The default @@ -1638,18 +1638,18 @@ binaries are in UTF-8. The characters are printed without quotes. The string is first truncated by the specified precision and then padded and justified to the specified field width. The default precision is the field width.

      This format can be used for printing any object and truncating the output so -it fits a specified field:

      1> io:fwrite("|~10w|~n", [{hey, hey, hey}]).
      +it fits a specified field:

      1> io:fwrite("|~10w|~n", [{hey, hey, hey}]).
       |**********|
       ok
      -2> io:fwrite("|~10s|~n", [io_lib:write({hey, hey, hey})]).
      -|{hey,hey,h|
      -3> io:fwrite("|~-10.8s|~n", [io_lib:write({hey, hey, hey})]).
      -|{hey,hey  |
      +2> io:fwrite("|~10s|~n", [io_lib:write({hey, hey, hey})]).
      +|{hey,hey,h|
      +3> io:fwrite("|~-10.8s|~n", [io_lib:write({hey, hey, hey})]).
      +|{hey,hey  |
       ok

      A list with integers > 255 is considered an error if the Unicode translation -modifier is not specified:

      4> io:fwrite("~ts~n",[[1024]]).
      -\x{400}
      +modifier is not specified:

      4> io:fwrite("~ts~n",[[1024]]).
      +\x{400}
       ok
      -5> io:fwrite("~s~n",[[1024]]).
      +5> io:fwrite("~s~n",[[1024]]).
       ** exception error: bad argument
            in function  io:format/3
               called as io:format(<0.53.0>,"~s~n",[[1024]])
    • w - Writes data with the standard syntax. This is used to output Erlang @@ -1660,122 +1660,122 @@ breaks terms whose printed representation is longer than one line into many lines and indents each line sensibly. Left-justification is not supported. It also tries to detect flat lists of printable characters and output these as -strings. For example:

      1> T = [{attributes,[[{id,age,1.50000},{mode,explicit},
      -{typename,"INTEGER"}], [{id,cho},{mode,explicit},{typename,'Cho'}]]},
      -{typename,'Person'},{tag,{'PRIVATE',3}},{mode,implicit}].
      +strings. For example:

      1> T = [{attributes,[[{id,age,1.50000},{mode,explicit},
      +{typename,"INTEGER"}], [{id,cho},{mode,explicit},{typename,'Cho'}]]},
      +{typename,'Person'},{tag,{'PRIVATE',3}},{mode,implicit}].
       ...
      -2> io:fwrite("~w~n", [T]).
      -[{attributes,[[{id,age,1.5},{mode,explicit},{typename,
      -[73,78,84,69,71,69,82]}],[{id,cho},{mode,explicit},{typena
      -me,'Cho'}]]},{typename,'Person'},{tag,{'PRIVATE',3}},{mode
      -,implicit}]
      +2> io:fwrite("~w~n", [T]).
      +[{attributes,[[{id,age,1.5},{mode,explicit},{typename,
      +[73,78,84,69,71,69,82]}],[{id,cho},{mode,explicit},{typena
      +me,'Cho'}]]},{typename,'Person'},{tag,{'PRIVATE',3}},{mode
      +,implicit}]
       ok
      -3> io:fwrite("~62p~n", [T]).
      -[{attributes,[[{id,age,1.5},
      -               {mode,explicit},
      -               {typename,"INTEGER"}],
      -              [{id,cho},{mode,explicit},{typename,'Cho'}]]},
      - {typename,'Person'},
      - {tag,{'PRIVATE',3}},
      - {mode,implicit}]
      +3> io:fwrite("~62p~n", [T]).
      +[{attributes,[[{id,age,1.5},
      +               {mode,explicit},
      +               {typename,"INTEGER"}],
      +              [{id,cho},{mode,explicit},{typename,'Cho'}]]},
      + {typename,'Person'},
      + {tag,{'PRIVATE',3}},
      + {mode,implicit}]
       ok

      The field width specifies the maximum line length. It defaults to 80. The precision specifies the initial indentation of the term. It defaults to the number of characters printed on this line in the same call to write/1 or -format/1,2,3. For example, using T above:

      4> io:fwrite("Here T = ~62p~n", [T]).
      -Here T = [{attributes,[[{id,age,1.5},
      -                        {mode,explicit},
      -                        {typename,"INTEGER"}],
      -                       [{id,cho},
      -                        {mode,explicit},
      -                        {typename,'Cho'}]]},
      -          {typename,'Person'},
      -          {tag,{'PRIVATE',3}},
      -          {mode,implicit}]
      +format/1,2,3. For example, using T above:

      4> io:fwrite("Here T = ~62p~n", [T]).
      /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/io_lib.html differs (HTML document, UTF-8 Unicode text, with very long lines)
      --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/io_lib.html	2025-05-10 20:19:22.709313756 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/io_lib.html	2025-05-10 20:19:22.709313756 +0000
      @@ -1032,8 +1032,8 @@
       input is needed to complete the original format string. RestFormat is the
       remaining format string, Nchars is the number of characters scanned, and
       InputStack is the reversed list of inputs matched up to that point.

    • {error, What} - The read operation failed and parameter What gives a -hint about the error.

    Example:

    3> io_lib:fread("~f~f~f", "15.6 17.3e-6 24.5").
    -{ok,[15.6,1.73e-5,24.5],[]}
    +hint about the error.

    Example:

    3> io_lib:fread("~f~f~f", "15.6 17.3e-6 24.5").
    +{ok,[15.6,1.73e-5,24.5],[]}
    @@ -1538,11 +1538,11 @@ "...".

    Depth defaults to -1, which means no limitation. Option CharsLimit puts a soft limit on the number of characters returned. When the number of characters is reached, remaining structures are replaced by "...". CharsLimit defaults to -1, -which means no limit on the number of characters returned.

    Example:

    1> lists:flatten(io_lib:write({1,[2],[3],[4,5],6,7,8,9})).
    +which means no limit on the number of characters returned.

    Example:

    1> lists:flatten(io_lib:write({1,[2],[3],[4,5],6,7,8,9})).
     "{1,[2],[3],[4,5],6,7,8,9}"
    -2> lists:flatten(io_lib:write({1,[2],[3],[4,5],6,7,8,9}, 5)).
    +2> lists:flatten(io_lib:write({1,[2],[3],[4,5],6,7,8,9}, 5)).
     "{1,[2],[3],[...],...}"
    -3> lists:flatten(io_lib:write({[1,2,3],[4,5],6,7,8,9}, [{chars_limit,20}])).
    +3> lists:flatten(io_lib:write({[1,2,3],[4,5],6,7,8,9}, [{chars_limit,20}])).
     "{[1,2|...],[4|...],...}"
    @@ -1811,7 +1811,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/io_protocol.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/io_protocol.html 2025-05-10 20:19:22.769314299 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/io_protocol.html 2025-05-10 20:19:22.769314299 +0000 @@ -146,8 +146,8 @@ Protocol Basics

    As described in Robert's paper, I/O servers and clients communicate using -io_request/io_reply tuples as follows:

    {io_request, From, ReplyAs, Request}
    -{io_reply, ReplyAs, Reply}

    The client sends an io_request tuple to the I/O server and the server +io_request/io_reply tuples as follows:

    {io_request, From, ReplyAs, Request}
    +{io_reply, ReplyAs, Reply}

    The client sends an io_request tuple to the I/O server and the server eventually sends a corresponding io_reply tuple.

    • From is the pid/0 of the client, the process which the I/O server sends the I/O reply to.

    • ReplyAs can be any datum and is returned in the corresponding io_reply. The io module monitors the I/O server and uses the monitor reference as @@ -164,8 +164,8 @@ Output Requests -

      To output characters on an I/O device, the following Requests exist:

      {put_chars, Encoding, Characters}
      -{put_chars, Encoding, Module, Function, Args}
      • Encoding is unicode or latin1, meaning that the characters are (in case +

        To output characters on an I/O device, the following Requests exist:

        {put_chars, Encoding, Characters}
        +{put_chars, Encoding, Module, Function, Args}
        • Encoding is unicode or latin1, meaning that the characters are (in case of binaries) encoded as UTF-8 or ISO Latin-1 (pure bytes). A well-behaved I/O server is also to return an error indication if list elements contain integers > 255 when Encoding is set to latin1.

          Notice that this does not in any way tell how characters are to be put on the @@ -191,7 +191,7 @@ Input Requests -

          To read characters from an I/O device, the following Requests exist:

          {get_until, Encoding, Prompt, Module, Function, ExtraArgs}
          • Encoding denotes how data is to be sent back to the client and what data is +

            To read characters from an I/O device, the following Requests exist:

            {get_until, Encoding, Prompt, Module, Function, ExtraArgs}
            • Encoding denotes how data is to be sent back to the client and what data is sent to the function denoted by Module/Function/ExtraArgs. If the function supplied returns data as a list, the data is converted to this encoding. If the function supplied returns data in some other format, no @@ -207,8 +207,8 @@ nothing being written to the I/O device).

            • Module, Function, and ExtraArgs denote a function and arguments to determine when enough data is written. The function is to take two more arguments, the last state, and a list of characters. The function is to return -one of:

              {done, Result, RestChars}
              -{more, Continuation}

              Result can be any Erlang term, but if it is a list/0, the I/O server can +one of:

              {done, Result, RestChars}
              +{more, Continuation}

              Result can be any Erlang term, but if it is a list/0, the I/O server can convert it to a binary/0 of appropriate format before returning it to the client, if the I/O server is set in binary mode (see below).

              The function is called with the data the I/O server finds on its I/O device, returning one of:

              • {done, Result, RestChars} when enough data is read. In this case Result @@ -218,28 +218,28 @@ characters are available. When no more characters are available, the function must return {done, eof, Rest}. The initial state is the empty list. The data when an end of file is reached on the IO device is the atom eof.

                An emulation of the get_line request can be (inefficiently) implemented -using the following functions:

                -module(demo).
                --export([until_newline/3, get_line/1]).
                +using the following functions:

                -module(demo).
                +-export([until_newline/3, get_line/1]).
                 
                -until_newline(_ThisFar,eof,_MyStopCharacter) ->
                -    {done,eof,[]};
                -until_newline(ThisFar,CharList,MyStopCharacter) ->
                +until_newline(_ThisFar,eof,_MyStopCharacter) ->
                +    {done,eof,[]};
                +until_newline(ThisFar,CharList,MyStopCharacter) ->
                     case
                -        lists:splitwith(fun(X) -> X =/= MyStopCharacter end,  CharList)
                +        lists:splitwith(fun(X) -> X =/= MyStopCharacter end,  CharList)
                     of
                -  {L,[]} ->
                -            {more,ThisFar++L};
                -  {L2,[MyStopCharacter|Rest]} ->
                -      {done,ThisFar++L2++[MyStopCharacter],Rest}
                +  {L,[]} ->
                +            {more,ThisFar++L};
                +  {L2,[MyStopCharacter|Rest]} ->
                +      {done,ThisFar++L2++[MyStopCharacter],Rest}
                     end.
                 
                -get_line(IoServer) ->
                -    IoServer ! {io_request,
                -                self(),
                +get_line(IoServer) ->
                +    IoServer ! {io_request,
                +                self(),
                                 IoServer,
                -                {get_until, unicode, '', ?MODULE, until_newline, [$\n]}},
                +                {get_until, unicode, '', ?MODULE, until_newline, [$\n]}},
                     receive
                -        {io_reply, IoServer, Data} ->
                +        {io_reply, IoServer, Data} ->
                       Data
                     end.

                Notice that the last element in the Request tuple ([$\n]) is appended to the argument list when the function is called. The function is to be called @@ -277,10 +277,10 @@ must be able to handle binary data. For convenience, the modes of an I/O server can be set and retrieved using the following I/O requests:

                {setopts, Opts}
                • Opts is a list of options in the format recognized by the proplists module (and by the I/O server).

                As an example, the I/O server for the interactive shell (in group.erl) -understands the following options:

                {binary, boolean()} (or binary/list)
                -{echo, boolean()}
                -{expand_fun, fun()}
                -{encoding, unicode/latin1} (or unicode/latin1)

                Options binary and encoding are common for all I/O servers in OTP, while +understands the following options:

                {binary, boolean()} (or binary/list)
                +{echo, boolean()}
                +{expand_fun, fun()}
                +{encoding, unicode/latin1} (or unicode/latin1)

                Options binary and encoding are common for all I/O servers in OTP, while echo and expand are valid only for this I/O server. Option unicode notifies how characters are put on the physical I/O device, that is, if the terminal itself is Unicode-aware. It does not affect how characters are sent in @@ -303,9 +303,9 @@ continue until one of the requests results in an error or the list is consumed. The result of the last request is sent back to the client.

              The I/O server can, for a list of requests, send any of the following valid results in the reply, depending on the requests in the list:

              ok
              -{ok, Data}
              -{ok, Options}
              -{error, Error}

              +{ok, Data} +{ok, Options} +{error, Error}

    @@ -335,128 +335,128 @@ process handling incoming requests, usually both I/O-requests and other I/O device-specific requests (positioning, closing, and so on).

    The example I/O server stores characters in an ETS table, making up a fairly crude RAM file.

    The module begins with the usual directives, a function to start the I/O server -and a main loop handling the requests:

    -module(ets_io_server).
    +and a main loop handling the requests:

    -module(ets_io_server).
     
    --export([start_link/0, init/0, loop/1, until_newline/3, until_enough/3]).
    +-export([start_link/0, init/0, loop/1, until_newline/3, until_enough/3]).
     
    --define(CHARS_PER_REC, 10).
    +-define(CHARS_PER_REC, 10).
     
    --record(state, {
    +-record(state, {
     	  table,
     	  position, % absolute
     	  mode % binary | list
    -	 }).
    +	 }).
     
    -start_link() ->
    -    spawn_link(?MODULE,init,[]).
    +start_link() ->
    +    spawn_link(?MODULE,init,[]).
     
    -init() ->
    -    Table = ets:new(noname,[ordered_set]),
    -    ?MODULE:loop(#href_anchor"ss">state{table = Table, position = 0, mode=list}).
    +init() ->
    +    Table = ets:new(noname,[ordered_set]),
    +    ?MODULE:loop(#href_anchor"ss">state{table = Table, position = 0, mode=list}).
     
    -loop(State) ->
    +loop(State) ->
         receive
    -	{io_request, From, ReplyAs, Request} ->
    -	    case request(Request,State) of
    -		{Tag, Reply, NewState} when Tag =:= ok; Tag =:= error ->
    -		    reply(From, ReplyAs, Reply),
    -		    ?MODULE:loop(NewState);
    -		{stop, Reply, _NewState} ->
    -		    reply(From, ReplyAs, Reply),
    -		    exit(Reply)
    +	{io_request, From, ReplyAs, Request} ->
    +	    case request(Request,State) of
    +		{Tag, Reply, NewState} when Tag =:= ok; Tag =:= error ->
    +		    reply(From, ReplyAs, Reply),
    +		    ?MODULE:loop(NewState);
    +		{stop, Reply, _NewState} ->
    +		    reply(From, ReplyAs, Reply),
    +		    exit(Reply)
     	    end;
     	%% Private message
    -	{From, rewind} ->
    -	    From ! {self(), ok},
    -	    ?MODULE:loop(State#state{position = 0});
    +	{From, rewind} ->
    +	    From ! {self(), ok},
    +	    ?MODULE:loop(State#state{position = 0});
     	_Unknown ->
    -	    ?MODULE:loop(State)
    +	    ?MODULE:loop(State)
         end.

    The main loop receives messages from the client (which can use the the io module to send requests). For each request, the function request/2 is called and a reply is eventually sent using function reply/3.

    The "private" message {From, rewind} results in the current position in the pseudo-file to be reset to 0 (the beginning of the "file"). This is a typical example of I/O device-specific messages not being part of the I/O protocol. It is usually a bad idea to embed such private messages in io_request tuples, as -that can confuse the reader.

    First, we examine the reply function:

    reply(From, ReplyAs, Reply) ->
    -    From ! {io_reply, ReplyAs, Reply}.

    It sends the io_reply tuple back to the client, providing element ReplyAs +that can confuse the reader.

    First, we examine the reply function:

    reply(From, ReplyAs, Reply) ->
    +    From ! {io_reply, ReplyAs, Reply}.

    It sends the io_reply tuple back to the client, providing element ReplyAs received in the request along with the result of the request, as described -earlier.

    We need to handle some requests. First the requests for writing characters:

    request({put_chars, Encoding, Chars}, State) ->
    -    put_chars(unicode:characters_to_list(Chars,Encoding),State);
    -request({put_chars, Encoding, Module, Function, Args}, State) ->
    +earlier.

    We need to handle some requests. First the requests for writing characters:

    request({put_chars, Encoding, Chars}, State) ->
    +    put_chars(unicode:characters_to_list(Chars,Encoding),State);
    +request({put_chars, Encoding, Module, Function, Args}, State) ->
         try
    -	request({put_chars, Encoding, apply(Module, Function, Args)}, State)
    +	request({put_chars, Encoding, apply(Module, Function, Args)}, State)
         catch
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/json.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/json.html	2025-05-10 20:19:22.825314807 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/json.html	2025-05-10 20:19:22.825314807 +0000
    @@ -1011,8 +1011,8 @@
       
       Example
     

    -
    > json:decode(<<"{\"foo\": 1}">>).
    -#{<<"foo">> => 1}
    +
    > json:decode(<<"{\"foo\": 1}">>).
    +#{<<"foo">> => 1}
    @@ -1064,9 +1064,9 @@ Example -

    Decoding object keys as atoms:

    > Push = fun(Key, Value, Acc) -> [{binary_to_existing_atom(Key), Value} | Acc] end.
    -> json:decode(<<"{\"foo\": 1}">>, ok, #{object_push => Push}).
    -{#{foo => 1},ok,<<>>}
    +

    Decoding object keys as atoms:

    > Push = fun(Key, Value, Acc) -> [{binary_to_existing_atom(Key), Value} | Acc] end.
    +> json:decode(<<"{\"foo\": 1}">>, ok, #{object_push => Push}).
    +{#{foo => 1},ok,<<>>}
    @@ -1099,11 +1099,11 @@

    Continue parsing a stream of bytes of a JSON value.

    Similar to decode_start/3, if the function returns {continue, State} and -there is no more data, use end_of_input instead of a binary.

    > {continue, State} = json:decode_start(<<"{\"foo\":">>, ok, #{}).
    -> json:decode_continue(<<"1}">>, State).
    -{#{foo => 1},ok,<<>>}
    > {continue, State} = json:decode_start(<<"123">>, ok, #{}).
    -> json:decode_continue(end_of_input, State).
    -{123,ok,<<>>}
    +there is no more data, use end_of_input instead of a binary.

    > {continue, State} = json:decode_start(<<"{\"foo\":">>, ok, #{}).
    +> json:decode_continue(<<"1}">>, State).
    +{#{foo => 1},ok,<<>>}
    > {continue, State} = json:decode_start(<<"123">>, ok, #{}).
    +> json:decode_continue(end_of_input, State).
    +{123,ok,<<>>}
    @@ -1173,7 +1173,7 @@ Examples -
    > iolist_to_binary(json:encode(#{foo => <<"bar">>})).
    +
    > iolist_to_binary(json:encode(#{foo => <<"bar">>})).
     <<"{\"foo\":\"bar\"}">>
    @@ -1215,10 +1215,10 @@ Examples

    An encoder that uses a heuristic to differentiate object-like -lists of key-value pairs from plain lists:

    > encoder([{_, _} | _] = Value, Encode) -> json:encode_key_value_list(Value, Encode);
    -> encoder(Other, Encode) -> json:encode_value(Other, Encode).
    -> custom_encode(Value) -> json:encode(Value, fun(Value, Encode) -> encoder(Value, Encode) end).
    -> iolist_to_binary(custom_encode([{a, []}, {b, 1}])).
    +lists of key-value pairs from plain lists:

    > encoder([{_, _} | _] = Value, Encode) -> json:encode_key_value_list(Value, Encode);
    +> encoder(Other, Encode) -> json:encode_value(Other, Encode).
    +> custom_encode(Value) -> json:encode(Value, fun(Value, Encode) -> encoder(Value, Encode) end).
    +> iolist_to_binary(custom_encode([{a, []}, {b, 1}])).
     <<"{\"a\":[],\"b\":1}">>
    @@ -1610,11 +1610,11 @@ -

    Generates formatted JSON corresponding to Term.

    Similiar to encode/1 but with added whitespaces for formatting.

    > io:put_chars(json:format(#{foo => <<"bar">>, baz => 52})).
    -{
    +

    Generates formatted JSON corresponding to Term.

    Similiar to encode/1 but with added whitespaces for formatting.

    > io:put_chars(json:format(#{foo => <<"bar">>, baz => 52})).
    +{
       "baz": 52,
       "foo": "bar"
    -}
    +}
     ok
    @@ -1679,20 +1679,20 @@

    Generates formatted JSON corresponding to Term.

    Similar to encode/2, can be customised with the Encoder callback and Options.

    Options can include 'indent' to specify number of spaces per level and 'max' which loosely limits the width of lists.

    The Encoder will get a 'State' argument which contains the 'Options' maps merged with other data when recursing through 'Term'.

    format_value/3 or various encode_* functions in this module can be used -to help in constructing such callbacks.

    > formatter({posix_time, SysTimeSecs}, Encode, State) ->
    -    TimeStr = calendar:system_time_to_rfc3339(SysTimeSecs, [{offset, "Z"}]),
    -    json:format_value(unicode:characters_to_binary(TimeStr), Encode, State);
    -> formatter(Other, Encode, State) -> json:format_value(Other, Encode, State).
    +to help in constructing such callbacks.

    > formatter({posix_time, SysTimeSecs}, Encode, State) ->
    +    TimeStr = calendar:system_time_to_rfc3339(SysTimeSecs, [{offset, "Z"}]),
    +    json:format_value(unicode:characters_to_binary(TimeStr), Encode, State);
    +> formatter(Other, Encode, State) -> json:format_value(Other, Encode, State).
     >
    -> Fun = fun(Value, Encode, State) -> formatter(Value, Encode, State) end.
    -> Options = #{indent => 4}.
    -> Term = #{id => 1, time => {posix_time, erlang:system_time(seconds)}}.
    +> Fun = fun(Value, Encode, State) -> formatter(Value, Encode, State) end.
    +> Options = #{indent => 4}.
    +> Term = #{id => 1, time => {posix_time, erlang:system_time(seconds)}}.
     >
    -> io:put_chars(json:format(Term, Fun, Options)).
    -{
    +> io:put_chars(json:format(Term, Fun, Options)).
    +{
         "id": 1,
         "time": "2024-05-23T16:07:48Z"
    -}
    +}
     ok
    @@ -1822,7 +1822,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/lists.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/lists.html 2025-05-10 20:19:22.917315641 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/lists.html 2025-05-10 20:19:22.917315641 +0000 @@ -1167,8 +1167,8 @@ -

    Returns a list in which all the sublists of ListOfLists have been appended.

    Example:

    > lists:append([[1, 2, 3], [a, b], [4, 5, 6]]).
    -[1,2,3,a,b,4,5,6]
    +

    Returns a list in which all the sublists of ListOfLists have been appended.

    Example:

    > lists:append([[1, 2, 3], [a, b], [4, 5, 6]]).
    +[1,2,3,a,b,4,5,6]
    @@ -1197,7 +1197,7 @@

    Returns a new list List3, which is made from the elements of List1 followed -by the elements of List2.

    Example:

    > lists:append("abc", "def").
    +by the elements of List2.

    Example:

    > lists:append("abc", "def").
     "abcdef"

    lists:append(A, B) is equivalent to A ++ B.

    @@ -1228,7 +1228,7 @@

    Concatenates the text representation of the elements of Things. The elements -of Things can be atoms, integers, floats, or strings.

    Example:

    > lists:concat([doc, '/', file, '.', 3]).
    +of Things can be atoms, integers, floats, or strings.

    Example:

    > lists:concat([doc, '/', file, '.', 3]).
     "doc/file.3"
    @@ -1347,8 +1347,8 @@ -

    Returns a list containing N copies of term Elem.

    Example:

    > lists:duplicate(5, xx).
    -[xx,xx,xx,xx,xx]
    +

    Returns a list containing N copies of term Elem.

    Example:

    > lists:duplicate(5, xx).
    +[xx,xx,xx,xx,xx]
    @@ -1449,12 +1449,12 @@

    Returns List1 with each element H replaced by a tuple of form {I, H} where I is the position of H in List1. The enumeration starts with Index and increases by Step in each step.

    That is, enumerate/3 behaves as if it had been defined as -follows:

    enumerate(I, S, List) ->
    -  {List1, _ } = lists:mapfoldl(fun(T, Acc) -> {{Acc, T}, Acc+S} end, I, List),
    -  List1.

    The default values for Index and Step are both 1.

    Examples:

    > lists:enumerate([a,b,c]).
    -[{1,a},{2,b},{3,c}]
    > lists:enumerate(10, [a,b,c]).
    -[{10,a},{11,b},{12,c}]
    > lists:enumerate(0, -2, [a,b,c]).
    -[{0,a},{-2,b},{-4,c}]
    +follows:

    enumerate(I, S, List) ->
    +  {List1, _ } = lists:mapfoldl(fun(T, Acc) -> {{Acc, T}, Acc+S} end, I, List),
    +  List1.

    The default values for Index and Step are both 1.

    Examples:

    > lists:enumerate([a,b,c]).
    +[{1,a},{2,b},{3,c}]
    > lists:enumerate(10, [a,b,c]).
    +[{10,a},{11,b},{12,c}]
    > lists:enumerate(0, -2, [a,b,c]).
    +[{0,a},{-2,b},{-4,c}]
    @@ -1523,15 +1523,15 @@

    Calls Fun(Elem) on successive elements Elem of List1 in order to update or remove elements from List1.

    Fun/1 must return either a Boolean or a tuple {true, Value}. The function returns the list of elements for which Fun returns a new value, where a value -of true is synonymous with {true, Elem}.

    That is, filtermap behaves as if it had been defined as follows:

    filtermap(Fun, List1) ->
    -    lists:foldr(fun(Elem, Acc) ->
    -                       case Fun(Elem) of
    +of true is synonymous with {true, Elem}.

    That is, filtermap behaves as if it had been defined as follows:

    filtermap(Fun, List1) ->
    +    lists:foldr(fun(Elem, Acc) ->
    +                       case Fun(Elem) of
                                false -> Acc;
    -                           true -> [Elem|Acc];
    -                           {true,Value} -> [Value|Acc]
    +                           true -> [Elem|Acc];
    +                           {true,Value} -> [Value|Acc]
                            end
    -                end, [], List1).

    Example:

    > lists:filtermap(fun(X) -> case X rem 2 of 0 -> {true, X div 2}; _ -> false end end, [1,2,3,4,5]).
    -[1,2]
    +
    end, [], List1).

    Example:

    > lists:filtermap(fun(X) -> case X rem 2 of 0 -> {true, X div 2}; _ -> false end end, [1,2,3,4,5]).
    +[1,2]
    @@ -1590,9 +1590,9 @@

    Takes a function from As to lists of Bs, and a list of As (List1) and produces a list of Bs by applying the function to every element in List1 and -appending the resulting lists.

    That is, flatmap behaves as if it had been defined as follows:

    flatmap(Fun, List1) ->
    -    append(map(Fun, List1)).

    Example:

    > lists:flatmap(fun(X)->[X,X] end, [a,b,c]).
    -[a,a,b,b,c,c]
    +appending the resulting lists.

    That is, flatmap behaves as if it had been defined as follows:

    flatmap(Fun, List1) ->
    +    append(map(Fun, List1)).

    Example:

    > lists:flatmap(fun(X)->[X,X] end, [a,b,c]).
    +[a,a,b,b,c,c]
    @@ -1688,9 +1688,9 @@

    Calls Fun(Elem, AccIn) on successive elements A of List, starting with AccIn == Acc0. Fun/2 must return a new accumulator, which is passed to the next call. The function returns the final value of the accumulator. Acc0 is -returned if the list is empty.

    Example:

    > lists:foldl(fun(X, Sum) -> X + Sum end, 0, [1,2,3,4,5]).
    +returned if the list is empty.

    Example:

    > lists:foldl(fun(X, Sum) -> X + Sum end, 0, [1,2,3,4,5]).
     15
    -> lists:foldl(fun(X, Prod) -> X * Prod end, 1, [1,2,3,4,5]).
    +> lists:foldl(fun(X, Prod) -> X * Prod end, 1, [1,2,3,4,5]).
     120
    @@ -1727,11 +1727,11 @@ -

    Like foldl/3, but the list is traversed from right to left.

    Example:

    > P = fun(A, AccIn) -> io:format("~p ", [A]), AccIn end.
    +

    Like foldl/3, but the list is traversed from right to left.

    Example:

    > P = fun(A, AccIn) -> io:format("~p ", [A]), AccIn end.
     #Fun<erl_eval.12.2225172>
    -> lists:foldl(P, void, [1,2,3]).
    +> lists:foldl(P, void, [1,2,3]).
     1 2 3 void
    -> lists:foldr(P, void, [1,2,3]).
    +> lists:foldr(P, void, [1,2,3]).
     3 2 1 void

    foldl/3 is tail recursive and is usually preferred to foldr/3.

    @@ -1794,12 +1794,12 @@

    Inserts Sep between each element in List1. Has no effect on the empty list -and on a singleton list. For example:

    > lists:join(x, [a,b,c]).
    -[a,x,b,x,c]
    -> lists:join(x, [a]).
    -[a]
    -> lists:join(x, []).
    -[]
    +and on a singleton list. For example:

    > lists:join(x, [a,b,c]).
    +[a,x,b,x,c]
    +> lists:join(x, [a]).
    +[a]
    +> lists:join(x, []).
    +[]
    @@ -1900,10 +1900,10 @@

    Returns a list of tuples where, for each tuple in TupleList1, the Nth element Term1 of the tuple has been replaced with the result of calling -Fun(Term1).

    Examples:

    > Fun = fun(Atom) -> atom_to_list(Atom) end.
    +Fun(Term1).

    Examples:

    > Fun = fun(Atom) -> atom_to_list(Atom) end.
     #Fun<erl_eval.6.10732646>
    -2> lists:keymap(Fun, 2, [{name,jane,22},{name,lizzie,20},{name,lydia,15}]).
    -[{name,"jane",22},{name,"lizzie",20},{name,"lydia",15}]
    +2>
    lists:keymap(Fun, 2, [{name,jane,22},{name,lizzie,20},{name,lydia,15}]). +[{name,"jane",22},{name,"lizzie",20},{name,"lydia",15}]
    @@ -2244,9 +2244,9 @@ -

    Combines the operations of map/2 and foldl/3 into one pass.

    Example:

    Summing the elements in a list and double them at the same time:

    > lists:mapfoldl(fun(X, Sum) -> {2*X, X+Sum} end,
    -0, [1,2,3,4,5]).
    -{[2,4,6,8,10],15}
    +

    Combines the operations of map/2 and foldl/3 into one pass.

    Example:

    Summing the elements in a list and double them at the same time:

    > lists:mapfoldl(fun(X, Sum) -> {2*X, X+Sum} end,
    +0, [1,2,3,4,5]).
    +{[2,4,6,8,10],15}
    @@ -2538,7 +2538,7 @@ -

    Returns the Nth element of List.

    Example:

    > lists:nth(3, [a, b, c, d, e]).
    +

    Returns the Nth element of List.

    Example:

    > lists:nth(3, [a, b, c, d, e]).
     c
    @@ -2568,14 +2568,14 @@

    Returns the Nth tail of List, that is, the sublist of List starting at -N+1 and continuing up to the end of the list.

    Example

    > lists:nthtail(3, [a, b, c, d, e]).
    -[d,e]
    -> tl(tl(tl([a, b, c, d, e]))).
    -[d,e]
    -> lists:nthtail(0, [a, b, c, d, e]).
    -[a,b,c,d,e]
    -> lists:nthtail(5, [a, b, c, d, e]).
    -[]
    +N+1 and continuing up to the end of the list.

    Example

    > lists:nthtail(3, [a, b, c, d, e]).
    +[d,e]
    +> tl(tl(tl([a, b, c, d, e]))).
    +[d,e]
    +> lists:nthtail(0, [a, b, c, d, e]).
    +[a,b,c,d,e]
    +> lists:nthtail(5, [a, b, c, d, e]).
    +[]
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/log_mf_h.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/log_mf_h.html 2025-05-10 20:19:22.945315895 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/log_mf_h.html 2025-05-10 20:19:22.945315895 +0000 @@ -459,7 +459,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/maps.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/maps.html 2025-05-10 20:19:23.013316511 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/maps.html 2025-05-10 20:19:23.013316511 +0000 @@ -745,10 +745,10 @@

    Returns a map Map for which predicate Pred holds true in MapOrIter.

    The call fails with a {badmap,Map} exception if MapOrIter is not a map or -valid iterator, or with badarg if Pred is not a function of arity 2.

    Example:

    > M = #{a => 2, b => 3, c=> 4, "a" => 1, "b" => 2, "c" => 4},
    -  Pred = fun(K,V) -> is_atom(K) andalso (V rem 2) =:= 0 end,
    -  maps:filter(Pred,M).
    -#{a => 2,c => 4}
    +valid iterator, or with badarg if Pred is not a function of arity 2.

    Example:

    > M = #{a => 2, b => 3, c=> 4, "a" => 1, "b" => 2, "c" => 4},
    +  Pred = fun(K,V) -> is_atom(K) andalso (V rem 2) =:= 0 end,
    +  maps:filter(Pred,M).
    +#{a => 2,c => 4}
    @@ -787,10 +787,10 @@ map. If it returns false, the association is not copied. If it returns {true, NewValue}, the value for Key is replaced with NewValue in the result map.

    The call fails with a {badmap,Map} exception if MapOrIter is not a map or -valid iterator, or with badarg if Fun is not a function of arity 2.

    Example:

    > Fun = fun(K,V) when is_atom(K) -> {true, V*2}; (_,V) -> (V rem 2) =:= 0 end,
    -  Map = #{k1 => 1, "k2" => 2, "k3" => 3},
    -  maps:filtermap(Fun,Map).
    -#{k1 => 2,"k2" => 2}
    +valid iterator, or with badarg if Fun is not a function of arity 2.

    Example:

    > Fun = fun(K,V) when is_atom(K) -> {true, V*2}; (_,V) -> (V rem 2) =:= 0 end,
    +  Map = #{k1 => 1, "k2" => 2, "k3" => 3},
    +  maps:filtermap(Fun,Map).
    +#{k1 => 2,"k2" => 2}
    @@ -821,10 +821,10 @@

    Returns a tuple {ok, Value}, where Value is the value associated with Key, -or error if no value is associated with Key in Map.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Example:

    > Map = #{"hi" => 42},
    +or error if no value is associated with Key in Map.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Example:

    > Map = #{"hi" => 42},
       Key = "hi",
    -  maps:find(Key,Map).
    -{ok,42}
    +
    maps:find(Key,Map). +{ok,42}
    @@ -865,9 +865,9 @@ which is passed to the next successive call. This function returns the final value of the accumulator. The initial accumulator value Init is returned if the map is empty.

    The call fails with a {badmap,Map} exception if MapOrIter is not a map or -valid iterator, or with badarg if Fun is not a function of arity 3.

    Example:

    > Fun = fun(K,V,AccIn) when is_list(K) -> AccIn + V end,
    -  Map = #{"k1" => 1, "k2" => 2, "k3" => 3},
    -  maps:fold(Fun,0,Map).
    +valid iterator, or with badarg if Fun is not a function of arity 3.

    Example:

    > Fun = fun(K,V,AccIn) when is_list(K) -> AccIn + V end,
    +  Map = #{"k1" => 1, "k2" => 2, "k3" => 3},
    +  maps:fold(Fun,0,Map).
     6
    @@ -934,8 +934,8 @@

    Takes a list of keys and a value and builds a map where all keys point to the -same value. The key can be in any order, and keys and value can be of any term.

    Example:

    > Keys = ["a", "b", "c"], maps:from_keys(Keys, ok).
    -#{"a" => ok,"b" => ok,"c" => ok}
    +same value. The key can be in any order, and keys and value can be of any term.

    Example:

    > Keys = ["a", "b", "c"], maps:from_keys(Keys, ok).
    +#{"a" => ok,"b" => ok,"c" => ok}
    @@ -967,9 +967,9 @@

    Takes a list of key-value tuples elements and builds a map. The associations can be in any order, and both keys and values in the association can be of any term.

    If the same key appears more than once, the latter (right-most) value is used -and the previous values are ignored.

    Example:

    > List = [{"a",ignored},{1337,"value two"},{42,value_three},{"a",1}],
    -  maps:from_list(List).
    -#{42 => value_three,1337 => "value two","a" => 1}
    +and the previous values are ignored.

    Example:

    > List = [{"a",ignored},{1337,"value two"},{42,value_three},{"a",1}],
    +  maps:from_list(List).
    +#{42 => value_three,1337 => "value two","a" => 1}
    @@ -1001,8 +1001,8 @@

    Returns value Value associated with Key if Map contains Key.

    The call fails with a {badmap,Map} exception if Map is not a map, or with a {badkey,Key} exception if no value is associated with Key.

    Example:

    > Key = 1337,
    -  Map = #{42 => value_two,1337 => "value one","a" => 1},
    -  maps:get(Key,Map).
    +  Map = #{42 => value_two,1337 => "value one","a" => 1},
    +  maps:get(Key,Map).
     "value one"
    @@ -1034,11 +1034,11 @@

    Returns value Value associated with Key if Map contains Key. If no value -is associated with Key, Default is returned.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Example:

    > Map = #{ key1 => val1, key2 => val2 }.
    -#{key1 => val1,key2 => val2}
    -> maps:get(key1, Map, "Default value").
    +is associated with Key, Default is returned.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Example:

    > Map = #{ key1 => val1, key2 => val2 }.
    +#{key1 => val1,key2 => val2}
    +> maps:get(key1, Map, "Default value").
     val1
    -> maps:get(key3, Map, "Default value").
    +> maps:get(key3, Map, "Default value").
     "Default value"
    @@ -1078,11 +1078,11 @@

    Partitions the given List into a map of groups.

    The result is a map where each key is given by KeyFun and each value is a list of elements from the given List for which KeyFun returned the same key.

    The order of elements within each group list is preserved from the original -list.

    Examples:

    > EvenOdd = fun(X) -> case X rem 2 of 0 -> even; 1 -> odd end end,
    -maps:groups_from_list(EvenOdd, [1, 2, 3]).
    -#{even => [2], odd => [1, 3]}
    -> maps:groups_from_list(fun erlang:length/1, ["ant", "buffalo", "cat", "dingo"]).
    -#{3 => ["ant", "cat"], 5 => ["dingo"], 7 => ["buffalo"]}
    +list.

    Examples:

    > EvenOdd = fun(X) -> case X rem 2 of 0 -> even; 1 -> odd end end,
    +maps:groups_from_list(EvenOdd, [1, 2, 3]).
    +#{even => [2], odd => [1, 3]}
    +> maps:groups_from_list(fun erlang:length/1, ["ant", "buffalo", "cat", "dingo"]).
    +#{3 => ["ant", "cat"], 5 => ["dingo"], 7 => ["buffalo"]}
    @@ -1124,15 +1124,15 @@

    Partitions the given List into a map of groups.

    The result is a map where each key is given by KeyFun and each value is a list of elements from the given List, mapped via ValueFun, for which KeyFun returned the same key.

    The order of elements within each group list is preserved from the original -list.

    Examples:

    > EvenOdd = fun(X) -> case X rem 2 of 0 -> even; 1 -> odd end end,
    -> Square = fun(X) -> X * X end,
    -> maps:groups_from_list(EvenOdd, Square, [1, 2, 3]).
    -#{even => [4], odd => [1, 9]}
    -> maps:groups_from_list(
    +list.

    Examples:

    > EvenOdd = fun(X) -> case X rem 2 of 0 -> even; 1 -> odd end end,
    +> Square = fun(X) -> X * X end,
    +> maps:groups_from_list(EvenOdd, Square, [1, 2, 3]).
    +#{even => [4], odd => [1, 9]}
    +> maps:groups_from_list(
         fun erlang:length/1,
         fun lists:reverse/1,
    -    ["ant", "buffalo", "cat", "dingo"]).
    -#{3 => ["tna", "tac"],5 => ["ognid"],7 => ["olaffub"]}
    +
    ["ant", "buffalo", "cat", "dingo"]). +#{3 => ["tna", "tac"],5 => ["ognid"],7 => ["olaffub"]}
    @@ -1164,10 +1164,10 @@

    Intersects two maps into a single map Map3. If a key exists in both maps, the -value in Map1 is superseded by the value in Map2.

    The call fails with a {badmap,Map} exception if Map1 or Map2 is not a map.

    Example:

    > Map1 = #{a => "value_one", b => "value_two"},
    -  Map2 = #{a => 1, c => 2},
    -  maps:intersect(Map1,Map2).
    -#{a => 1}
    +value in Map1 is superseded by the value in Map2.

    The call fails with a {badmap,Map} exception if Map1 or Map2 is not a map.

    Example:

    > Map1 = #{a => "value_one", b => "value_two"},
    +  Map2 = #{a => 1, c => 2},
    +  maps:intersect(Map1,Map2).
    +#{a => 1}
    @@ -1207,10 +1207,10 @@ the value from Map1 is the second parameter, and the value from Map2 is the third parameter.

    The call fails with a {badmap,Map} exception if Map1 or Map2 is not a map. The call fails with a badarg exception if Combiner is not a fun that takes -three arguments.

    Example:

    > Map1 = #{a => "value_one", b => "value_two"},
    -  Map2 = #{a => 1, c => 2},
    -  maps:intersect_with(fun(_Key, Value1, Value2) -> {Value1, Value2} end, Map1, Map2).
    -#{a => {"value_one",1}}
    +three arguments.

    Example:

    > Map1 = #{a => "value_one", b => "value_two"},
    +  Map2 = #{a => 1, c => 2},
    +  maps:intersect_with(fun(_Key, Value1, Value2) -> {Value1, Value2} end, Map1, Map2).
    +#{a => {"value_one",1}}
    @@ -1241,11 +1241,11 @@

    Returns true if map Map contains Key and returns false if it does not -contain the Key.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Example:

    > Map = #{"42" => value}.
    -#{"42" => value}
    -> maps:is_key("42",Map).
    +contain the Key.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Example:

    > Map = #{"42" => value}.
    +#{"42" => value}
    +> maps:is_key("42",Map).
     true
    -> maps:is_key(value,Map).
    +> maps:is_key(value,Map).
     false
    @@ -1278,15 +1278,15 @@

    Returns a map iterator Iterator that can be used by maps:next/1 to traverse the key-value associations in a map. When iterating over a map, the /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/math.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/math.html 2025-05-10 20:19:23.041316765 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/math.html 2025-05-10 20:19:23.049316838 +0000 @@ -1194,7 +1194,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/ms_transform.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/ms_transform.html 2025-05-10 20:19:23.081317128 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/ms_transform.html 2025-05-10 20:19:23.093317237 +0000 @@ -154,31 +154,31 @@ table and construct a list of tuples containing relevant parts of the data in these rows. One can use ets:foldl/3 instead, but the ets:select/2 call is far more efficient. Without the translation provided by ms_transform, one must -struggle with writing match specifications terms to accommodate this.

    Consider a simple table of employees:

    -record(emp, {empno,     %Employee number as a string, the key
    +struggle with writing match specifications terms to accommodate this.

    Consider a simple table of employees:

    -record(emp, {empno,     %Employee number as a string, the key
                   surname,   %Surname of the employee
                   givenname, %Given name of employee
                   dept,      %Department, one of {dev,sales,prod,adm}
    -              empyear}). %Year the employee was employed

    We create the table using:

    ets:new(emp_tab, [{keypos,#emp.empno},named_table,ordered_set]).

    We fill the table with randomly chosen data:

    [{emp,"011103","Black","Alfred",sales,2000},
    - {emp,"041231","Doe","John",prod,2001},
    - {emp,"052341","Smith","John",dev,1997},
    - {emp,"076324","Smith","Ella",sales,1995},
    - {emp,"122334","Weston","Anna",prod,2002},
    - {emp,"535216","Chalker","Samuel",adm,1998},
    - {emp,"789789","Harrysson","Joe",adm,1996},
    - {emp,"963721","Scott","Juliana",dev,2003},
    - {emp,"989891","Brown","Gabriel",prod,1999}]

    Assuming that we want the employee numbers of everyone in the sales department, -there are several ways.

    ets:match/2 can be used:

    1> ets:match(emp_tab, {'_', '$1', '_', '_', sales, '_'}).
    -[["011103"],["076324"]]

    ets:match/2 uses a simpler type of match specification, but it is still + empyear}). %Year the employee was employed

    We create the table using:

    ets:new(emp_tab, [{keypos,#emp.empno},named_table,ordered_set]).

    We fill the table with randomly chosen data:

    [{emp,"011103","Black","Alfred",sales,2000},
    + {emp,"041231","Doe","John",prod,2001},
    + {emp,"052341","Smith","John",dev,1997},
    + {emp,"076324","Smith","Ella",sales,1995},
    + {emp,"122334","Weston","Anna",prod,2002},
    + {emp,"535216","Chalker","Samuel",adm,1998},
    + {emp,"789789","Harrysson","Joe",adm,1996},
    + {emp,"963721","Scott","Juliana",dev,2003},
    + {emp,"989891","Brown","Gabriel",prod,1999}]

    Assuming that we want the employee numbers of everyone in the sales department, +there are several ways.

    ets:match/2 can be used:

    1> ets:match(emp_tab, {'_', '$1', '_', '_', sales, '_'}).
    +[["011103"],["076324"]]

    ets:match/2 uses a simpler type of match specification, but it is still unreadable, and one has little control over the returned result. It is always a -list of lists.

    ets:foldl/3 or ets:foldr/3 can be used to avoid the nested lists:

    ets:foldr(fun(#emp{empno = E, dept = sales},Acc) -> [E | Acc];
    -             (_,Acc) -> Acc
    +list of lists.

    ets:foldl/3 or ets:foldr/3 can be used to avoid the nested lists:

    ets:foldr(fun(#emp{empno = E, dept = sales},Acc) -> [E | Acc];
    +             (_,Acc) -> Acc
               end,
    -          [],
    -          emp_tab).

    The result is ["011103","076324"]. The fun is straightforward, so the only + [], + emp_tab).

    The result is ["011103","076324"]. The fun is straightforward, so the only problem is that all the data from the table must be transferred from the table to the calling process for filtering. That is inefficient compared to the ets:match/2 call where the filtering can be done "inside" the emulator and -only the result is transferred to the process.

    Consider a "pure" ets:select/2 call that does what ets:foldr does:

    ets:select(emp_tab, [{#emp{empno = '$1', dept = sales, _='_'},[],['$1']}]).

    Although the record syntax is used, it is still hard to read and even harder to +only the result is transferred to the process.

    Consider a "pure" ets:select/2 call that does what ets:foldr does:

    ets:select(emp_tab, [{#emp{empno = '$1', dept = sales, _='_'},[],['$1']}]).

    Although the record syntax is used, it is still hard to read and even harder to write. The first element of the tuple, #emp{empno = '$1', dept = sales, _='_'}, tells what to match. Elements not matching this are not returned, as in the ets:match/2 example. The second @@ -189,12 +189,12 @@ hence the employee number is returned. The result is ["011103","076324"], as in the ets:foldr/3 example, but the result is retrieved much more efficiently in terms of execution speed and memory consumption.

    Using ets:fun2ms/1, we can combine the ease of use of the ets:foldr/3 and -the efficiency of the pure ets:select/2 example:

    -include_lib("stdlib/include/ms_transform.hrl").
    +the efficiency of the pure ets:select/2 example:

    -include_lib("stdlib/include/ms_transform.hrl").
     
    -ets:select(emp_tab, ets:fun2ms(
    -                      fun(#emp{empno = E, dept = sales}) ->
    +ets:select(emp_tab, ets:fun2ms(
    +                      fun(#emp{empno = E, dept = sales}) ->
                                   E
    -                      end)).

    This example requires no special knowledge of match specifications to + end)).

    This example requires no special knowledge of match specifications to understand. The head of the fun matches what you want to filter out and the body returns what you want returned. As long as the fun can be kept within the limits of the match specifications, there is no need to transfer all table data to the @@ -216,22 +216,22 @@

    Assume that we want to get all the employee numbers of employees hired before year 2000. Using ets:match/2 is not an alternative here, as relational operators cannot be expressed there. Once again, ets:foldr/3 can do it -(slowly, but correct):

    ets:foldr(fun(#emp{empno = E, empyear = Y},Acc) when Y < 2000 -> [E | Acc];
    -                  (_,Acc) -> Acc
    +(slowly, but correct):

    ets:foldr(fun(#emp{empno = E, empyear = Y},Acc) when Y < 2000 -> [E | Acc];
    +                  (_,Acc) -> Acc
               end,
    -          [],
    -          emp_tab).

    The result is ["052341","076324","535216","789789","989891"], as expected. The + [], + emp_tab).

    The result is ["052341","076324","535216","789789","989891"], as expected. The equivalent expression using a handwritten match specification would look like -this:

    ets:select(emp_tab, [{#emp{empno = '$1', empyear = '$2', _='_'},
    -                     [{'<', '$2', 2000}],
    -                     ['$1']}]).

    This gives the same result. [{'<', '$2', 2000}] is in the guard part and +this:

    ets:select(emp_tab, [{#emp{empno = '$1', empyear = '$2', _='_'},
    +                     [{'<', '$2', 2000}],
    +                     ['$1']}]).

    This gives the same result. [{'<', '$2', 2000}] is in the guard part and therefore discards anything that does not have an empyear (bound to '$2' in -the head) less than 2000, as the guard in the foldr/3 example.

    We write it using ets:fun2ms/1:

    -include_lib("stdlib/include/ms_transform.hrl").
    +the head) less than 2000, as the guard in the foldr/3 example.

    We write it using ets:fun2ms/1:

    -include_lib("stdlib/include/ms_transform.hrl").
     
    -ets:select(emp_tab, ets:fun2ms(
    -                      fun(#emp{empno = E, empyear = Y}) when Y < 2000 ->
    +ets:select(emp_tab, ets:fun2ms(
    +                      fun(#emp{empno = E, empyear = Y}) when Y < 2000 ->
                                E
    -                      end)).

    + end)).

    @@ -239,11 +239,11 @@

    Assume that we want the whole object matching instead of only one element. One alternative is to assign a variable to every part of the record and build it up -once again in the body of the fun, but the following is easier:

    ets:select(emp_tab, ets:fun2ms(
    -                      fun(Obj = #emp{empno = E, empyear = Y})
    +once again in the body of the fun, but the following is easier:

    ets:select(emp_tab, ets:fun2ms(
    +                      fun(Obj = #emp{empno = E, empyear = Y})
                              when Y < 2000 ->
                                   Obj
    -                      end)).

    As in ordinary Erlang matching, you can bind a variable to the whole matched + end)).

    As in ordinary Erlang matching, you can bind a variable to the whole matched object using a "match inside the match", that is, a =. Unfortunately in funs translated to match specifications, it is allowed only at the "top-level", that is, matching the whole object arriving to be matched into a separate variable. @@ -258,10 +258,10 @@

    This example concerns the body of the fun. Assume that all employee numbers beginning with zero (0) must be changed to begin with one (1) instead, and -that we want to create the list [{<Old empno>,<New empno>}]:

    ets:select(emp_tab, ets:fun2ms(
    -                      fun(#emp{empno = [$0 | Rest] }) ->
    -                              {[$0|Rest],[$1|Rest]}
    -                      end)).

    This query hits the feature of partially bound keys in table type ordered_set, +that we want to create the list [{<Old empno>,<New empno>}]:

    ets:select(emp_tab, ets:fun2ms(
    +                      fun(#emp{empno = [$0 | Rest] }) ->
    +                              {[$0|Rest],[$1|Rest]}
    +                      end)).

    This query hits the feature of partially bound keys in table type ordered_set, so that not the whole table needs to be searched, only the part containing keys beginning with 0 is looked into.

    @@ -274,24 +274,24 @@ {rookie, <employee number>}.
  • For all other employees, return {newbie, <employee number>}, except for those named Smith as they would be affronted by anything other than the tag guru and that is also what is returned for their numbers: -{guru, <employee number>}.
  • This is accomplished as follows:

    ets:select(emp_tab, ets:fun2ms(
    -                      fun(#emp{empno = E, surname = "Smith" }) ->
    -                              {guru,E};
    -                         (#emp{empno = E, empyear = Y}) when Y < 1997  ->
    -                              {inventory, E};
    -                         (#emp{empno = E, empyear = Y}) when Y > 2001  ->
    -                              {newbie, E};
    -                         (#emp{empno = E, empyear = Y}) -> % 1997 -- 2001
    -                              {rookie, E}
    -                      end)).

    The result is as follows:

    [{rookie,"011103"},
    - {rookie,"041231"},
    - {guru,"052341"},
    - {guru,"076324"},
    - {newbie,"122334"},
    - {rookie,"535216"},
    - {inventory,"789789"},
    - {newbie,"963721"},
    - {rookie,"989891"}]

    +{guru, <employee number>}.

    This is accomplished as follows:

    ets:select(emp_tab, ets:fun2ms(
    +                      fun(#emp{empno = E, surname = "Smith" }) ->
    +                              {guru,E};
    +                         (#emp{empno = E, empyear = Y}) when Y < 1997  ->
    +                              {inventory, E};
    +                         (#emp{empno = E, empyear = Y}) when Y > 2001  ->
    +                              {newbie, E};
    +                         (#emp{empno = E, empyear = Y}) -> % 1997 -- 2001
    +                              {rookie, E}
    +                      end)).

    The result is as follows:

    [{rookie,"011103"},
    + {rookie,"041231"},
    + {guru,"052341"},
    + {guru,"076324"},
    + {newbie,"122334"},
    + {rookie,"535216"},
    + {inventory,"789789"},
    + {newbie,"963721"},
    + {rookie,"989891"}]

    @@ -338,18 +338,18 @@ more, as filtering using Erlang code is not a good idea when tracing (except afterwards, if you trace to file). The concept is similar to that of ets:fun2ms/1 except that you usually use it directly from the shell (which can -also be done with ets:fun2ms/1).

    The following is an example module to trace on:

    -module(toy).
    +also be done with ets:fun2ms/1).

    The following is an example module to trace on:

    -module(toy).
     
    --export([start/1, store/2, retrieve/1]).
    +-export([start/1, store/2, retrieve/1]).
     
    -start(Args) ->
    -    toy_table = ets:new(toy_table, Args).
    +start(Args) ->
    +    toy_table = ets:new(toy_table, Args).
     
    -store(Key, Value) ->
    -    ets:insert(toy_table, {Key,Value}).
    +store(Key, Value) ->
    +    ets:insert(toy_table, {Key,Value}).
     
    -retrieve(Key) ->
    -    [{Key, Value}] = ets:lookup(toy_table, Key),
    +retrieve(Key) ->
    +    [{Key, Value}] = ets:lookup(toy_table, Key),
         Value.

    During model testing, the first test results in {badmatch,16} in /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/notes.html 2025-05-10 20:19:23.185318070 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/notes.html 2025-05-10 20:19:23.229318470 +0000 @@ -163,25 +163,25 @@

    • Made it possible to expand help text displayed by pressing ^[h by pressing ^[h again.

      Own Id: OTP-19260 Aux Id: PR-8884

    • Defining a fun in the shell using the syntax fun Name/Arity would fail. This has been corrected so that the following now works:

      1> F = fun is_atom/1.
       #href_anchor"n">Fun.erl.42.18682967>
      -> F(a).
      +> F(a).
       true
       3> Id = fun id/1.
       #Fun.erl.42.18682967>
      -4> Id(42).
      +4> Id(42).
       ** exception error: undefined shell command id/1
      -5> id(I) -> I.
      +5> id(I) -> I.
       ok
      -6> Id(42).
      +6> Id(42).
       42

      The Debugger has also been corrected to correctly handle this syntax for a BIF.

      Own Id: OTP-19322 Aux Id: GH-8963, PR-8987

    • Fixed a bug where completion of 'fun(' would cause the shell to crash.

      Own Id: OTP-19351 Aux Id: PR-9043

    • Fixed a bug causing the shell to crash while trying to complete an expression starting with a '/' or a variable followed by '(' or '/'. E.g. Foo/ and Foo(.

      Own Id: OTP-19361 Aux Id: PR-9078

    • zip:extract/2 with keep_old_files now respects the cwd option.

      Own Id: OTP-19370 Aux Id: PR-9097, GH-9087

    • Fixed an error in uri_string:percent_decode spec

      Own Id: OTP-19380 Aux Id: GH-8755

    Improvements and New Features

    -
    • Updated shell docs to display the type spec, that is, h(erlang, min, 2)) now prints the type spec and documentation in the shell.

      > h(erlang,min,2).
      +
      • Updated shell docs to display the type spec, that is, h(erlang, min, 2)) now prints the type spec and documentation in the shell.

        > h(erlang,min,2).
         
        -  -spec min(Term1, Term2) -> Minimum
        -               when Term1 :: term(), Term2 :: term(), Minimum :: term().
        +  -spec min(Term1, Term2) -> Minimum
        +               when Term1 :: term(), Term2 :: term(), Minimum :: term().
         
           Returns the smallest of Term1 and Term2. If the terms compare equal with the == operator, Term1 is returned.

        Own Id: OTP-19234 Aux Id: GH-8544, PR-8833

      • The file:io_device/0 type has been updated to clearly show the difference between a raw and cooked IoDevice.

        Own Id: OTP-19301 Aux Id: PR-8956

      • Added json:format_key_value_list/3 and json:format_key_value_list_checked/3.

        Own Id: OTP-19320 Aux Id: PR-8889

      • Improved documentation of timers.

        Own Id: OTP-19360 Aux Id: ERIERL-1149, PR-9062

      • Added logging support to io:user/0, io:standard_io/0 and io:standard_error/0. See io:setopts/2 for more details.

        Own Id: OTP-19372 Aux Id: PR-8947

      @@ -261,8 +261,8 @@ Improvements and New Features

      • The functions is_equal/2, map/2, and filtermap/2 have been added to the modules sets, ordsets, and gb_sets.

        Own Id: OTP-18622 Aux Id: PR-7183, PR-7232

      • The compiler now emits nicer error message for function head mismatches. -For example, given:

        a() -> ok;
        -a(_) -> error.

        Erlang/OTP 26 and earlier would emit a diagnostic similar to:

        t.erl:6:1: head mismatch
        +For example, given:

        a() -> ok;
        +a(_) -> error.

        Erlang/OTP 26 and earlier would emit a diagnostic similar to:

        t.erl:6:1: head mismatch
         %    6| a(_) -> error.
         %     | ^

        while in Erlang/OTP 27 the diagnostic is similar to:

        t.erl:6:1: head mismatch: function a with arities 0 and 1 is regarded as two distinct functions. Is the number of arguments incorrect or is the semicolon in a/0 unwanted?
         %    6| a(_) -> error.
        @@ -295,12 +295,12 @@
         shell:prompt_width/1 have been exported to help with custom prompt implementations.

        Own Id: OTP-18834 Aux Id: PR-7675, PR-7816

      • The shell now pages long output from the documentation help command (h(Module)), auto completions and the search command.

        Own Id: OTP-18846 Aux Id: PR-7845

      • The M-h hotkey (Alt/Option-h) now outputs help for the module or function directly before the cursor.

        Own Id: OTP-18847 Aux Id: PR-7846

      • Added support for adding a custom code formatter that formats your multi-line shell commands in your preferred formatting on submission. See shell:format_shell_func/ and shell:erl_pp_format_func/1.

        Own Id: OTP-18848 Aux Id: PR-7847

      • Added shell functions for viewing, forgetting and saving locally defined functions, types and records.

        Own Id: OTP-18852 Aux Id: PR-7844

      • Added string:jaro_similarity/2, which can be used to calculate the similarity between two strings.

        Own Id: OTP-18865 Aux Id: PR-7879

      • The new function ets:update_element/4 is similar to ets:update_element/3, but takes a default tuple as the fourth argument, which will be inserted if no previous record with that key exists.

        Own Id: OTP-18870 Aux Id: PR-7857

      • Added functions to retrieve the next higher or lower key/element from gb_trees and gb_sets, as well as returning iterators that start at given keys/elements.

        Own Id: OTP-18874 Aux Id: PR-7745

      • When the shell built-in function c/1,2 is used to re-compile a module, the current working directory of the original compilation is now added to the include path.

        Own Id: OTP-18908 Aux Id: PR-7957

      • The timer module now uses a private table for its internal state, slightly improving its performance.

        Own Id: OTP-18914 Aux Id: PR-7973

      • EEP-59 - Documentation Attributes has been implemented.

        Documentation attributes can be used to document functions, types, callbacks, and modules. The keyword -moduledoc "Documentation here". is used to document modules, while -doc "Documentation here". can be used on top of functions, types, and callbacks to document them, respectively.

        • Types, callbacks, and function documentation can be set to hidden either via -doc false or -doc hidden. When documentation attributes mark a type as hidden, they will not be part of the documentation.

        • The documentation from moduledoc and doc gets added by default to the binary beam file, following the format of EEP-48.

        • Using the compiler flag warn_missing_doc will raise a warning when -doc attributes are missing in exported functions, types, and callbacks.

        • Using the compiler flag warn_missing_spec_documented will raise a warning when -spec attributes are missing in documented functions, types, and callbacks.

        • moduledocs and docs may refer to external files to be embedded, such as -doc {file, "README.md"}., which refers to the file README.md found in the current working directory.

        • The compiler warns about exported functions whose specs refer to hidden types. Thus, there will be warnings when a hidden type (meaning, the type is not part of the documentation) gets used in an exported function.

        Own Id: OTP-18916 Aux Id: PR-7936

      • New ets functions ets:first_lookup/1, ets:next_lookup/2, ets:prev_lookup/2 and ets:last_lookup/1. Example: ets:next_lookup/1 is equivalent to ets:next/2 followed by ets:lookup/2 with the next key. The new combined functions are more efficient and with guaranteed atomicity.

        Own Id: OTP-18923 Aux Id: PR-6791

      • The maybe expression is now enabled by default.

        To use maybe as an atom, it needs to be single-quoted. Alternatively, the maybe expression can be disabled by disabling the maybe_expr feature. That can be done by placing the following the line at the beginning of an Erlang source file:

        -feature(maybe_expr, disable).

        Another way to disable the maybe_expr feature is by passing the -disable-feature option to erlc:

        erlc -disable-feature maybe_expr some_file.erl

        Own Id: OTP-18944 Aux Id: PR-8067

      • The compiler will now raise a warning when updating record/map literals. As an example, consider this module:

        -module(t).
        --export([f/0]).
        --record(r, {a,b,c}).
        +spec attributes are missing in documented functions, types, and callbacks.

      • moduledocs and docs may refer to external files to be embedded, such as -doc {file, "README.md"}., which refers to the file README.md found in the current working directory.

      • The compiler warns about exported functions whose specs refer to hidden types. Thus, there will be warnings when a hidden type (meaning, the type is not part of the documentation) gets used in an exported function.

      Own Id: OTP-18916 Aux Id: PR-7936

    • New ets functions ets:first_lookup/1, ets:next_lookup/2, ets:prev_lookup/2 and ets:last_lookup/1. Example: ets:next_lookup/1 is equivalent to ets:next/2 followed by ets:lookup/2 with the next key. The new combined functions are more efficient and with guaranteed atomicity.

      Own Id: OTP-18923 Aux Id: PR-6791

    • The maybe expression is now enabled by default.

      To use maybe as an atom, it needs to be single-quoted. Alternatively, the maybe expression can be disabled by disabling the maybe_expr feature. That can be done by placing the following the line at the beginning of an Erlang source file:

      -feature(maybe_expr, disable).

      Another way to disable the maybe_expr feature is by passing the -disable-feature option to erlc:

      erlc -disable-feature maybe_expr some_file.erl

      Own Id: OTP-18944 Aux Id: PR-8067

    • The compiler will now raise a warning when updating record/map literals. As an example, consider this module:

      -module(t).
      +-export([f/0]).
      +-record(r, {a,b,c}).
       
      -f() ->
      -    #href_anchor"ss">r{a=1}#r{b=2}.

      The compiler raises the following warning:

      1> c(t).
      +f() ->
      +    #href_anchor"ss">r{a=1}#r{b=2}.

      The compiler raises the following warning:

      1> c(t).
       t.erl:6:12: Warning: expression updates a literal
       %    6|     #r{a=1}#r{b=2}.
       %     |            ^

      Own Id: OTP-18951 Aux Id: PR-8069

    • The documentation has been migrated to use Markdown and ExDoc.

      Own Id: OTP-18955 Aux Id: PR-8026

    • Optimized ets:foldl and ets:foldr to use new ets:next_lookup. Also made them immune against table renaming.

      Own Id: OTP-18993 Aux Id: PR-8048

    • Windows now supports all functions in math.

      Own Id: OTP-19001 Aux Id: PR-8164

    • erl_lint (and by extension the compiler) will now warn for code using deprecated callbacks.

      The only callback currenly deprecated is format_status/2 in gen_server, gen_event and gen_statem.

      You can use nowarn_deprecated_callback to silence the warning.

      Own Id: OTP-19010 Aux Id: PR-8205

    • There is a new module json for encoding and decoding JSON.

      Both encoding and decoding can be customized. Decoding can be done in a SAX-like fashion and handle multiple documents and streams of data.

      Own Id: OTP-19020 Aux Id: PR-8111

    @@ -4637,7 +4637,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/orddict.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/orddict.html 2025-05-10 20:19:23.273318869 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/orddict.html 2025-05-10 20:19:23.285318977 +0000 @@ -142,13 +142,13 @@

    Functions append/3 and append_list/3 are included so that keyed values can be stored in a list accumulator, for -example:

    > D0 = orddict:new(),
    -  D1 = orddict:store(files, [], D0),
    -  D2 = orddict:append(files, f1, D1),
    -  D3 = orddict:append(files, f2, D2),
    -  D4 = orddict:append(files, f3, D3),
    -  orddict:fetch(files, D4).
    -[f1,f2,f3]

    This saves the trouble of first fetching a keyed value, appending a new value to +example:

    > D0 = orddict:new(),
    +  D1 = orddict:store(files, [], D0),
    +  D2 = orddict:append(files, f1, D1),
    +  D3 = orddict:append(files, f2, D2),
    +  D4 = orddict:append(files, f3, D3),
    +  orddict:fetch(files, D4).
    +[f1,f2,f3]

    This saves the trouble of first fetching a keyed value, appending a new value to the list of stored values, and storing the result.

    Function fetch/2 is to be used if the key is known to be in the dictionary, otherwise function find/2.

    @@ -537,16 +537,16 @@

    Appends a new Value to the current list of values associated with Key. An exception is generated if the initial value associated with Key is not a list -of values.

    See also section Notes.

    Example 1:

    1> OrdDict1 = orddict:from_list([{x, []}]).
    -[{x,[]}]
    -2> OrdDict2 = orddict:append(x, 1, OrdDict1).
    -[{x,[1]}]
    -3> OrdDict3 = orddict:append(x, 2, OrdDict2).
    -[{x,[1,2]}]
    -4> orddict:append(y, 3, OrdDict3).
    -[{x,[1,2]},{y,[3]}]

    Example 2:

    1> OrdDict1 = orddict:from_list([{a, no_list}]).
    -[{a,no_list}]
    -2> orddict:append(a, 1, OrdDict1).
    +of values.

    See also section Notes.

    Example 1:

    1> OrdDict1 = orddict:from_list([{x, []}]).
    +[{x,[]}]
    +2> OrdDict2 = orddict:append(x, 1, OrdDict1).
    +[{x,[1]}]
    +3> OrdDict3 = orddict:append(x, 2, OrdDict2).
    +[{x,[1,2]}]
    +4> orddict:append(y, 3, OrdDict3).
    +[{x,[1,2]},{y,[3]}]

    Example 2:

    1> OrdDict1 = orddict:from_list([{a, no_list}]).
    +[{a,no_list}]
    +2> orddict:append(a, 1, OrdDict1).
     ** exception error: bad argument
          in operator  ++/2
             called as no_list ++ [1]
    @@ -583,12 +583,12 @@

    Appends a list of values ValList to the current list of values associated with Key. An exception is generated if the initial value associated with Key is -not a list of values.

    See also section Notes.

    Example:

    1> OrdDict1 = orddict:from_list([{x, []}]).
    -[{x,[]}]
    -2> OrdDict2 = orddict:append_list(x, [1,2], OrdDict1).
    -[{x,[1,2]}]
    -3> OrdDict3 = orddict:append_list(y, [3,4], OrdDict2).
    -[{x,[1,2]},{y,[3,4]}]
    +not a list of values.

    See also section Notes.

    Example:

    1> OrdDict1 = orddict:from_list([{x, []}]).
    +[{x,[]}]
    +2> OrdDict2 = orddict:append_list(x, [1,2], OrdDict1).
    +[{x,[1,2]}]
    +3> OrdDict3 = orddict:append_list(y, [3,4], OrdDict2).
    +[{x,[1,2]},{y,[3,4]}]
    @@ -617,10 +617,10 @@ -

    Erases all items with a specified key from a dictionary.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    -[{a,1},{b,2}]
    -2> orddict:erase(a, OrdDict1).
    -[{b,2}]
    +

    Erases all items with a specified key from a dictionary.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    +[{a,1},{b,2}]
    +2> orddict:erase(a, OrdDict1).
    +[{b,2}]
    @@ -650,11 +650,11 @@

    Returns the value associated with Key in dictionary Orddict. This function assumes that the Key is present in the dictionary. An exception is generated -if Key is not in the dictionary.

    See also section Notes.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    -[{a,1},{b,2}]
    -2> orddict:fetch(a, OrdDict1).
    +if Key is not in the dictionary.

    See also section Notes.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    +[{a,1},{b,2}]
    +2> orddict:fetch(a, OrdDict1).
     1
    -3> orddict:fetch(missing, OrdDict1).
    +3> orddict:fetch(missing, OrdDict1).
     ** exception error: no function clause matching orddict:fetch(missing,[])
    @@ -683,10 +683,10 @@ -

    Returns a list of all keys in a dictionary.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    -[{a,1},{b,2}]
    -2> orddict:fetch_keys(OrdDict1).
    -[a,b]
    +

    Returns a list of all keys in a dictionary.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    +[{a,1},{b,2}]
    +2> orddict:fetch_keys(OrdDict1).
    +[a,b]
    @@ -719,10 +719,10 @@

    Orddict2 is a dictionary of all keys and values in Orddict1 for which -Pred(Key, Value) is true.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    -[{a,1},{b,2}]
    -2> orddict:filter(fun (K, V) -> V > 1 end, OrdDict1).
    -[{b,2}]
    +Pred(Key, Value) is true.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    +[{a,1},{b,2}]
    +2> orddict:filter(fun (K, V) -> V > 1 end, OrdDict1).
    +[{b,2}]
    @@ -752,11 +752,11 @@

    Searches for a key in a dictionary. Returns {ok, Value}, where Value is the value associated with Key, or error if the key is not present in the -dictionary.

    See also section Notes.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    -[{a,1},{b,2}]
    -2> orddict:find(a, OrdDict1).
    -{ok,1}
    -3> orddict:find(c, OrdDict1).
    +dictionary.

    See also section Notes.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    +[{a,1},{b,2}]
    +2> orddict:find(a, OrdDict1).
    +{ok,1}
    +3> orddict:find(c, OrdDict1).
     error
    @@ -794,10 +794,10 @@

    Calls Fun on successive keys and values of Orddict together with an extra argument Acc (short for accumulator). Fun must return a new accumulator that -is passed to the next call. Acc0 is returned if the list is empty.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    -[{a,1},{b,2}]
    -2> orddict:fold(fun (K, V, Acc) -> [{K, V+100} | Acc] end, [], OrdDict1).
    -[{b,102},{a,101}]
    +is passed to the next call. Acc0 is returned if the list is empty.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    +[{a,1},{b,2}]
    +2> orddict:fold(fun (K, V, Acc) -> [{K, V+100} | Acc] end, [], OrdDict1).
    +[{b,102},{a,101}]
    @@ -916,10 +916,10 @@

    Calls Fun on successive keys and values of Orddict1 to return a new value -for each key.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    -[{a,1},{b,2}]
    -2> orddict:map(fun (_K, V) -> V + 100 end, OrdDict1).
    -[{a,101},{b,102}]
    +for each key.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    +[{a,1},{b,2}]
    +2> orddict:map(fun (_K, V) -> V + 100 end, OrdDict1).
    +[{a,101},{b,102}]
    @@ -955,15 +955,15 @@

    Merges two dictionaries, Orddict1 and Orddict2, to create a new dictionary. All the Key-Value pairs from both dictionaries are included in the new dictionary.

    If a key occurs in both dictionaries, Fun is called with the key -and both values to return a new value.

    merge/3 can be defined as follows, but is faster:

    merge(Fun, D1, D2) ->
    -    fold(fun (K, V1, D) ->
    -                 update(K, fun (V2) -> Fun(K, V1, V2) end, V1, D)
    -         end, D2, D1).

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    -[{a,1},{b,2}]
    -2> OrdDict2 = orddict:from_list([{b, 7}, {c, 8}]).
    -[{b,7},{c,8}]
    -3> orddict:merge(fun (K, V1, V2) -> V1 * V2 end, OrdDict1, OrdDict2).
    -[{a,1},{b,14},{c,8}]
    +and both values to return a new value.

    merge/3 can be defined as follows, but is faster:

    merge(Fun, D1, D2) ->
    +    fold(fun (K, V1, D) ->
    +                 update(K, fun (V2) -> Fun(K, V1, V2) end, V1, D)
    +         end, D2, D1).

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    +[{a,1},{b,2}]
    +2> OrdDict2 = orddict:from_list([{b, 7}, {c, 8}]).
    +[{b,7},{c,8}]
    +3> orddict:merge(fun (K, V1, V2) -> V1 * V2 end, OrdDict1, OrdDict2).
    +[{a,1},{b,14},{c,8}]
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/ordsets.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/ordsets.html 2025-05-10 20:19:23.313319231 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/ordsets.html 2025-05-10 20:19:23.321319304 +0000 @@ -1092,7 +1092,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/peer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/peer.html 2025-05-10 20:19:23.357319630 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/peer.html 2025-05-10 20:19:23.369319739 +0000 @@ -161,127 +161,127 @@ manual analysis. If the test case fails, the CRASH REPORT contains these arguments
  • multiple test cases can run concurrently speeding up overall testing process, peer node names are unique even when there are multiple instances of the same -test suite running in parallel
  • -module(my_SUITE).
    --behaviour(ct_suite).
    --export([all/0, groups/0]).
    --export([basic/1, args/1, named/1, restart_node/1, multi_node/1]).
    +test suite running in parallel
    -module(my_SUITE).
    +-behaviour(ct_suite).
    +-export([all/0, groups/0]).
    +-export([basic/1, args/1, named/1, restart_node/1, multi_node/1]).
     
    --include_lib("common_test/include/ct.hrl").
    +-include_lib("common_test/include/ct.hrl").
     
    -groups() ->
    -    [{quick, [parallel],
    -        [basic, args, named, restart_node, multi_node]}].
    +groups() ->
    +    [{quick, [parallel],
    +        [basic, args, named, restart_node, multi_node]}].
     
    -all() ->
    -    [{group, quick}].
    +all() ->
    +    [{group, quick}].
     
    -basic(Config) when is_list(Config) ->
    -    {ok, Peer, _Node} = ?CT_PEER(),
    -    peer:stop(Peer).
    +basic(Config) when is_list(Config) ->
    +    {ok, Peer, _Node} = ?CT_PEER(),
    +    peer:stop(Peer).
     
    -args(Config) when is_list(Config) ->
    +args(Config) when is_list(Config) ->
         %% specify additional arguments to the new node
    -    {ok, Peer, _Node} = ?CT_PEER(["-emu_flavor", "smp"]),
    -    peer:stop(Peer).
    +    {ok, Peer, _Node} = ?CT_PEER(["-emu_flavor", "smp"]),
    +    peer:stop(Peer).
     
    -named(Config) when is_list(Config) ->
    +named(Config) when is_list(Config) ->
         %% pass test case name down to function starting nodes
    -    Peer = start_node_impl(named_test),
    -    peer:stop(Peer).
    +    Peer = start_node_impl(named_test),
    +    peer:stop(Peer).
     
    -start_node_impl(ActualTestCase) ->
    -    {ok, Peer, Node} = ?CT_PEER(#{name => ?CT_PEER_NAME(ActualTestCase)}),
    +start_node_impl(ActualTestCase) ->
    +    {ok, Peer, Node} = ?CT_PEER(#{name => ?CT_PEER_NAME(ActualTestCase)}),
         %% extra setup needed for multiple test cases
    -    ok = rpc:call(Node, application, set_env, [kernel, key, value]),
    +    ok = rpc:call(Node, application, set_env, [kernel, key, value]),
         Peer.
     
    -restart_node(Config) when is_list(Config) ->
    -    Name = ?CT_PEER_NAME(),
    -    {ok, Peer, Node} = ?CT_PEER(#{name => Name}),
    -    peer:stop(Peer),
    +restart_node(Config) when is_list(Config) ->
    +    Name = ?CT_PEER_NAME(),
    +    {ok, Peer, Node} = ?CT_PEER(#{name => Name}),
    +    peer:stop(Peer),
         %% restart the node with the same name as before
    -    {ok, Peer2, Node} = ?CT_PEER(#{name => Name, args => ["+fnl"]}),
    -    peer:stop(Peer2).

    The next example demonstrates how to start multiple nodes concurrently:

    multi_node(Config) when is_list(Config) ->
    -    Peers = [?CT_PEER(#{wait_boot => {self(), tag}})
    -        || _ <- lists:seq(1, 4)],
    +    {ok, Peer2, Node} = ?CT_PEER(#{name => Name, args => ["+fnl"]}),
    +    peer:stop(Peer2).

    The next example demonstrates how to start multiple nodes concurrently:

    multi_node(Config) when is_list(Config) ->
    +    Peers = [?CT_PEER(#{wait_boot => {self(), tag}})
    +        || _ <- lists:seq(1, 4)],
         %% wait for all nodes to complete boot process, get their names:
    -    _Nodes = [receive {tag, {started, Node, Peer}} -> Node end
    -        || {ok, Peer} <- Peers],
    -    [peer:stop(Peer) || {ok, Peer} <- Peers].

    Start a peer on a different host. Requires ssh key-based authentication set -up, allowing "another_host" connection without password prompt.

    Ssh = os:find_executable("ssh"),
    -peer:start_link(#{exec => {Ssh, ["another_host", "erl"]},
    -    connection => standard_io}),

    The following Common Test case demonstrates Docker integration, starting two + _Nodes = [receive {tag, {started, Node, Peer}} -> Node end + || {ok, Peer} <- Peers], + [peer:stop(Peer) || {ok, Peer} <- Peers].

    Start a peer on a different host. Requires ssh key-based authentication set +up, allowing "another_host" connection without password prompt.

    Ssh = os:find_executable("ssh"),
    +peer:start_link(#{exec => {Ssh, ["another_host", "erl"]},
    +    connection => standard_io}),

    The following Common Test case demonstrates Docker integration, starting two containers with hostnames "one" and "two". In this example Erlang nodes running -inside containers form an Erlang cluster.

    docker(Config) when is_list(Config) ->
    -    Docker = os:find_executable("docker"),
    -    PrivDir = proplists:get_value(priv_dir, Config),
    -    build_release(PrivDir),
    -    build_image(PrivDir),
    +inside containers form an Erlang cluster.

    docker(Config) when is_list(Config) ->
    +    Docker = os:find_executable("docker"),
    +    PrivDir = proplists:get_value(priv_dir, Config),
    +    build_release(PrivDir),
    +    build_image(PrivDir),
     
         %% start two Docker containers
    -    {ok, Peer, Node} = peer:start_link(#{name => lambda,
    +    {ok, Peer, Node} = peer:start_link(#{name => lambda,
             connection => standard_io,
    -        exec => {Docker, ["run", "-h", "one", "-i", "lambda"]}}),
    -    {ok, Peer2, Node2} = peer:start_link(#{name => lambda,
    +        exec => {Docker, ["run", "-h", "one", "-i", "lambda"]}}),
    +    {ok, Peer2, Node2} = peer:start_link(#{name => lambda,
             connection => standard_io,
    -        exec => {Docker, ["run", "-h", "two", "-i", "lambda"]}}),
    +        exec => {Docker, ["run", "-h", "two", "-i", "lambda"]}}),
     
         %% find IP address of the second node using alternative connection RPC
    -    {ok, Ips} = peer:call(Peer2, inet, getifaddrs, []),
    -    {"eth0", Eth0} = lists:keyfind("eth0", 1, Ips),
    -    {addr, Ip} = lists:keyfind(addr, 1, Eth0),
    +    {ok, Ips} = peer:call(Peer2, inet, getifaddrs, []),
    +    {"eth0", Eth0} = lists:keyfind("eth0", 1, Ips),
    +    {addr, Ip} = lists:keyfind(addr, 1, Eth0),
     
         %% make first node to discover second one
    -    ok = peer:call(Peer, inet_db, set_lookup, [[file]]),
    -    ok = peer:call(Peer, inet_db, add_host, [Ip, ["two"]]),
    +    ok = peer:call(Peer, inet_db, set_lookup, [[file]]),
    +    ok = peer:call(Peer, inet_db, add_host, [Ip, ["two"]]),
     
         %% join a cluster
    -    true = peer:call(Peer, net_kernel, connect_node, [Node2]),
    +    true = peer:call(Peer, net_kernel, connect_node, [Node2]),
         %% verify that second peer node has only the first node visible
    -    [Node] = peer:call(Peer2, erlang, nodes, []),
    +    [Node] = peer:call(Peer2, erlang, nodes, []),
     
         %% stop peers, causing containers to also stop
    -    peer:stop(Peer2),
    -    peer:stop(Peer).
    +    peer:stop(Peer2),
    +    peer:stop(Peer).
     
    -build_release(Dir) ->
    +build_release(Dir) ->
         %% load sasl.app file, otherwise application:get_key will fail
    -    application:load(sasl),
    +    application:load(sasl),
         %% create *.rel - release file
    -    RelFile = filename:join(Dir, "lambda.rel"),
    -    Release = {release, {"lambda", "1.0.0"},
    -        {erts, erlang:system_info(version)},
    -        [{App, begin {ok, Vsn} = application:get_key(App, vsn), Vsn end}
    -            || App <- [kernel, stdlib, sasl]]},
    -    ok = file:write_file(RelFile, list_to_binary(lists:flatten(
    -        io_lib:format("~tp.", [Release])))),
    -    RelFileNoExt = filename:join(Dir, "lambda"),
    +    RelFile = filename:join(Dir, "lambda.rel"),
    +    Release = {release, {"lambda", "1.0.0"},
    +        {erts, erlang:system_info(version)},
    +        [{App, begin {ok, Vsn} = application:get_key(App, vsn), Vsn end}
    +            || App <- [kernel, stdlib, sasl]]},
    +    ok = file:write_file(RelFile, list_to_binary(lists:flatten(
    +        io_lib:format("~tp.", [Release])))),
    +    RelFileNoExt = filename:join(Dir, "lambda"),
     
         %% create boot script
    -    {ok, systools_make, []} = systools:make_script(RelFileNoExt,
    -        [silent, {outdir, Dir}]),
    +    {ok, systools_make, []} = systools:make_script(RelFileNoExt,
    +        [silent, {outdir, Dir}]),
         %% package release into *.tar.gz
    -    ok = systools:make_tar(RelFileNoExt, [{erts, code:root_dir()}]).
    +    ok = systools:make_tar(RelFileNoExt, [{erts, code:root_dir()}]).
     
    -build_image(Dir) ->
    +build_image(Dir) ->
         %% Create Dockerfile example, working only for Ubuntu 20.04
         %% Expose port 4445, and make Erlang distribution to listen
         %%  on this port, and connect to it without EPMD
         %% Set cookie on both nodes to be the same.
    -    BuildScript = filename:join(Dir, "Dockerfile"),
    +    BuildScript = filename:join(Dir, "Dockerfile"),
         Dockerfile =
           "FROM ubuntu:20.04 as runner\n"
           "EXPOSE 4445\n"
           "WORKDIR /opt/lambda\n"
           "COPY lambda.tar.gz /tmp\n"
           "RUN tar -zxvf /tmp/lambda.tar.gz -C /opt/lambda\n"
    -      "ENTRYPOINT [\"/opt/lambda/erts-" ++ erlang:system_info(version) ++
    +      "ENTRYPOINT [\"/opt/lambda/erts-" ++ erlang:system_info(version) ++
           "/bin/dyn_erl\", \"-boot\", \"/opt/lambda/releases/1.0.0/start\","
           " \"-kernel\", \"inet_dist_listen_min\", \"4445\","
           " \"-erl_epmd_port\", \"4445\","
           " \"-setcookie\", \"secret\"]\n",
    -    ok = file:write_file(BuildScript, Dockerfile),
    -    os:cmd("docker build -t lambda " ++ Dir).
    +
    ok = file:write_file(BuildScript, Dockerfile), + os:cmd("docker build -t lambda " ++ Dir).
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/pool.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/pool.html 2025-05-10 20:19:23.437320355 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/pool.html 2025-05-10 20:19:23.441320391 +0000 @@ -515,7 +515,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/proc_lib.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/proc_lib.html 2025-05-10 20:19:23.485320791 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/proc_lib.html 2025-05-10 20:19:23.501320936 +0000 @@ -995,21 +995,21 @@ failed. When doing so the start function can return before the failing process has exited, which may block VM resources required for a new start attempt to succeed. Use init_fail/2,3 for that purpose.

    The following example illustrates how this function and proc_lib:start_link/3 -are used:

    -module(my_proc).
    --export([start_link/0]).
    --export([init/1]).
    +are used:

    -module(my_proc).
    +-export([start_link/0]).
    +-export([init/1]).
     
    -start_link() ->
    -    proc_lib:start_link(my_proc, init, [self()]).
    +start_link() ->
    +    proc_lib:start_link(my_proc, init, [self()]).
     
    -init(Parent) ->
    -    case do_initialization() of
    +init(Parent) ->
    +    case do_initialization() of
             ok ->
    -            proc_lib:init_ack(Parent, {ok, self()});
    -        {error, Reason} ->
    -            exit(Reason)
    +            proc_lib:init_ack(Parent, {ok, self()});
    +        {error, Reason} ->
    +            exit(Reason)
         end,
    -    loop().
    +    loop().
     
     ...
    @@ -1082,21 +1082,21 @@ started process, the start function returns an error tuple when the started process exits, or when the start function time-out (if used) has passed, see start/3,4,5.

    The following example illustrates how this function and proc_lib:start_link/3 -can be used:

    -module(my_proc).
    --export([start_link/0]).
    --export([init/1]).
    +can be used:

    -module(my_proc).
    +-export([start_link/0]).
    +-export([init/1]).
     
    -start_link() ->
    -    proc_lib:start_link(my_proc, init, [self()]).
    +start_link() ->
    +    proc_lib:start_link(my_proc, init, [self()]).
     
    -init(Parent) ->
    -    case do_initialization() of
    +init(Parent) ->
    +    case do_initialization() of
             ok ->
    -            proc_lib:init_ack(Parent, {ok, self()});
    -        {error, Reason} = Error ->
    -            proc_lib:init_fail(Parent, Error, {exit, normal})
    +            proc_lib:init_ack(Parent, {ok, self()});
    +        {error, Reason} = Error ->
    +            proc_lib:init_fail(Parent, Error, {exit, normal})
         end,
    -    loop().
    +    loop().
     
     ...
    @@ -2030,7 +2030,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/proplists.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/proplists.html 2025-05-10 20:19:23.533321226 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/proplists.html 2025-05-10 20:19:23.545321335 +0000 @@ -532,7 +532,7 @@

    Similar to get_all_values/2, but each value is wrapped in a list unless it is already itself a list. The resulting list of lists is concatenated. This is -often useful for "incremental" options.

    Example:

    append_values(a, [{a, [1,2]}, {b, 0}, {a, 3}, {c, -1}, {a, [4]}])

    returns:

    [1,2,3,4]
    +often useful for "incremental" options.

    Example:

    append_values(a, [{a, [1,2]}, {b, 0}, {a, 3}, {c, -1}, {a, [4]}])

    returns:

    [1,2,3,4]
    @@ -626,10 +626,10 @@ first entry in ListIn with the same key as Property, and E and Property have equivalent normal forms, then E is replaced with the terms in Expansion, and any following entries with the same key are deleted from -ListIn.

    For example, the following expressions all return [fie, bar, baz, fum]:

    expand([{foo, [bar, baz]}], [fie, foo, fum])
    -expand([{{foo, true}, [bar, baz]}], [fie, foo, fum])
    -expand([{{foo, false}, [bar, baz]}], [fie, {foo, false}, fum])

    However, no expansion is done in the following call because {foo, false} -shadows foo:

    expand([{{foo, true}, [bar, baz]}], [{foo, false}, fie, foo, fum])

    Notice that if the original property term is to be preserved in the result when +ListIn.

    For example, the following expressions all return [fie, bar, baz, fum]:

    expand([{foo, [bar, baz]}], [fie, foo, fum])
    +expand([{{foo, true}, [bar, baz]}], [fie, foo, fum])
    +expand([{{foo, false}, [bar, baz]}], [fie, {foo, false}, fum])

    However, no expansion is done in the following call because {foo, false} +shadows foo:

    expand([{{foo, true}, [bar, baz]}], [{foo, false}, fie, foo, fum])

    Notice that if the original property term is to be preserved in the result when expanded, it must be included in the expansion list. The inserted terms are not expanded recursively. If Expansions contains more than one property with the same key, only the first occurrence is used.

    See also normalize/2.

    @@ -1034,7 +1034,7 @@

    Partitions List into a list of sublists and a remainder.

    Lists contains one sublist for each key in Keys, in the corresponding order. The relative order of the elements in each sublist is preserved from the original List. Rest contains the elements in List that are not associated with any of the -specified keys, also with their original relative order preserved.

    Example:

    split([{c, 2}, {e, 1}, a, {c, 3, 4}, d, {b, 5}, b], [a, b, c])

    returns:

    {[[a], [{b, 5}, b],[{c, 2}, {c, 3, 4}]], [{e, 1}, d]}
    +specified keys, also with their original relative order preserved.

    Example:

    split([{c, 2}, {e, 1}, a, {c, 3, 4}, d, {b, 5}, b], [a, b, c])

    returns:

    {[[a], [{b, 5}, b],[{c, 2}, {c, 3, 4}]], [{e, 1}, d]}
    @@ -1157,7 +1157,7 @@ an association of the form Key => Value. Anything else will be silently ignored.

    If the same key appears in List multiple times, the value of the one appearing nearest to the head of List will be in the result map, that is the value that -would be returned by a call to get_value(Key, List).

    Example:

    to_map([a, {b, 1}, {c, 2}, {c, 3}])

    returns:

    #{a => true, b => 1, c => 2}
    +would be returned by a call to get_value(Key, List).

    Example:

    to_map([a, {b, 1}, {c, 2}, {c, 3}])

    returns:

    #{a => true, b => 1, c => 2}
    @@ -1253,7 +1253,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/qlc.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/qlc.html 2025-05-10 20:19:23.637322169 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/qlc.html 2025-05-10 20:19:23.637322169 +0000 @@ -285,24 +285,24 @@ If a tuple {finished} exists among the answers to QH, it is returned twice from append/2.

    As another example, consider concatenating the answers to two queries QH1 and QH2 while removing all duplicates. This is accomplished by using option -unique:

    qlc:q([X || X <- qlc:append(QH1, QH2)], {unique, true})

    The cost is substantial: every returned answer is stored in an ETS table. Before +unique:

    qlc:q([X || X <- qlc:append(QH1, QH2)], {unique, true})

    The cost is substantial: every returned answer is stored in an ETS table. Before returning an answer, it is looked up in the ETS table to check if it has already been returned. Without the unique option, all answers to QH1 would be returned followed by all answers to QH2. The unique option keeps the order between the remaining answers.

    If the order of the answers is not important, there is an alternative to the -unique option, namely to sort the answers uniquely:

    qlc:sort(qlc:q([X || X <- qlc:append(QH1, QH2)], {unique, true})).

    This query also removes duplicates but the answers are sorted. If there are many +unique option, namely to sort the answers uniquely:

    qlc:sort(qlc:q([X || X <- qlc:append(QH1, QH2)], {unique, true})).

    This query also removes duplicates but the answers are sorted. If there are many answers, temporary files are used. Notice that to get the first unique answer, all answers must be found and sorted. Both alternatives find duplicates by comparing answers, that is, if A1 and A2 are answers found in that order, then A2 is a removed if A1 == A2.

    To return only a few answers, cursors can be used. The following code returns no -more than five answers using an ETS table for storing the unique answers:

    C = qlc:cursor(qlc:q([X || X <- qlc:append(QH1, QH2)],{unique,true})),
    -R = qlc:next_answers(C, 5),
    -ok = qlc:delete_cursor(C),
    +more than five answers using an ETS table for storing the unique answers:

    C = qlc:cursor(qlc:q([X || X <- qlc:append(QH1, QH2)],{unique,true})),
    +R = qlc:next_answers(C, 5),
    +ok = qlc:delete_cursor(C),
     R.

    QLCs are convenient for stating constraints on data from two or more tables. The -following example does a natural join on two query handles on position 2:

    qlc:q([{X1,X2,X3,Y1} ||
    -          {X1,X2,X3} <- QH1,
    -          {Y1,Y2} <- QH2,
    -          X2 =:= Y2])

    The qlc module evaluates this differently depending on the query handles QH1 +following example does a natural join on two query handles on position 2:

    qlc:q([{X1,X2,X3,Y1} ||
    +          {X1,X2,X3} <- QH1,
    +          {Y1,Y2} <- QH2,
    +          X2 =:= Y2])

    The qlc module evaluates this differently depending on the query handles QH1 and QH2. If, for example, X2 is matched against the key of a QLC table, the lookup join method traverses the objects of QH2 while looking up key values in the table. However, if not X2 or Y2 is matched against the key or an indexed @@ -310,11 +310,11 @@ both sorted on position 2 and next do the join by traversing the objects one by one.

    Option join can be used to force the qlc module to use a certain join method. For the rest of this section it is assumed that the excessively slow -join method called "nested loop" has been chosen:

    qlc:q([{X1,X2,X3,Y1} ||
    -          {X1,X2,X3} <- QH1,
    -          {Y1,Y2} <- QH2,
    -          X2 =:= Y2],
    -      {join, nested_loop})

    In this case the filter is applied to every possible pair of answers to QH1 +join method called "nested loop" has been chosen:

    qlc:q([{X1,X2,X3,Y1} ||
    +          {X1,X2,X3} <- QH1,
    +          {Y1,Y2} <- QH2,
    +          X2 =:= Y2],
    +      {join, nested_loop})

    In this case the filter is applied to every possible pair of answers to QH1 and QH2, one at a time. If there are M answers to QH1 and N answers to QH2, the filter is run M*N times.

    If QH2 is a call to the function for gb_trees, as defined in section Implementing a QLC Table, then @@ -328,7 +328,7 @@ no side effects so that the meaning of the query does not change if QH2 is evaluated only once. One way of caching the answers is to evaluate QH2 first of all and substitute the list of answers for QH2 in the query. Another way is -to use option cache. It is expressed like this:

    QH2' = qlc:q([X || X <- QH2], {cache, ets})

    or only

    QH2' = qlc:q([X || X <- QH2], cache)

    The effect of option cache is that when generator QH2' is run the first +to use option cache. It is expressed like this:

    QH2' = qlc:q([X || X <- QH2], {cache, ets})

    or only

    QH2' = qlc:q([X || X <- QH2], cache)

    The effect of option cache is that when generator QH2' is run the first time, every answer is stored in an ETS table. When the next answer of QH1 is tried, answers to QH2' are copied from the ETS table, which is very fast. As for option unique the cost is a possibly substantial amount of RAM memory.

    Option {cache, list} offers the possibility to store the answers in a list on @@ -350,62 +350,62 @@ Implementing a QLC Table

    As an example of how to use function table/2, the implementation of a QLC -table for the gb_trees module is given:

    -module(gb_table).
    +table for the gb_trees module is given:

    -module(gb_table).
     
    --export([table/1]).
    +-export([table/1]).
     
    -table(T) ->
    -    TF = fun() -> qlc_next(gb_trees:next(gb_trees:iterator(T))) end,
    -    InfoFun = fun(num_of_objects) -> gb_trees:size(T);
    -                 (keypos) -> 1;
    -                 (is_sorted_key) -> true;
    -                 (is_unique_objects) -> true;
    -                 (_) -> undefined
    +table(T) ->
    +    TF = fun() -> qlc_next(gb_trees:next(gb_trees:iterator(T))) end,
    +    InfoFun = fun(num_of_objects) -> gb_trees:size(T);
    +                 (keypos) -> 1;
    +                 (is_sorted_key) -> true;
    +                 (is_unique_objects) -> true;
    +                 (_) -> undefined
                   end,
         LookupFun =
    -        fun(1, Ks) ->
    -                lists:flatmap(fun(K) ->
    -                                      case gb_trees:lookup(K, T) of
    -                                          {value, V} -> [{K,V}];
    -                                          none -> []
    +        fun(1, Ks) ->
    +                lists:flatmap(fun(K) ->
    +                                      case gb_trees:lookup(K, T) of
    +                                          {value, V} -> [{K,V}];
    +                                          none -> []
                                           end
    -                              end, Ks)
    +                              end, Ks)
             end,
         FormatFun =
    -        fun({all, NElements, ElementFun}) ->
    -                ValsS = io_lib:format("gb_trees:from_orddict(~w)",
    -                                      [gb_nodes(T, NElements, ElementFun)]),
    -                io_lib:format("gb_table:table(~s)", [ValsS]);
    -           ({lookup, 1, KeyValues, _NElements, ElementFun}) ->
    -                ValsS = io_lib:format("gb_trees:from_orddict(~w)",
    -                                      [gb_nodes(T, infinity, ElementFun)]),
    -                io_lib:format("lists:flatmap(fun(K) -> "
    +        fun({all, NElements, ElementFun}) ->
    +                ValsS = io_lib:format("gb_trees:from_orddict(~w)",
    +                                      [gb_nodes(T, NElements, ElementFun)]),
    +                io_lib:format("gb_table:table(~s)", [ValsS]);
    +           ({lookup, 1, KeyValues, _NElements, ElementFun}) ->
    +                ValsS = io_lib:format("gb_trees:from_orddict(~w)",
    +                                      [gb_nodes(T, infinity, ElementFun)]),
    +                io_lib:format("lists:flatmap(fun(K) -> "
                                   "case gb_trees:lookup(K, ~s) of "
                                   "{value, V} -> [{K,V}];none -> [] end "
                                   "end, ~w)",
    -                              [ValsS, [ElementFun(KV) || KV <- KeyValues]])
    +                              [ValsS, [ElementFun(KV) || KV <- KeyValues]])
             end,
    -    qlc:table(TF, [{info_fun, InfoFun}, {format_fun, FormatFun},
    -                   {lookup_fun, LookupFun},{key_equality,&#href_anchor"p" data-group-id="9697614435-44">}]).
    +    qlc:table(TF, [{info_fun, InfoFun}, {format_fun, FormatFun},
    +                   {lookup_fun, LookupFun},{key_equality,&#href_anchor"p" data-group-id="6247391949-44">}]).
     
    -qlc_next({X, V, S}) ->
    -    [{X,V} | fun() -> qlc_next(gb_trees:next(S)) end];
    -qlc_next(none) ->
    -    [].
    -
    -gb_nodes(T, infinity, ElementFun) ->
    -    gb_nodes(T, -1, ElementFun);
    -gb_nodes(T, NElements, ElementFun) ->
    -    gb_iter(gb_trees:iterator(T), NElements, ElementFun).
    +qlc_next({X, V, S}) ->
    +    [{X,V} | fun() -> qlc_next(gb_trees:next(S)) end];
    +qlc_next(none) ->
    +    [].
    +
    +gb_nodes(T, infinity, ElementFun) ->
    +    gb_nodes(T, -1, ElementFun);
    +gb_nodes(T, NElements, ElementFun) ->
    +    gb_iter(gb_trees:iterator(T), NElements, ElementFun).
     
    -gb_iter(_I, 0, _EFun) ->
    +gb_iter(_I, 0, _EFun) ->
         '...';
    -gb_iter(I0, N, EFun) ->
    -    case gb_trees:next(I0) of
    -        {X, V, I} ->
    -            [EFun({X,V}) | gb_iter(I, N-1, EFun)];
    +gb_iter(I0, N, EFun) ->
    +    case gb_trees:next(I0) of
    +        {X, V, I} ->
    +            [EFun({X,V}) | gb_iter(I, N-1, EFun)];
             none ->
    -            []
    +            []
         end.

    TF is the traversal function. The qlc module requires that there is a way of traversing all objects of the data structure. gb_trees has an iterator function suitable for that purpose. Notice that for each object returned, a new @@ -441,49 +441,49 @@ example, 2 == 2.0 evaluates to true while 2 =:= 2.0 evaluates to false. Normally this is a minor issue, but the qlc module cannot ignore the difference, which affects the user's choice of operators in QLCs.

    If the qlc module at compile time can determine that some constant is free of -integers, it does not matter which one of ==/2 or =:=/2 is used:

    1> E1 = ets:new(t, [set]), % uses =:=/2 for key equality
    -Q1 = qlc:q([K ||
    -{K} <- ets:table(E1),
    -K == 2.71 orelse K == a]),
    -io:format("~s~n", [qlc:info(Q1)]).
    -ets:match_spec_run(
    -       lists:flatmap(fun(V) ->
    -			    ets:lookup(#Ref<0.3098908599.2283929601.256025>,
    -				       V)
    +integers, it does not matter which one of ==/2 or =:=/2 is used:

    1> E1 = ets:new(t, [set]), % uses =:=/2 for key equality
    +Q1 = qlc:q([K ||
    +{K} <- ets:table(E1),
    +K == 2.71 orelse K == a]),
    +io:format("~s~n", [qlc:info(Q1)]).
    +ets:match_spec_run(
    +       lists:flatmap(fun(V) ->
    +			    ets:lookup(#Ref<0.3098908599.2283929601.256025>,
    +				       V)
     		     end,
    -		     [a, 2.71]),
    -       ets:match_spec_compile([{{'$1'}, [], ['$1']}]))

    In the example, operator ==/2 has been handled exactly as =:=/2 would have + [a, 2.71]), + ets:match_spec_compile([{{'$1'}, [], ['$1']}]))

    In the example, operator ==/2 has been handled exactly as =:=/2 would have been handled. However, if it cannot be determined at compile time that some constant is free of integers, and the table uses =:=/2 when comparing keys for equality (see option key_equality), then the qlc module does not try to look up the constant. The reason is that there is in the general case no upper limit on the number of key values that can compare equal -to such a constant; every combination of integers and floats must be looked up:

    2> E2 = ets:new(t, [set]),
    -true = ets:insert(E2, [{{2,2},a},{{2,2.0},b},{{2.0,2},c}]),
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/queue.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/queue.html	2025-05-10 20:19:23.681322568 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/queue.html	2025-05-10 20:19:23.697322712 +0000
    @@ -723,10 +723,10 @@
           
     
     

    Returns true if Pred(Item) returns true for all items Item in Q, -otherwise false.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    -2> queue:all(fun (E) -> E > 3 end, Queue).
    +otherwise false.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    +2> queue:all(fun (E) -> E > 3 end, Queue).
     false
    -3> queue:all(fun (E) -> E > 0 end, Queue).
    +3> queue:all(fun (E) -> E > 0 end, Queue).
     true
    @@ -758,10 +758,10 @@

    Returns true if Pred(Item) returns true for at least one item Item in -Q, otherwise false.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    -2> queue:any(fun (E) -> E > 10 end, Queue).
    +Q, otherwise false.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    +2> queue:any(fun (E) -> E > 10 end, Queue).
     false
    -3> queue:any(fun (E) -> E > 3 end, Queue).
    +3> queue:any(fun (E) -> E > 3 end, Queue).
     true
    @@ -793,9 +793,9 @@

    Returns a copy of Q1 where the first item matching Item is deleted, if there -is such an item.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    -2> Queue1 = queue:delete(3, Queue).
    -3> queue:member(3, Queue1).
    +is such an item.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    +2> Queue1 = queue:delete(3, Queue).
    +3> queue:member(3, Queue1).
     false
    @@ -827,10 +827,10 @@

    Returns a copy of Q1 where the last item matching Item is deleted, if there -is such an item.

    Example:

    1> Queue = queue:from_list([1,2,3,4,3,5]).
    -2> Queue1 = queue:delete_r(3, Queue).
    -3> queue:to_list(Queue1).
    -[1,2,3,4,5]
    +is such an item.

    Example:

    1> Queue = queue:from_list([1,2,3,4,3,5]).
    +2> Queue1 = queue:delete_r(3, Queue).
    +3> queue:to_list(Queue1).
    +[1,2,3,4,5]
    @@ -866,10 +866,10 @@

    Returns a copy of Q1 where the first item for which Pred returns true is -deleted, if there is such an item.

    Example:

    1> Queue = queue:from_list([100,1,2,3,4,5]).
    -2> Queue1 = queue:delete_with(fun (E) -> E > 0, Queue).
    -3> queue:to_list(Queue1).
    -[1,2,3,4,5]
    +deleted, if there is such an item.

    Example:

    1> Queue = queue:from_list([100,1,2,3,4,5]).
    +2> Queue1 = queue:delete_with(fun (E) -> E > 0, Queue).
    +3> queue:to_list(Queue1).
    +[1,2,3,4,5]
    @@ -905,10 +905,10 @@

    Returns a copy of Q1 where the last item for which Pred returns true is -deleted, if there is such an item.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5,100]).
    -2> Queue1 = queue:delete_with(fun (E) -> E > 10, Queue).
    -3> queue:to_list(Queue1).
    -[1,2,3,4,5]
    +deleted, if there is such an item.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5,100]).
    +2> Queue1 = queue:delete_with(fun (E) -> E > 10, Queue).
    +3> queue:to_list(Queue1).
    +[1,2,3,4,5]
    @@ -939,19 +939,19 @@

    Returns a queue Q2 that is the result of calling Fun(Item) on all items in Q1.

    If Fun(Item) returns true, Item is copied to the result queue. If it returns false, Item is not copied. If it returns a list, the list elements -are inserted instead of Item in the result queue.

    Example 1:

    1> Queue = queue:from_list([1,2,3,4,5]).
    -{[5,4,3],[1,2]}
    -2> Queue1 = queue:filter(fun (E) -> E > 2 end, Queue).
    -{[5],[3,4]}
    -3> queue:to_list(Queue1).
    -[3,4,5]

    So, Fun(Item) returning [Item] is thereby semantically equivalent to +are inserted instead of Item in the result queue.

    Example 1:

    1> Queue = queue:from_list([1,2,3,4,5]).
    +{[5,4,3],[1,2]}
    +2> Queue1 = queue:filter(fun (E) -> E > 2 end, Queue).
    +{[5],[3,4]}
    +3> queue:to_list(Queue1).
    +[3,4,5]

    So, Fun(Item) returning [Item] is thereby semantically equivalent to returning true, just as returning [] is semantically equivalent to returning -false. But returning a list builds more garbage than returning an atom.

    Example 2:

    1> Queue = queue:from_list([1,2,3,4,5]).
    -{[5,4,3],[1,2]}
    -2> Queue1 = queue:filter(fun (E) -> [E, E+1] end, Queue).
    -{[6,5,5,4,4,3],[1,2,2,3]}
    -3> queue:to_list(Queue1).
    -[1,2,2,3,3,4,4,5,5,6]
    +false. But returning a list builds more garbage than returning an atom.

    Example 2:

    1> Queue = queue:from_list([1,2,3,4,5]).
    +{[5,4,3],[1,2]}
    +2> Queue1 = queue:filter(fun (E) -> [E, E+1] end, Queue).
    +{[6,5,5,4,4,3],[1,2,2,3]}
    +3> queue:to_list(Queue1).
    +[1,2,2,3,3,4,4,5,5,6]
    @@ -990,15 +990,15 @@

    Returns a queue Q2 that is the result of calling Fun(Item) on all items in Q1.

    If Fun(Item) returns true, Item is copied to the result queue. If it returns false, Item is not copied. If it returns {true, NewItem}, the -queue element at this position is replaced with NewItem in the result queue.

    Example 1:

    1> Queue = queue:from_list([1,2,3,4,5]).
    -{[5,4,3],[1,2]}
    -2> Queue1 = queue:filtermap(fun (E) -> E > 2 end, Queue).
    -{[5],[3,4]}
    -3> queue:to_list(Queue1).
    -[3,4,5]
    -4> Queue1 = queue:filtermap(fun (E) -> {true, E+100} end, Queue).
    -{"ihg","ef"}
    -5> queue:to_list(Queue1).
    +queue element at this position is replaced with NewItem in the result queue.

    Example 1:

    1> Queue = queue:from_list([1,2,3,4,5]).
    +{[5,4,3],[1,2]}
    +2> Queue1 = queue:filtermap(fun (E) -> E > 2 end, Queue).
    +{[5],[3,4]}
    +3> queue:to_list(Queue1).
    +[3,4,5]
    +4> Queue1 = queue:filtermap(fun (E) -> {true, E+100} end, Queue).
    +{"ihg","ef"}
    +5> queue:to_list(Queue1).
     "efghi
    @@ -1039,9 +1039,9 @@ AccIn == Acc0. The queue is traversed in queue order, that is, from front to rear. Fun/2 must return a new accumulator, which is passed to the next call. The function returns the final value of the accumulator. Acc0 is returned if -the queue is empty.

    Example:

    1> queue:fold(fun(X, Sum) -> X + Sum end, 0, queue:from_list([1,2,3,4,5])).
    +the queue is empty.

    Example:

    1> queue:fold(fun(X, Sum) -> X + Sum end, 0, queue:from_list([1,2,3,4,5])).
     15
    -2> queue:fold(fun(X, Prod) -> X * Prod end, 1, queue:from_list([1,2,3,4,5])).
    +2> queue:fold(fun(X, Prod) -> X * Prod end, 1, queue:from_list([1,2,3,4,5])).
     120
    @@ -1099,12 +1099,12 @@ -

    Inserts Item at the rear of queue Q1. Returns the resulting queue Q2.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    -{[5,4,3],[1,2]}
    -2> Queue1 = queue:in(100, Queue).
    -{[100,5,4,3],[1,2]}
    -3> queue:to_list(Queue1).
    -[1,2,3,4,5,100]
    +

    Inserts Item at the rear of queue Q1. Returns the resulting queue Q2.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    +{[5,4,3],[1,2]}
    +2> Queue1 = queue:in(100, Queue).
    +{[100,5,4,3],[1,2]}
    +3> queue:to_list(Queue1).
    +[1,2,3,4,5,100]
    @@ -1132,12 +1132,12 @@ -

    Inserts Item at the front of queue Q1. Returns the resulting queue Q2.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    -{[5,4,3],[1,2]}
    -2> Queue1 = queue:in_r(100, Queue).
    -{[5,4,3],[100,1,2]}
    -3> queue:to_list(Queue1).
    -[100,1,2,3,4,5]
    +

    Inserts Item at the front of queue Q1. Returns the resulting queue Q2.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    +{[5,4,3],[1,2]}
    +2> Queue1 = queue:in_r(100, Queue).
    +{[5,4,3],[100,1,2]}
    +3> queue:to_list(Queue1).
    +[100,1,2,3,4,5]
    @@ -1225,12 +1225,12 @@

    Returns a queue Q3 that is the result of joining Q1 and Q2 with Q1 in -front of Q2.

    Example:

    1> Queue1 = queue:from_list([1,3]).
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/rand.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/rand.html	2025-05-10 20:19:23.741323112 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/rand.html	2025-05-10 20:19:23.761323293 +0000
    @@ -201,13 +201,13 @@
     a reasonably unpredictable seed.

    The functions with explicit state don't use the process dictionary.

    Examples

    Simple use; create and seed the default algorithm with a non-fixed seed, if not already done, and generate two uniformly distibuted -floating point numbers.

    R0 = rand:uniform(),
    -R1 = rand:uniform(),

    Use a specified algorithm:

    _ = rand:seed(exro928ss),
    -R2 = rand:uniform(),

    Use a specified algorithm with a fixed seed:

    _ = rand:seed(exro928ss, {123, 123534, 345345}),
    -R3 = rand:uniform(),

    Use the functional API with a non-fixed seed:

    S0 = rand:seed_s(exsss),
    -{R4, S1} = rand:uniform_s(S0),

    Generate a textbook basic form Box-Muller standard normal distribution number:

    R5 = rand:uniform_real(),
    -R6 = rand:uniform(),
    -SND0 = math:sqrt(-2 * math:log(R5)) * math:cos(math:pi() * R6)

    Generate a standard normal distribution number:

    {SND1, S2} = rand:normal_s(S1),

    Generate a normal distribution number with with mean -3 and variance 0.5:

    {ND0, S3} = rand:normal_s(-3, 0.5, S2),

    Quality of the Generated Numbers

    Note

    The builtin random number generator algorithms are not cryptographically +floating point numbers.

    R0 = rand:uniform(),
    +R1 = rand:uniform(),

    Use a specified algorithm:

    _ = rand:seed(exro928ss),
    +R2 = rand:uniform(),

    Use a specified algorithm with a fixed seed:

    _ = rand:seed(exro928ss, {123, 123534, 345345}),
    +R3 = rand:uniform(),

    Use the functional API with a non-fixed seed:

    S0 = rand:seed_s(exsss),
    +{R4, S1} = rand:uniform_s(S0),

    Generate a textbook basic form Box-Muller standard normal distribution number:

    R5 = rand:uniform_real(),
    +R6 = rand:uniform(),
    +SND0 = math:sqrt(-2 * math:log(R5)) * math:cos(math:pi() * R6)

    Generate a standard normal distribution number:

    {SND1, S2} = rand:normal_s(S1),

    Generate a normal distribution number with with mean -3 and variance 0.5:

    {ND0, S3} = rand:normal_s(-3, 0.5, S2),

    Quality of the Generated Numbers

    Note

    The builtin random number generator algorithms are not cryptographically strong. If a cryptographically strong random number generator is needed, use something like crypto:rand_seed/0.

    For all these generators except exro928ss and exsss the lowest bit(s) have got a slightly less random behaviour than all other bits. @@ -218,7 +218,7 @@ up to (and included) 16TB, with the exception of binary rank tests, which fail due to the lowest bit being an LFSR; all other bits pass all tests. We suggest to use a sign test to extract a random Boolean value.

    If this is a problem; to generate a boolean with these algorithms, -use something like this:

    (rand:uniform(256) > 128) % -> boolean()
    ((rand:uniform(256) - 1) bsr 7) % -> 0 | 1

    For a general range, with N = 1 for exrop, and N = 3 for exs1024s:

    (((rand:uniform(Range bsl N) - 1) bsr N) + 1)

    The floating point generating functions in this module waste the lowest bits +use something like this:

    (rand:uniform(256) > 128) % -> boolean()
    ((rand:uniform(256) - 1) bsr 7) % -> 0 | 1

    For a general range, with N = 1 for exrop, and N = 3 for exs1024s:

    (((rand:uniform(Range bsl N) - 1) bsr N) + 1)

    The floating point generating functions in this module waste the lowest bits when converting from an integer so they avoid this snag.

    @@ -1947,10 +1947,10 @@ equally spaced in the interval.

    Warning

    This function may return exactly 0.0 which can be fatal for certain applications. If that is undesired you can use (1.0 - rand:uniform()) to get the interval 0.0 < X =< 1.0, or instead use uniform_real/0.

    If neither endpoint is desired you can achieve the range -0.0 < X < 1.0 using test and re-try like this:

    my_uniform() ->
    -    case rand:uniform() of
    +0.0 < X < 1.0 using test and re-try like this:

    my_uniform() ->
    +    case rand:uniform() of
             X when 0.0 < X -> X;
    -        _ -> my_uniform()
    +        _ -> my_uniform()
         end.

    @@ -2111,7 +2111,7 @@ 16#7fa6502 * 2^32 - 1, which have been selected, in collaboration with Sebastiano Vigna, to avoid bignum operations and still get good statistical quality. It has been named "MWC59" and can be written as:

    C = CX0 bsr 32
    -X = CX0 band ((1 bsl 32)-1))
    +X = CX0 band ((1 bsl 32)-1))
     CX1 = 16#7fa6502 * X + C

    Because the generator uses a multiplier that is a power of 2 it gets statistical flaws for collision tests and birthday spacings tests in 2 and 3 dimensions, and these caveats apply even when looking @@ -2381,7 +2381,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/random.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/random.html 2025-05-10 20:19:23.785323510 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/random.html 2025-05-10 20:19:23.793323583 +0000 @@ -472,9 +472,9 @@

    Seeds random number generation with integer values in the process dictionary and -returns the old state.

    The following is an easy way of obtaining a unique value to seed with:

    random:seed(erlang:phash2([node()]),
    -            erlang:monotonic_time(),
    -            erlang:unique_integer())

    For details, see erlang:phash2/1, erlang:node/0, erlang:monotonic_time/0, +returns the old state.

    The following is an easy way of obtaining a unique value to seed with:

    random:seed(erlang:phash2([node()]),
    +            erlang:monotonic_time(),
    +            erlang:unique_integer())

    For details, see erlang:phash2/1, erlang:node/0, erlang:monotonic_time/0, and erlang:unique_integer/0.

    @@ -637,7 +637,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/re.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/re.html 2025-05-10 20:19:23.853324127 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/re.html 2025-05-10 20:19:23.881324381 +0000 @@ -1375,9 +1375,9 @@ follows (COMMIT) can be triggered first, so merely passing (COMMIT) during a match does not always guarantee that a match must be at this starting point.

    Notice that (*COMMIT) at the start of a pattern is not the same as an anchor, unless the PCRE start-of-match optimizations are turned off, as shown in the -following example:

    1> re:run("xyzabc","(*COMMIT)abc",[{capture,all,list}]).
    -{match,["abc"]}
    -2> re:run("xyzabc","(*COMMIT)abc",[{capture,all,list},no_start_optimize]).
    +following example:

    1> re:run("xyzabc","(*COMMIT)abc",[{capture,all,list}]).
    +{match,["abc"]}
    +2> re:run("xyzabc","(*COMMIT)abc",[{capture,all,list},no_start_optimize]).
     nomatch

    For this pattern, PCRE knows that any match must start with "a", so the optimization skips along the subject to "a" before applying the pattern to the first set of data. The match attempt then succeeds. In the second call the @@ -2108,32 +2108,32 @@

    Takes a compiled regular expression and an item, and returns the relevant data from the regular expression.

    The only supported item is namelist, which returns the tuple {namelist, [binary()]}, -containing the names of all (unique) named subpatterns in the regular expression.

    For example:

    1> {ok,MP} = re:compile("(?<A>A)|(?<B>B)|(?<C>C)").
    -{ok,{re_pattern,3,0,0,
    +containing the names of all (unique) named subpatterns in the regular expression.

    For example:

    1> {ok,MP} = re:compile("(?<A>A)|(?<B>B)|(?<C>C)").
    +{ok,{re_pattern,3,0,0,
                     <<69,82,67,80,119,0,0,0,0,0,0,0,1,0,0,0,255,255,255,255,
    -                  255,255,...>>}}
    -2> re:inspect(MP,namelist).
    -{namelist,[<<"A">>,<<"B">>,<<"C">>]}
    -3> {ok,MPD} = re:compile("(?<C>A)|(?<B>B)|(?<C>C)",[dupnames]).
    -{ok,{re_pattern,3,0,0,
    +                  255,255,...>>}}
    +2> re:inspect(MP,namelist).
    +{namelist,[<<"A">>,<<"B">>,<<"C">>]}
    +3> {ok,MPD} = re:compile("(?<C>A)|(?<B>B)|(?<C>C)",[dupnames]).
    +{ok,{re_pattern,3,0,0,
                     <<69,82,67,80,119,0,0,0,0,0,8,0,1,0,0,0,255,255,255,255,
    -                  255,255,...>>}}
    -4> re:inspect(MPD,namelist).
    -{namelist,[<<"B">>,<<"C">>]}

    Notice in the second example that the duplicate name only occurs once in the + 255,255,...>>}} +4> re:inspect(MPD,namelist). +{namelist,[<<"B">>,<<"C">>]}

    Notice in the second example that the duplicate name only occurs once in the returned list, and that the list is in alphabetical order regardless of where the names are positioned in the regular expression. The order of the names is the same as the order of captured subexpressions if {capture, all_names} is specified as an option to run/3. You can therefore create a name-to-value -mapping from the result of run/3 like this:

    1> {ok,MP} = re:compile("(?<A>A)|(?<B>B)|(?<C>C)").
    -{ok,{re_pattern,3,0,0,
    +mapping from the result of run/3 like this:

    1> {ok,MP} = re:compile("(?<A>A)|(?<B>B)|(?<C>C)").
    +{ok,{re_pattern,3,0,0,
                     <<69,82,67,80,119,0,0,0,0,0,0,0,1,0,0,0,255,255,255,255,
    -                  255,255,...>>}}
    -2> {namelist, N} = re:inspect(MP,namelist).
    -{namelist,[<<"A">>,<<"B">>,<<"C">>]}
    -3> {match,L} = re:run("AA",MP,[{capture,all_names,binary}]).
    -{match,[<<"A">>,<<>>,<<>>]}
    -4> NameMap = lists:zip(N,L).
    -[{<<"A">>,<<"A">>},{<<"B">>,<<>>},{<<"C">>,<<>>}]
    +
    255,255,...>>}} +2> {namelist, N} = re:inspect(MP,namelist). +{namelist,[<<"A">>,<<"B">>,<<"C">>]} +3> {match,L} = re:run("AA",MP,[{capture,all_names,binary}]). +{match,[<<"A">>,<<>>,<<>>]} +4> NameMap = lists:zip(N,L). +[{<<"A">>,<<"A">>},{<<"B">>,<<>>},{<<"C">>,<<>>}]
    @@ -2226,16 +2226,16 @@ subexpression number N, is inserted in the result. If no subexpression with that number is generated by the regular expression, nothing is inserted.

    To insert an & or a \ in the result, precede it with a \. Notice that Erlang already gives a special meaning to \ in literal strings, so a single \ must be -written as "\\" and therefore a double \ as "\\\\".

    Example:

    1> re:replace("abcd","c","[&]",[{return,list}]).
    -"ab[c]d"

    while

    2> re:replace("abcd","c","[\\&]",[{return,list}]).
    +written as "\\" and therefore a double \ as "\\\\".

    Example:

    1> re:replace("abcd","c","[&]",[{return,list}]).
    +"ab[c]d"

    while

    2> re:replace("abcd","c","[\\&]",[{return,list}]).
     "ab[&]d"

    If the replacement is given as a fun, it will be called with the whole matching expression as the first argument and a list of subexpression matches in the order in which they appear in the regular expression. The returned value will be -inserted in the result.

    Example:

    3> re:replace("abcd", ".(.)",
    -    fun(Whole, [<<C>>]) ->
    -         <<$#, Whole/binary, $-, (C - $a + $A), $#>>
    +inserted in the result.

    Example:

    3> re:replace("abcd", ".(.)",
    +    fun(Whole, [<<C>>]) ->
    +         <<$#, Whole/binary, $-, (C - $a + $A), $#>>
         end,
    -    [{return, list}]).
    +    [{return, list}]).
     "#ab-B#cd"

    Note

    Non-matching optional subexpressions will not be included in the list of subexpression matches if they are the last subexpressions in the regular expression.

    Example:

    The regular expression "(a)(b)?(c)?" ("a", optionally followed by "b", @@ -2352,7 +2352,7 @@ run/3 handles empty matches in the same way as Perl: a zero-length match at any point is also retried with options [anchored, notempty_atstart]. If that search gives a result of length > 0, -the result is included. Example:

    re:run("cat","(|at)",[global]).

    The following matchings are performed:

    • At offset 0 - The regular expression (|at) first match at the +the result is included. Example:

      re:run("cat","(|at)",[global]).

      The following matchings are performed:

      • At offset 0 - The regular expression (|at) first match at the initial position of string cat, giving the result set [{0,0},{0,0}] (the second {0,0} is because of the subexpression marked by the parentheses). As the length of the match is 0, we do not advance to the next position yet.

      • At offset 0 with [anchored, notempty_atstart] - The search is @@ -2364,7 +2364,7 @@ of results and the position in the search string is advanced two steps.

      • At offset 3 - The search once again matches the empty string, giving [{3,0},{3,0}].

      • At offset 1 with [anchored, notempty_atstart] - This gives no result of length > 0 and we are at the last position, so the global search is -complete.

      The result of the call is:

      {match,[[{0,0},{0,0}],[{1,0},{1,0}],[{1,2},{1,2}],[{3,0},{3,0}]]}
    • notempty - An empty string is not considered to be a valid match if this +complete.

    The result of the call is:

    {match,[[{0,0},{0,0}],[{1,0},{1,0}],[{1,2},{1,2}],[{3,0},{3,0}]]}
  • notempty - An empty string is not considered to be a valid match if this option is specified. If alternatives in the pattern exist, they are tried. If all the alternatives match the empty string, the entire match fails.

    Example:

    If the following pattern is applied to a string not beginning with "a" or "b", it would normally match the empty string at the start of the subject:

    a?b?

    With option notempty, this match is invalid, so run/3 searches @@ -2435,12 +2435,12 @@ instead of the stack, the amount of heap memory that can be used.

  • The Erlang VM uses a PCRE library where heap memory is used when regular expression match recursion occurs. This therefore limits the use of machine heap, not C stack.

    Specifying a lower value can result in matches with deep recursion failing, -when they should have matched:

    1> re:run("aaaaaaaaaaaaaz","(a+)*z").
    -{match,[{0,14},{0,13}]}
    -2> re:run("aaaaaaaaaaaaaz","(a+)*z",[{match_limit_recursion,5}]).
    +when they should have matched:

    1> re:run("aaaaaaaaaaaaaz","(a+)*z").
    +{match,[{0,14},{0,13}]}
    +2> re:run("aaaaaaaaaaaaaz","(a+)*z",[{match_limit_recursion,5}]).
     nomatch
    -3> re:run("aaaaaaaaaaaaaz","(a+)*z",[{match_limit_recursion,5},report_errors]).
    -{error,match_limit_recursion}

    This option and option match_limit are only to be used in rare cases. +3> re:run("aaaaaaaaaaaaaz","(a+)*z",[{match_limit_recursion,5},report_errors]). +{error,match_limit_recursion}

    This option and option match_limit are only to be used in rare cases. Understanding of the PCRE library internals is recommended before tampering with these limits.

  • {offset, integer() >= 0} - Start matching at the offset (position) specified in the subject string. The offset is zero-based, so that the default @@ -2462,9 +2462,9 @@ capturing).

    As an example of the default behavior, the following call returns, as first and only captured string, the matching part of the subject ("abcd" in the middle) as an index pair {3,4}, where character positions are zero-based, -just as in offsets:

    re:run("ABCabcdABC","abcd",[]).

    The return value of this call is:

    {match,[{3,4}]}

    Another (and quite common) case is where the regular expression matches all of -the subject:

    re:run("ABCabcdABC",".*abcd.*",[]).

    Here the return value correspondingly points out all of the string, beginning -at index 0, and it is 10 characters long:

    {match,[{0,10}]}

    If the regular expression contains capturing subpatterns, like in:

    re:run("ABCabcdABC",".*(abcd).*",[]).

    all of the matched subject is captured, as well as the captured substrings:

    {match,[{0,10},{3,4}]}

    The complete matching pattern always gives the first return value in the list +just as in offsets:

    re:run("ABCabcdABC","abcd",[]).

    The return value of this call is:

    {match,[{3,4}]}

    Another (and quite common) case is where the regular expression matches all of +the subject:

    re:run("ABCabcdABC",".*abcd.*",[]).

    Here the return value correspondingly points out all of the string, beginning +at index 0, and it is 10 characters long:

    {match,[{0,10}]}

    If the regular expression contains capturing subpatterns, like in:

    re:run("ABCabcdABC",".*(abcd).*",[]).

    all of the matched subject is captured, as well as the captured substrings:

    {match,[{0,10},{3,4}]}

    The complete matching pattern always gives the first return value in the list and the remaining subpatterns are added in the order they occurred in the regular expression.

    The capture tuple is built up as follows:

    • ValueSpec - Specifies which captured (sub)patterns are to be returned. ValueSpec can either be an atom describing a predefined set of return @@ -2489,12 +2489,12 @@ subpatterns (see below) in the regular expression, one can use atom/0s or string/0s to specify the subpatterns to be returned. For example, consider the regular expression:

      ".*(abcd).*"

      matched against string "ABCabcdABC", capturing only the "abcd" part (the -first explicit subpattern):

      re:run("ABCabcdABC",".*(abcd).*",[{capture,[1]}]).

      The call gives the following result, as the first explicitly captured +first explicit subpattern):

      re:run("ABCabcdABC",".*(abcd).*",[{capture,[1]}]).

      The call gives the following result, as the first explicitly captured subpattern is "(abcd)", matching "abcd" in the subject, at (zero-based) -position 3, of length 4:

      {match,[{3,4}]}

      Consider the same regular expression, but with the subpattern explicitly +position 3, of length 4:

      {match,[{3,4}]}

      Consider the same regular expression, but with the subpattern explicitly named 'FOO':

      ".*(?<FOO>abcd).*"

      With this expression, we could still give the index of the subpattern with -the following call:

      re:run("ABCabcdABC",".*(?<FOO>abcd).*",[{capture,[1]}]).

      giving the same result as before. But, as the subpattern is named, we can -also specify its name in the value list:

      re:run("ABCabcdABC",".*(?<FOO>abcd).*",[{capture,['FOO']}]).

      This would give the same result as the earlier examples, namely:

      {match,[{3,4}]}

      The values list can specify indexes or names not present in the regular +the following call:

      re:run("ABCabcdABC",".*(?<FOO>abcd).*",[{capture,[1]}]).

      giving the same result as before. But, as the subpattern is named, we can +also specify its name in the value list:

      re:run("ABCabcdABC",".*(?<FOO>abcd).*",[{capture,['FOO']}]).

      This would give the same result as the earlier examples, namely:

      {match,[{3,4}]}

      The values list can specify indexes or names not present in the regular expression, in which case the return values vary depending on the type. If the type is index, the tuple {-1,0} is returned for values with no corresponding subpattern in the regular expression, but for the other types @@ -2529,12 +2529,12 @@ string:

      "ABCabcdABC"

      the subpattern at index 2 does not match, as "abdd" is not present in the string, but the complete pattern matches (because of the alternative a(..d)). The subpattern at index 2 is therefore unassigned and the default -return value is:

      {match,[{0,10},{3,4},{-1,0},{4,3}]}

      Setting the capture Type to binary gives:

      {match,[<<"ABCabcdABC">>,<<"abcd">>,<<>>,<<"bcd">>]}

      Here the empty binary (<<>>) represents the unassigned subpattern. In the +return value is:

      {match,[{0,10},{3,4},{-1,0},{4,3}]}

      Setting the capture Type to binary gives:

      {match,[<<"ABCabcdABC">>,<<"abcd">>,<<>>,<<"bcd">>]}

      Here the empty binary (<<>>) represents the unassigned subpattern. In the binary case, some information about the matching is therefore lost, as <<>> can also be an empty string captured.

      If differentiation between empty matches and non-existing subpatterns is necessary, use the type index and do the conversion to the final type in Erlang code.

      When option global is speciified, the capture specification affects each -match separately, so that:

      re:run("cacb","c(a|b)",[global,{capture,[1],list}]).

      gives

      {match,[["a"],["b"]]}

    For a descriptions of options only affecting the compilation step, see +match separately, so that:

    re:run("cacb","c(a|b)",[global,{capture,[1],list}]).

    gives

    {match,[["a"],["b"]]}
  • For a descriptions of options only affecting the compilation step, see compile/2.

    @@ -2623,7 +2623,7 @@ compilation option is specified to this function, both the regular expression and Subject are to be specified as valid Unicode charlist()s.

    The result is given as a list of "strings", the preferred data type specified in option return (default iodata).

    If subexpressions are specified in the regular expression, the matching -subexpressions are returned in the resulting list as well. For example:

    re:split("Erlang","[ln]",[{return,list}]).

    gives

    ["Er","a","g"]

    while

    re:split("Erlang","([ln])",[{return,list}]).

    gives

    ["Er","l","a","n","g"]

    The text matching the subexpression (marked by the parentheses in the regular +subexpressions are returned in the resulting list as well. For example:

    re:split("Erlang","[ln]",[{return,list}]).

    gives

    ["Er","a","g"]

    while

    re:split("Erlang","([ln])",[{return,list}]).

    gives

    ["Er","l","a","n","g"]

    The text matching the subexpression (marked by the parentheses in the regular expression) is inserted in the result list where it was found. This means that concatenating the result of a split where the whole regular expression is a single subexpression (as in the last example) always results in the original @@ -2631,21 +2631,21 @@ "g"), nothing is inserted after that. To make the group of strings and the parts matching the subexpressions more obvious, one can use option group, which groups together the part of the subject string with the parts matching the -subexpressions when the string was split:

    re:split("Erlang","([ln])",[{return,list},group]).

    gives

    [["Er","l"],["a","n"],["g"]]

    Here the regular expression first matched the "l", causing "Er" to be the first +subexpressions when the string was split:

    re:split("Erlang","([ln])",[{return,list},group]).

    gives

    [["Er","l"],["a","n"],["g"]]

    Here the regular expression first matched the "l", causing "Er" to be the first part in the result. When the regular expression matched, the (only) subexpression was bound to the "l", so the "l" is inserted in the group together with "Er". The next match is of the "n", making "a" the next part to be returned. As the subexpression is bound to substring "n" in this case, the "n" is inserted into this group. The last group consists of the remaining string, as no more matches are found.

    By default, all parts of the string, including the empty strings, are returned -from the function, for example:

    re:split("Erlang","[lg]",[{return,list}]).

    gives

    ["Er","an",[]]

    as the matching of the "g" in the end of the string leaves an empty rest, which +from the function, for example:

    re:split("Erlang","[lg]",[{return,list}]).

    gives

    ["Er","an",[]]

    as the matching of the "g" in the end of the string leaves an empty rest, which is also returned. This behavior differs from the default behavior of the split function in Perl, where empty strings at the end are by default removed. To get -the "trimming" default behavior of Perl, specify trim as an option:

    re:split("Erlang","[lg]",[{return,list},trim]).

    gives

    ["Er","an"]

    The "trim" option says; "give me as many parts as possible except the empty +the "trimming" default behavior of Perl, specify trim as an option:

    re:split("Erlang","[lg]",[{return,list},trim]).

    gives

    ["Er","an"]

    The "trim" option says; "give me as many parts as possible except the empty ones", which sometimes can be useful. You can also specify how many parts you -want, by specifying {parts,N}:

    re:split("Erlang","[lg]",[{return,list},{parts,2}]).

    gives

    ["Er","ang"]

    Notice that the last part is "ang", not "an", as splitting was specified into /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/search.html 2025-05-10 20:19:23.909324635 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/search.html 2025-05-10 20:19:23.909324635 +0000 @@ -145,7 +145,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/sets.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/sets.html 2025-05-10 20:19:23.941324925 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/sets.html 2025-05-10 20:19:23.949324997 +0000 @@ -156,11 +156,11 @@ respect to the aforementioned functions, their overall behavior may differ. As mentioned, this module considers elements as different if and only if they do not match (=:=), while both ordsets and gb_sets consider elements -as different if and only if they do not compare equal (==).

    Example:

    1> sets:is_element(1.0, sets:from_list([1])).
    +as different if and only if they do not compare equal (==).

    Example:

    1> sets:is_element(1.0, sets:from_list([1])).
     false
    -2> ordsets:is_element(1.0, ordsets:from_list([1])).
    +2> ordsets:is_element(1.0, ordsets:from_list([1])).
     true
    -2> gb_sets:is_element(1.0, gb_sets:from_list([1])).
    +2> gb_sets:is_element(1.0, gb_sets:from_list([1])).
     true

    @@ -1226,7 +1226,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/shell.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/shell.html 2025-05-10 20:19:23.985325324 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/shell.html 2025-05-10 20:19:24.001325469 +0000 @@ -166,7 +166,7 @@ definitions. To facilitate matters, record definitions in modules shell_default and user_default (if loaded) are read each time a new job is started. For example, adding the following line to user_default makes the -definition of file_info readily available in the shell:

    -include_lib("kernel/include/file.hrl").

    The shell runs in two modes:

    Command 1 sets variable Str to string "abcd".

    2> L = length(Str).
    +4

    Command 2 sets L to the length of string Str.

    3> Descriptor = {L, list_to_atom(Str)}.
    +{4,abcd}

    Command 3 builds the tuple Descriptor, evaluating the BIF list_to_atom/1 .

    4> L.
    -4

    Command 4 prints the value of variable L.

    5> b().
    -Descriptor = {4,abcd}
    +4

    Command 4 prints the value of variable L.

    5> b().
    +Descriptor = {4,abcd}
     L = 4
     Str = "abcd"
     ok

    Command 5 evaluates the internal shell command b(), which is an abbreviation of "bindings". This prints the current shell variables and their bindings. ok -at the end is the return value of function b().

    6> f(L).
    +at the end is the return value of function b().

    6> f(L).
     ok

    Command 6 evaluates the internal shell command f(L) (abbreviation of -"forget"). The value of variable L is removed.

    7> b().
    -Descriptor = {4,abcd}
    +"forget"). The value of variable L is removed.

    7> b().
    +Descriptor = {4,abcd}
     Str = "abcd"
    -ok

    Command 7 prints the new bindings.

    8> f(L).
    -ok

    Command 8 has no effect, as L has no value.

    9> {L, _} = Descriptor.
    -{4,abcd}

    Command 9 performs a pattern matching operation on Descriptor, binding a new +ok

    Command 7 prints the new bindings.

    8> f(L).
    +ok

    Command 8 has no effect, as L has no value.

    9> {L, _} = Descriptor.
    +{4,abcd}

    Command 9 performs a pattern matching operation on Descriptor, binding a new value to L.

    10> L.
    -4

    Command 10 prints the current value of L.

    11> {P, Q, R} = Descriptor.
    +4

    Command 10 prints the current value of L.

    11> {P, Q, R} = Descriptor.
     ** exception error: no match of right hand side value {4,abcd}

    Command 11 tries to match {P, Q, R} against Descriptor, which is {4, abc}. The match fails and none of the new variables become bound. The printout starting with "** exception error:" is not the value of the expression (the @@ -266,74 +266,74 @@ other variables (L, Str, and so on) are unchanged.

    12> P.
     * 1:1: variable 'P' is unbound
     13> Descriptor.
    -{4,abcd}

    Commands 12 and 13 show that P is unbound because the previous command failed, -and that Descriptor has not changed.

    14>{P, Q} = Descriptor.
    -{4,abcd}
    +{4,abcd}

    Commands 12 and 13 show that P is unbound because the previous command failed, +and that Descriptor has not changed.

    14>{P, Q} = Descriptor.
    +{4,abcd}
     15> P.
    -4

    Commands 14 and 15 show a correct match where P and Q are bound.

    16> f().
    -ok

    Command 16 clears all bindings.

    The next few commands assume that test1:demo(X) is defined as follows:

    demo(X) ->
    -    put(aa, worked),
    +4

    Commands 14 and 15 show a correct match where P and Q are bound.

    16> f().
    +ok

    Command 16 clears all bindings.

    The next few commands assume that test1:demo(X) is defined as follows:

    demo(X) ->
    +    put(aa, worked),
         X = 1,
    -    X + 10.
    17> put(aa, hello).
    +    X + 10.
    17> put(aa, hello).
     undefined
    -18> get(aa).
    +18> get(aa).
     hello

    Commands 17 and 18 set and inspect the value of item aa in the process -dictionary.

    19> Y = test1:demo(1).
    +dictionary.

    19> Y = test1:demo(1).
     11

    Command 19 evaluates test1:demo(1). The evaluation succeeds and the changes made in the process dictionary become visible to the shell. The new value of -dictionary item aa can be seen in command 20.

    20> get().
    -[{aa,worked}]
    -21> put(aa, hello).
    +dictionary item aa can be seen in command 20.

    20> get().
    +[{aa,worked}]
    +21> put(aa, hello).
     worked
    -22> Z = test1:demo(2).
    +22> Z = test1:demo(2).
     ** exception error: no match of right hand side value 1
          in function  test1:demo/1

    Commands 21 and 22 change the value of dictionary item aa to hello and call test1:demo(2). Evaluation fails and the changes made to the dictionary in test1:demo(2), before the error occurred, are discarded.

    23> Z.
     * 1:1: variable 'Z' is unbound
    -24> get(aa).
    +24> get(aa).
     hello

    Commands 23 and 24 show that Z was not bound and that dictionary item aa has -retained its original value.

    25> erase(), put(aa, hello).
    +retained its original value.

    25> erase(), put(aa, hello).
     undefined
    -26> spawn(test1, demo, [1]).
    +26> spawn(test1, demo, [1]).
     <0.57.0>
    -27> get(aa).
    +27> get(aa).
     hello

    Commands 25, 26, and 27 show the effect of evaluating test1:demo(1) in the background. In this case, the expression is evaluated in a newly spawned process. Any changes made in the process dictionary are local to the newly -spawned process and therefore not visible to the shell.

    28> io:format("hello hello\n").
    +spawned process and therefore not visible to the shell.

    28> io:format("hello hello\n").
     hello hello
     ok
    -29> e(28).
    +29> e(28).
     hello hello
     ok
    -30> v(28).
    +30> v(28).
     ok

    Commands 28, 29 and 30 use the history facilities of the shell. Command 29 re-evaluates command 28. Command 30 uses the value (result) of command 28. In the cases of a pure function (a function with no side effects), the result is the same. For a function with side effects, the result can be different.

    The next few commands show some record manipulation. It is assumed that ex.erl -defines a record as follows:

    -record(rec, {a, b = val()}).

    val() ->
        3.

    31> c(ex).
    -{ok,ex}
    -32> rr(ex).
    -[rec]

    Commands 31 and 32 compile file ex.erl and read the record definitions in +defines a record as follows:

    -record(rec, {a, b = val()}).

    val() ->
        3.

    31> c(ex).
    +{ok,ex}
    +32> rr(ex).
    +[rec]

    Commands 31 and 32 compile file ex.erl and read the record definitions in ex.beam. If the compiler did not output any record definitions on the BEAM -file, rr(ex) tries to read record definitions from the source file instead.

    33> rl(rec).
    --record(rec,{a,b = val()}).
    -ok

    Command 33 prints the definition of the record named rec.

    34> #rec{}.
    +file, rr(ex) tries to read record definitions from the source file instead.

    33> rl(rec).
    +-record(rec,{a,b = val()}).
    +ok

    Command 33 prints the definition of the record named rec.

    34> #rec{}.
     ** exception error: undefined shell command val/0

    Command 34 tries to create a rec record, but fails as function val/0 is -undefined.

    35> #rec{b = 3}.
    -#rec{a = undefined,b = 3}

    Command 35 shows the workaround: explicitly assign values to record fields that -cannot otherwise be initialized.

    36> rp(v(-1)).
    -#rec{a = undefined,b = 3}
    +undefined.

    35> #rec{b = 3}.
    +#rec{a = undefined,b = 3}

    Command 35 shows the workaround: explicitly assign values to record fields that +cannot otherwise be initialized.

    36> rp(v(-1)).
    +#rec{a = undefined,b = 3}
     ok

    Command 36 prints the newly created record using record definitions maintained -by the shell.

    37> rd(rec, {f = orddict:new()}).
    +by the shell.

    37> rd(rec, {f = orddict:new()}).
     rec

    Command 37 defines a record directly in the shell. The definition replaces the -one read from file ex.beam.

    38> #rec{}.
    -#rec{f = []}
    -ok

    Command 38 creates a record using the new definition, and prints the result.

    39> rd(rec, {c}), A.
    +one read from file ex.beam.

    38> #rec{}.
    +#rec{f = []}
    +ok

    Command 38 creates a record using the new definition, and prints the result.

    39> rd(rec, {c}), A.
     * 1:15: variable 'A' is unbound
    -40> #rec{}.
    -#rec{c = undefined}
    +40> #rec{}.
    +#rec{c = undefined}
     ok

    Command 39 and 40 show that record definitions are updated as side effects. The evaluation of the command fails, but the definition of rec has been carried out.

    For the next command, it is assumed that test1:loop(N) is defined as follows:

    loop(N) ->
        io:format("Hello Number: ~w~n", [N]),
        loop(N+1).

    41> test1:loop(0).
    @@ -359,31 +359,31 @@
     JCL mode the user can start and stop jobs.

    In this particular case, command i ("interrupt") terminates the looping program, and command c connects to the shell again. As the process was running in the background before we killed it, more printouts occur before message -"** exception exit: killed" is shown.

    42> E = ets:new(t, []).
    -#Ref<0.1662103692.2407923716.214192>

    Command 42 creates an ETS table.

    43> ets:insert({d,1,2}).
    +"** exception exit: killed" is shown.

    42> E = ets:new(t, []).
    +#Ref<0.1662103692.2407923716.214192>

    Command 42 creates an ETS table.

    43> ets:insert({d,1,2}).
     ** exception error: undefined function ets:insert/1

    Command 43 tries to insert a tuple into the ETS table, but the first argument -(the table) is missing. The exception kills the evaluator process.

    44> ets:insert(E, {d,1,2}).
    +(the table) is missing. The exception kills the evaluator process.

    44> ets:insert(E, {d,1,2}).
     ** exception error: argument is of wrong type
          in function  ets:insert/2
             called as ets:insert(16,{d,1,2})

    Command 44 corrects the mistake, but the ETS table has been destroyed as it was -owned by the killed evaluator process.

    45> f(E).
    +owned by the killed evaluator process.

    45> f(E).
     ok
    -46> catch_exception(true).
    +46> catch_exception(true).
     false

    Command 46 sets the exception handling of the evaluator process to true. The exception handling can also be set when starting Erlang by -erl -stdlib shell_catch_exception true.

    47> E = ets:new(t, []).
    +erl -stdlib shell_catch_exception true.

    47> E = ets:new(t, []).
     #Ref<0.1662103692.2407923716.214197>
    -48> ets:insert({d,1,2}).
    +48> ets:insert({d,1,2}).
     * exception error: undefined function ets:insert/1

    Command 48 makes the same mistake as in command 43, but this time the evaluator process lives on. The single star at the beginning of the printout signals that -the exception has been caught.

    49> ets:insert(E, {d,1,2}).
    -true

    Command 49 successfully inserts the tuple into the ETS table.

    50> ets:insert(#Ref<0.1662103692.2407923716.214197>, {e,3,4}).
    +the exception has been caught.

    49> ets:insert(E, {d,1,2}).
    +true

    Command 49 successfully inserts the tuple into the ETS table.

    50> ets:insert(#Ref<0.1662103692.2407923716.214197>, {e,3,4}).
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/shell_default.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/shell_default.html	2025-05-10 20:19:24.021325650 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/shell_default.html	2025-05-10 20:19:24.025325686 +0000
    @@ -129,10 +129,10 @@
     
         

    Customizing the Erlang environment.

    The functions in this module are called when no module name is specified in a -shell command.

    Consider the following shell dialog:

    1> lists:reverse("abc").
    +shell command.

    Consider the following shell dialog:

    1> lists:reverse("abc").
     "cba"
    -2> c(foo).
    -{ok, foo}

    In command one, module lists is called. In command two, no module name is +2> c(foo). +{ok, foo}

    In command one, module lists is called. In command two, no module name is specified. The shell searches module user_default followed by module shell_default for function c/1.

    shell_default is intended for "system wide" customizations to the shell. user_default is intended for "local" or individual user customizations.

    @@ -237,7 +237,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/shell_docs.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/shell_docs.html 2025-05-10 20:19:24.053325940 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/shell_docs.html 2025-05-10 20:19:24.061326013 +0000 @@ -1294,7 +1294,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/slave.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/slave.html 2025-05-10 20:19:24.089326266 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/slave.html 2025-05-10 20:19:24.093326303 +0000 @@ -375,7 +375,7 @@ at a master node. A pseudo server is an intermediary that only has the same registered name as the real server.

    For example, if you have started a slave node N and want to execute pxw graphics code on this node, you can start server pxw_server as a pseudo server -at the slave node. This is illustrated as follows:

    rpc:call(N, slave, pseudo, [node(), [pxw_server]]).
    +at the slave node. This is illustrated as follows:

    rpc:call(N, slave, pseudo, [node(), [pxw_server]]).

    @@ -529,9 +529,9 @@ passed to the new node and can be used for a variety of purposes; see erl(1).

    As an example, suppose that you want to start a slave node at host H with node name Name@H and want the slave node to have the following properties:

    • Directory Dir is to be added to the code path.
    • The Mnesia directory is to be set to M.
    • The Unix DISPLAY environment variable is to be set to the display of the -master node.

    The following code is executed to achieve this:

    E = " -env DISPLAY " ++ net_adm:localhost() ++ ":0 ",
    +master node.

    The following code is executed to achieve this:

    E = " -env DISPLAY " ++ net_adm:localhost() ++ ":0 ",
     Arg = "-mnesia_dir " ++ M ++ " -pa " ++ Dir ++ E,
    -slave:start(H, Name, Arg).

    The function returns {ok, Node}, where Node is the name of the new node, +slave:start(H, Name, Arg).

    The function returns {ok, Node}, where Node is the name of the new node, otherwise {error, Reason}, where Reason can be one of:

    • timeout - The master node failed to get in contact with the slave node. This can occur in a number of circumstances:

      • Erlang/OTP is not installed on the remote host.
      • The file system on the other host has a different structure to the the master.
      • The Erlang nodes have different cookies.
    • no_rsh - No remote shell program was found on the computer. Note that @@ -710,7 +710,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/sofs.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/sofs.html 2025-05-10 20:19:24.169326992 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/sofs.html 2025-05-10 20:19:24.209327354 +0000 @@ -262,11 +262,11 @@ selecting, duplicating, or rearranging parts of the elements.
    • Specifying a SetFun as an integer I is equivalent to specifying {external, fun(X) -> element(I, X) end}, but is to be preferred, as it makes it possible to handle this case even more efficiently.

    Examples of SetFuns:

    fun sofs:union/1
    -fun(S) -> sofs:partition(1, S) end
    -{external, fun(A) -> A end}
    -{external, fun({A,_,C}) -> {C,A} end}
    -{external, fun({_,{_,C}}) -> C end}
    -{external, fun({_,{_,{_,E}=C}}) -> {E,{E,C}} end}
    +fun(S) -> sofs:partition(1, S) end
    +{external, fun(A) -> A end}
    +{external, fun({A,_,C}) -> {C,A} end}
    +{external, fun({_,{_,C}}) -> C end}
    +{external, fun({_,{_,{_,E}=C}}) -> {E,{E,C}} end}
     2

    The order in which a SetFun is applied to the elements of an unordered set is not specified, and can change in future versions of this module.

    The execution time of the functions of this module is dominated by the time it takes to sort lists. When no sorting is needed, the execution time is in the @@ -1832,10 +1832,10 @@ belongs to SetOfSets and E belongs to Set.

    If SetOfSets is a partition of a set X and R is the equivalence relation in X induced by SetOfSets, then the returned relation is the canonical map from X onto the equivalence classes with -respect to R.

    1> Ss = sofs:from_term([[a,b],[b,c]]),
    -CR = sofs:canonical_relation(Ss),
    -sofs:to_external(CR).
    -[{a,[a,b]},{b,[a,b]},{b,[b,c]},{c,[b,c]}]
    +respect to R.

    1> Ss = sofs:from_term([[a,b],[b,c]]),
    +CR = sofs:canonical_relation(Ss),
    +sofs:to_external(CR).
    +[{a,[a,b]},{b,[a,b]},{b,[b,c]},{c,[b,c]}]
    @@ -1865,11 +1865,11 @@

    Returns the composite of the functions Function1 and -Function2.

    1> F1 = sofs:a_function([{a,1},{b,2},{c,2}]),
    -F2 = sofs:a_function([{1,x},{2,y},{3,z}]),
    -F = sofs:composite(F1, F2),
    -sofs:to_external(F).
    -[{a,x},{b,y},{c,y}]
    +Function2.

    1> F1 = sofs:a_function([{a,1},{b,2},{c,2}]),
    +F2 = sofs:a_function([{1,x},{2,y},{3,z}]),
    +F = sofs:composite(F1, F2),
    +sofs:to_external(F).
    +[{a,x},{b,y},{c,y}]
    @@ -1899,11 +1899,11 @@

    Creates the function that maps each element of set Set -onto AnySet.

    1> S = sofs:set([a,b]),
    -E = sofs:from_term(1),
    -R = sofs:constant_function(S, E),
    -sofs:to_external(R).
    -[{a,1},{b,1}]
    +onto AnySet.

    1> S = sofs:set([a,b]),
    +E = sofs:from_term(1),
    +R = sofs:constant_function(S, E),
    +sofs:to_external(R).
    +[{a,1},{b,1}]
    @@ -1931,10 +1931,10 @@ -

    Returns the converse of the binary relation BinRel1.

    1> R1 = sofs:relation([{1,a},{2,b},{3,a}]),
    -R2 = sofs:converse(R1),
    -sofs:to_external(R2).
    -[{a,1},{a,3},{b,2}]
    +

    Returns the converse of the binary relation BinRel1.

    1> R1 = sofs:relation([{1,a},{2,b},{3,a}]),
    +R2 = sofs:converse(R1),
    +sofs:to_external(R2).
    +[{a,1},{a,3},{b,2}]
    @@ -2052,10 +2052,10 @@ -

    Returns the domain of the binary relation BinRel.

    1> R = sofs:relation([{1,a},{1,b},{2,b},{2,c}]),
    -S = sofs:domain(R),
    -sofs:to_external(S).
    -[1,2]
    +

    Returns the domain of the binary relation BinRel.

    1> R = sofs:relation([{1,a},{1,b},{2,b},{2,c}]),
    +S = sofs:domain(R),
    +sofs:to_external(S).
    +[1,2]
    @@ -2085,11 +2085,11 @@

    Returns the difference between the binary relation BinRel1 and the -restriction of BinRel1 to Set.

    1> R1 = sofs:relation([{1,a},{2,b},{3,c}]),
    -S = sofs:set([2,4,6]),
    -R2 = sofs:drestriction(R1, S),
    -sofs:to_external(R2).
    -[{1,a},{3,c}]

    drestriction(R, S) is equivalent to +restriction of BinRel1 to Set.

    1> R1 = sofs:relation([{1,a},{2,b},{3,c}]),
    +S = sofs:set([2,4,6]),
    +R2 = sofs:drestriction(R1, S),
    +sofs:to_external(R2).
    +[{1,a},{3,c}]

    drestriction(R, S) is equivalent to difference(R, restriction(R, S)).

    @@ -2120,12 +2120,12 @@

    Returns a subset of Set1 containing those elements that do not give an element -in Set2 as the result of applying SetFun.

    1> SetFun = {external, fun({_A,B,C}) -> {B,C} end},
    -R1 = sofs:relation([{a,aa,1},{b,bb,2},{c,cc,3}]),
    -R2 = sofs:relation([{bb,2},{cc,3},{dd,4}]),
    -R3 = sofs:drestriction(SetFun, R1, R2),
    -sofs:to_external(R3).
    -[{a,aa,1}]

    drestriction(F, S1, S2) is equivalent to +in Set2 as the result of applying SetFun.

    1> SetFun = {external, fun({_A,B,C}) -> {B,C} end},
    +R1 = sofs:relation([{a,aa,1},{b,bb,2},{c,cc,3}]),
    +R2 = sofs:relation([{bb,2},{cc,3},{dd,4}]),
    +R3 = sofs:drestriction(SetFun, R1, R2),
    +sofs:to_external(R3).
    +[{a,aa,1}]

    drestriction(F, S1, S2) is equivalent to difference(S1, restriction(F, S1, S2)).

    @@ -2190,12 +2190,12 @@

    Returns the extension of BinRel1 such that for each element E in Set that does not belong to the domain of -BinRel1, BinRel2 contains the pair (E, AnySet).

    1> S = sofs:set([b,c]),
    -A = sofs:empty_set(),
    -R = sofs:family([{a,[1,2]},{b,[3]}]),
    -X = sofs:extension(R, S, A),
    -sofs:to_external(X).
    -[{a,[1,2]},{b,[3]},{c,[]}]
    +BinRel1, BinRel2 contains the pair (E, AnySet).

    1> S = sofs:set([b,c]),
    +A = sofs:empty_set(),
    +R = sofs:family([{a,[1,2]},{b,[3]}]),
    +X = sofs:extension(R, S, A),
    +sofs:to_external(X).
    +[{a,[1,2]},{b,[3]},{c,[]}]
    @@ -2284,11 +2284,11 @@

    If Family1 and Family2 are families, then Family3 is the family such that the index set is equal to the index set of Family1, and Family3[i] is the difference between Family1[i] and Family2[i] if -Family2 maps i, otherwise Family1[i].

    1> F1 = sofs:family([{a,[1,2]},{b,[3,4]}]),
    -F2 = sofs:family([{b,[4,5]},{c,[6,7]}]),
    -F3 = sofs:family_difference(F1, F2),
    -sofs:to_external(F3).
    -[{a,[1,2]},{b,[3]}]
    +Family2 maps i, otherwise Family1[i].

    1> F1 = sofs:family([{a,[1,2]},{b,[3,4]}]),
    +F2 = sofs:family([{b,[4,5]},{c,[6,7]}]),
    +F3 = sofs:family_difference(F1, F2),
    +sofs:to_external(F3).
    +[{a,[1,2]},{b,[3]}]
    @@ -2319,10 +2319,10 @@

    If Family1 is a family and Family1[i] is a binary relation for every i in the index set of Family1, then Family2 is the family with the same index set as Family1 such that Family2[i] is the -domain of Family1[i].

    1> FR = sofs:from_term([{a,[{1,a},{2,b},{3,c}]},{b,[]},{c,[{4,d},{5,e}]}]),
    -F = sofs:family_domain(FR),
    -sofs:to_external(F).
    -[{a,[1,2,3]},{b,[]},{c,[4,5]}]
    +domain of Family1[i].

    1> FR = sofs:from_term([{a,[{1,a},{2,b},{3,c}]},{b,[]},{c,[{4,d},{5,e}]}]),
    +F = sofs:family_domain(FR),
    +sofs:to_external(F).
    +[{a,[1,2,3]},{b,[]},{c,[4,5]}]
    @@ -2353,10 +2353,10 @@

    If Family1 is a family and Family1[i] is a binary relation for every i in the index set of Family1, then Family2 is the family with the same index set as Family1 such that Family2[i] is the -field of Family1[i].

    1> FR = sofs:from_term([{a,[{1,a},{2,b},{3,c}]},{b,[]},{c,[{4,d},{5,e}]}]),
    -F = sofs:family_field(FR),
    -sofs:to_external(F).
    -[{a,[1,2,3,a,b,c]},{b,[]},{c,[4,5,d,e]}]

    family_field(Family1) is equivalent to +field of Family1[i].

    1> FR = sofs:from_term([{a,[{1,a},{2,b},{3,c}]},{b,[]},{c,[{4,d},{5,e}]}]),
    +F = sofs:family_field(FR),
    +sofs:to_external(F).
    +[{a,[1,2,3,a,b,c]},{b,[]},{c,[4,5,d,e]}]

    family_field(Family1) is equivalent to family_union(family_domain(Family1), family_range(Family1)).

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/argparse.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/argparse.xhtml 2025-05-10 20:19:24.285328043 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/argparse.xhtml 2025-05-10 20:19:24.325328406 +0000 @@ -42,20 +42,20 @@ example below is a fully functioning Erlang program accepting two command line arguments and printing their product.

    #!/usr/bin/env escript
     
    -main(Args) ->
    -    argparse:run(Args, cli(), #{progname => mul}).
    +main(Args) ->
    +    argparse:run(Args, cli(), #{progname => mul}).
     
    -cli() ->
    -    #{
    -        arguments => [
    -            #{name => left, type => integer},
    -            #{name => right, type => integer}
    -        ],
    +cli() ->
    +    #{
    +        arguments => [
    +            #{name => left, type => integer},
    +            #{name => right, type => integer}
    +        ],
             handler =>
    -            fun (#{left := Left, right := Right}) ->
    -                io:format("~b~n", [Left * Right])
    +            fun (#{left := Left, right := Right}) ->
    +                io:format("~b~n", [Left * Right])
                 end
    -    }.

    Running this script with no arguments results in an error, accompanied by the + }.

    Running this script with no arguments results in an error, accompanied by the usage information.

    The cli function defines a single command with embedded handler accepting a map. Keys of the map are argument names as defined by the argument field of the command, left and right in the example. Values are taken from the @@ -69,25 +69,25 @@

    A command may contain nested commands, forming a hierarchy. Arguments defined at the upper level command are automatically added to all nested commands. Nested -commands example (assuming progname is nested):

    cli() ->
    -  #{
    +commands example (assuming progname is nested):

    cli() ->
    +  #{
         %% top level argument applicable to all commands
    -    arguments => [#{name => top}],
    -      commands => #{
    -        "first" => #{
    +    arguments => [#{name => top}],
    +      commands => #{
    +        "first" => #{
               %% argument applicable to "first" command and
               %%  all commands nested into "first"
    -          arguments => [#{name => mid}],
    -          commands => #{
    -            "second" => #{
    +          arguments => [#{name => mid}],
    +          commands => #{
    +            "second" => #{
                   %% argument only applicable for "second" command
    -              arguments => [#{name => bottom}],
    -              handler => fun (A) -> io:format("~p~n", [A]) end
    -          }
    -        }
    -      }
    -    }
    -  }.

    In the example above, a 3-level hierarchy is defined. First is the script itself + arguments => [#{name => bottom}], + handler => fun (A) -> io:format("~p~n", [A]) end + } + } + } + } + }.

    In the example above, a 3-level hierarchy is defined. First is the script itself (nested), accepting the only argument top. Since it has no associated handler, run/3 will not accept user input omitting nested command selection. For this example, user has to supply 5 arguments in the command line, two being @@ -105,14 +105,14 @@ on all operating systems). Both options and positional arguments have 1 or more associated values. See argument specification to find more details about supported combinations.

    In the user input, short options may be concatenated with their values. Long -options support values separated by =. Consider this definition:

    cli() ->
    -  #{
    -    arguments => [
    -      #{name => long, long => "-long"},
    -      #{name => short, short => $s}
    -    ],
    -    handler => fun (Args) -> io:format("~p~n", [Args]) end
    -  }.

    Running ./args --long=VALUE prints #{long => "VALUE"}, running +options support values separated by =. Consider this definition:

    cli() ->
    +  #{
    +    arguments => [
    +      #{name => long, long => "-long"},
    +      #{name => short, short => $s}
    +    ],
    +    handler => fun (Args) -> io:format("~p~n", [Args]) end
    +  }.

    Running ./args --long=VALUE prints #{long => "VALUE"}, running ./args -sVALUE prints #{short => "VALUE"}

    argparse supports boolean flags concatenation: it is possible to shorten -r -f -v to -rfv.

    Shortened option names are not supported: it is not possible to use --my-argum instead of --my-argument-name even when such option can be unambiguously @@ -492,111 +492,111 @@ which case resulting argument map will either contain the default value, or not have the key at all.

    • name - Sets the argument name in the parsed argument map. If help is not defined, name is also used to generate the default usage message.

    • short - Defines a short (single character) form of an optional argument.

      %% Define a command accepting argument named myarg, with short form $a:
      -1> Cmd = #{arguments => [#{name => myarg, short => $a}]}.
      +1> Cmd = #{arguments => [#{name => myarg, short => $a}]}.
       %% Parse command line "-a str":
      -2> {ok, ArgMap, _, _} = argparse:parse(["-a", "str"], Cmd), ArgMap.
      +2> {ok, ArgMap, _, _} = argparse:parse(["-a", "str"], Cmd), ArgMap.
       
      -#{myarg => "str"}
      +#{myarg => "str"}
       
       %% Option value can be concatenated with the switch: "-astr"
      -3> {ok, ArgMap, _, _} = argparse:parse(["-astr"], Cmd), ArgMap.
      +3> {ok, ArgMap, _, _} = argparse:parse(["-astr"], Cmd), ArgMap.
       
      -#{myarg => "str"}

      By default all options expect a single value following the option switch. The -only exception is an option of a boolean type.

    • long - Defines a long form of an optional argument.

      1> Cmd = #{arguments => [#{name => myarg, long => "name"}]}.
      +#{myarg => "str"}

      By default all options expect a single value following the option switch. The +only exception is an option of a boolean type.

    • long - Defines a long form of an optional argument.

      1> Cmd = #{arguments => [#{name => myarg, long => "name"}]}.
       %% Parse command line "-name Erlang":
      -2> {ok, ArgMap, _, _} = argparse:parse(["-name", "Erlang"], Cmd), ArgMap.
      +2> {ok, ArgMap, _, _} = argparse:parse(["-name", "Erlang"], Cmd), ArgMap.
       
      -#{myarg => "Erlang"}
      +#{myarg => "Erlang"}
       %% Or use "=" to separate the switch and the value:
      -3> {ok, ArgMap, _, _} = argparse:parse(["-name=Erlang"], Cmd), ArgMap.
      +3> {ok, ArgMap, _, _} = argparse:parse(["-name=Erlang"], Cmd), ArgMap.
       
      -#{myarg => "Erlang"}

      If neither short not long is defined, the argument is treated as +#{myarg => "Erlang"}

    If neither short not long is defined, the argument is treated as positional.

  • required - Forces the parser to expect the argument to be present in the command line. By default, all positional argument are required, and all options are not.

  • default - Specifies the default value to put in the parsed argument map -if the value is not supplied in the command line.

    1> argparse:parse([], #{arguments => [#{name => myarg, short => $m}]}).
    +if the value is not supplied in the command line.

    1> argparse:parse([], #{arguments => [#{name => myarg, short => $m}]}).
     
    -{ok,#{}, ...
    -2> argparse:parse([], #{arguments => [#{name => myarg, short => $m, default => "def"}]}).
    +{ok,#{}, ...
    +2> argparse:parse([], #{arguments => [#{name => myarg, short => $m, default => "def"}]}).
     
    -{ok,#{myarg => "def"}, ...
  • type - Defines type conversion and validation routine. The default is +{ok,#{myarg => "def"}, ...

  • type - Defines type conversion and validation routine. The default is string, assuming no conversion.

  • nargs - Defines the number of following arguments to consume from the command line. By default, the parser consumes the next argument and converts it into an Erlang term according to the specified type.

    • pos_integer/0 - Consume exactly this number of positional arguments, fail if there is not enough. Value in the argument map contains a list of exactly this length. Example, defining a positional argument expecting 3 -integer values:

      1> Cmd = #{arguments => [#{name => ints, type => integer, nargs => 3}]},
      -argparse:parse(["1", "2", "3"], Cmd).
      +integer values:

      1> Cmd = #{arguments => [#{name => ints, type => integer, nargs => 3}]},
      +argparse:parse(["1", "2", "3"], Cmd).
       
      -{ok, #{ints => [1, 2, 3]}, ...

      Another example defining an option accepted as -env and expecting two -string arguments:

      1> Cmd = #{arguments => [#{name => env, long => "env", nargs => 2}]},
      -argparse:parse(["-env", "key", "value"], Cmd).
      +{ok, #{ints => [1, 2, 3]}, ...

      Another example defining an option accepted as -env and expecting two +string arguments:

      1> Cmd = #{arguments => [#{name => env, long => "env", nargs => 2}]},
      +argparse:parse(["-env", "key", "value"], Cmd).
       
      -{ok, #{env => ["key", "value"]}, ...
    • list - Consume all following arguments until hitting the next option +{ok, #{env => ["key", "value"]}, ...

  • list - Consume all following arguments until hitting the next option (starting with an option prefix). May result in an empty list added to the -arguments map.

    1> Cmd = #{arguments => [
    -  #{name => nodes, long => "nodes", nargs => list},
    -  #{name => verbose, short => $v, type => boolean}
    -]},
    -argparse:parse(["-nodes", "one", "two", "-v"], Cmd).
    +arguments map.

    1> Cmd = #{arguments => [
    +  #{name => nodes, long => "nodes", nargs => list},
    +  #{name => verbose, short => $v, type => boolean}
    +]},
    +argparse:parse(["-nodes", "one", "two", "-v"], Cmd).
     
    -{ok, #{nodes => ["one", "two"], verbose => true}, ...
  • nonempty_list - Same as list, but expects at least one argument. +{ok, #{nodes => ["one", "two"], verbose => true}, ...

  • nonempty_list - Same as list, but expects at least one argument. Returns an error if the following command line argument is an option switch (starting with the prefix).

  • 'maybe' - Consumes the next argument from the command line, if it does not start with an option prefix. Otherwise, adds a default value to the -arguments map.

    1> Cmd = #{arguments => [
    -  #{name => level, short => $l, nargs => 'maybe', default => "error"},
    -  #{name => verbose, short => $v, type => boolean}
    -]},
    -argparse:parse(["-l", "info", "-v"], Cmd).
    +arguments map.

    1> Cmd = #{arguments => [
    +  #{name => level, short => $l, nargs => 'maybe', default => "error"},
    +  #{name => verbose, short => $v, type => boolean}
    +]},
    +argparse:parse(["-l", "info", "-v"], Cmd).
     
    -{ok,#{level => "info",verbose => true}, ...
    +{ok,#{level => "info",verbose => true}, ...
     
     %% When "info" is omitted, argument maps receives the default "error"
    -2> argparse:parse(["-l", "-v"], Cmd).
    +2> argparse:parse(["-l", "-v"], Cmd).
     
    -{ok,#{level => "error",verbose => true}, ...
  • {'maybe', term()} - Consumes the next argument from the command line, +{ok,#{level => "error",verbose => true}, ...

  • {'maybe', term()} - Consumes the next argument from the command line, /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/array.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/array.xhtml 2025-05-10 20:19:24.281328007 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/array.xhtml 2025-05-10 20:19:24.325328406 +0000 @@ -31,14 +31,14 @@ reset/2). If you need to differentiate between unset and set entries, ensure that the default value cannot be confused with the values of set entries.

    The array never shrinks automatically. If an index I has been used to set an entry successfully, all indices in the range [0,I] stay accessible unless the -array size is explicitly changed by calling resize/2.

    Examples:

    Create a fixed-size array with entries 0-9 set to undefined:

    A0 = array:new(10).
    -10 = array:size(A0).

    Create an extendible array and set entry 17 to true, causing the array to grow -automatically:

    A1 = array:set(17, true, array:new()).
    -18 = array:size(A1).

    Read back a stored value:

    true = array:get(17, A1).

    Accessing an unset entry returns default value:

    undefined = array:get(3, A1)

    Accessing an entry beyond the last set entry also returns the default value, if -the array does not have fixed size:

    undefined = array:get(18, A1).

    "Sparse" functions ignore default-valued entries:

    A2 = array:set(4, false, A1).
    -[{4, false}, {17, true}] = array:sparse_to_orddict(A2).

    An extendible array can be made fixed-size later:

    A3 = array:fix(A2).

    A fixed-size array does not grow automatically and does not allow accesses -beyond the last set entry:

    {'EXIT',{badarg,_}} = (catch array:set(18, true, A3)).
    -{'EXIT',{badarg,_}} = (catch array:get(18, A3)).
    +array size is explicitly changed by calling resize/2.

    Examples:

    Create a fixed-size array with entries 0-9 set to undefined:

    A0 = array:new(10).
    +10 = array:size(A0).

    Create an extendible array and set entry 17 to true, causing the array to grow +automatically:

    A1 = array:set(17, true, array:new()).
    +18 = array:size(A1).

    Read back a stored value:

    true = array:get(17, A1).

    Accessing an unset entry returns default value:

    undefined = array:get(3, A1)

    Accessing an entry beyond the last set entry also returns the default value, if +the array does not have fixed size:

    undefined = array:get(18, A1).

    "Sparse" functions ignore default-valued entries:

    A2 = array:set(4, false, A1).
    +[{4, false}, {17, true}] = array:sparse_to_orddict(A2).

    An extendible array can be made fixed-size later:

    A3 = array:fix(A2).

    A fixed-size array does not grow automatically and does not allow accesses +beyond the last set entry:

    {'EXIT',{badarg,_}} = (catch array:set(18, true, A3)).
    +{'EXIT',{badarg,_}} = (catch array:get(18, A3)).
    @@ -1063,7 +1063,7 @@ array size; this also implies {fixed, true}. If N is not a non-negative integer, the call fails with reason badarg.

  • fixed or {fixed, true} - Creates a fixed-size array. See also fix/1.

  • {fixed, false} - Creates an extendible (non-fixed-size) array.

  • {default, Value} - Sets the default value for the array to Value.

  • Options are processed in the order they occur in the list, that is, later options have higher precedence.

    The default value is used as the value of uninitialized entries, and cannot be -changed once the array has been created.

    Examples:

    array:new(100)

    creates a fixed-size array of size 100.

    array:new({default,0})

    creates an empty, extendible array whose default value is 0.

    array:new([{size,10},{fixed,false},{default,-1}])

    creates an extendible array with initial size 10 whose default value is -1.

    See also fix/1, from_list/2, get/2, new/0, new/2, set/3.

    +changed once the array has been created.

    Examples:

    array:new(100)

    creates a fixed-size array of size 100.

    array:new({default,0})

    creates an empty, extendible array whose default value is 0.

    array:new([{size,10},{fixed,false},{default,-1}])

    creates an extendible array with initial size 10 whose default value is -1.

    See also fix/1, from_list/2, get/2, new/0, new/2, set/3.

    @@ -1096,7 +1096,7 @@ Options override parameter Size.

    If Options is a list, this is equivalent to new([{size, Size} | Options]), otherwise it is equivalent to new([{size, Size} | [Options]]). However, using this function -directly is more efficient.

    Example:

    array:new(100, {default,0})

    creates a fixed-size array of size 100, whose default value is 0.

    See also new/1.

    +directly is more efficient.

    Example:

    array:new(100, {default,0})

    creates a fixed-size array of size 100, whose default value is 0.

    See also new/1.

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/assert_hrl.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/assert_hrl.xhtml 2025-05-10 20:19:24.281328007 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/assert_hrl.xhtml 2025-05-10 20:19:24.325328406 +0000 @@ -27,7 +27,7 @@ Description

    The include file assert.hrl provides macros for inserting assertions in your -program code.

    Include the following directive in the module from which the function is called:

    -include_lib("stdlib/include/assert.hrl").

    When an assertion succeeds, the assert macro yields the atom ok. When an +program code.

    Include the following directive in the module from which the function is called:

    -include_lib("stdlib/include/assert.hrl").

    When an assertion succeeds, the assert macro yields the atom ok. When an assertion fails, an exception of type error is generated. The associated error term has the form {Macro, Info}. Macro is the macro name, for example, assertEqual. Info is a list of tagged values, such as @@ -55,7 +55,7 @@

    • assert(BoolExpr)

    • assert(BoolExpr, Comment) - Tests that BoolExpr completes normally returning true.

    • assertNot(BoolExpr)

    • assertNot(BoolExpr, Comment) - Tests that BoolExpr completes normally returning false.

    • assertMatch(GuardedPattern, Expr)

    • assertMatch(GuardedPattern, Expr, Comment) - Tests that Expr completes -normally yielding a value that matches GuardedPattern, for example:

      ?assertMatch({bork, _}, f())

      Notice that a guard when ... can be included:

      ?assertMatch({bork, X} when X > 0, f())
    • assertNotMatch(GuardedPattern, Expr)

    • assertNotMatch(GuardedPattern, Expr, Comment) - Tests that Expr +normally yielding a value that matches GuardedPattern, for example:

      ?assertMatch({bork, _}, f())

      Notice that a guard when ... can be included:

      ?assertMatch({bork, X} when X > 0, f())
    • assertNotMatch(GuardedPattern, Expr)

    • assertNotMatch(GuardedPattern, Expr, Comment) - Tests that Expr completes normally yielding a value that does not match GuardedPattern.

      As in assertMatch, GuardedPattern can have a when part.

    • assertEqual(ExpectedValue, Expr)

    • assertEqual(ExpectedValue, Expr, Comment) - Tests that Expr completes normally yielding a value that is exactly equal to ExpectedValue.

    • assertNotEqual(ExpectedValue, Expr)

    • assertNotEqual(ExpectedValue, Expr, Comment) - Tests that Expr completes normally yielding a value that is not exactly equal to /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/base64.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/base64.xhtml 2025-05-10 20:19:24.281328007 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/base64.xhtml 2025-05-10 20:19:24.325328406 +0000 @@ -550,15 +550,15 @@

      Decodes a base64 string encoded using the standard alphabet according to RFC 4648 Section 4 to plain ASCII.

      The function will strips away any whitespace characters and check for the -the correct number of = padding characters at the end of the encoded string.

      See decode_options/0 for details on which options can be passed.

      Example:

      1> base64:decode("AQIDBA==").
      +the correct number of = padding characters at the end of the encoded string.

      See decode_options/0 for details on which options can be passed.

      Example:

      1> base64:decode("AQIDBA==").
       <<1,2,3,4>>
      -2> base64:decode("AQ ID BA==").
      +2> base64:decode("AQ ID BA==").
       <<1,2,3,4>>
      -3> base64:decode("AQIDBA=").
      +3> base64:decode("AQIDBA=").
       ** exception error: missing_padding
            in function  base64:decode_list/7 (base64.erl, line 734)
               *** data to decode is missing final = padding characters, if this is intended, use the `padding => false` option
      -4> base64:decode("AQIDBA=", #{ padding => false }).
      +4> base64:decode("AQIDBA=", #{ padding => false }).
       <<1,2,3,4>>
    @@ -813,9 +813,9 @@

    Decodes a base64 "mime" string encoded using the standard alphabet according to RFC 4648 Section 4 to plain ASCII.

    The function will strips away any illegal characters. It does not check for the -the correct number of = padding characters at the end of the encoded string.

    See decode_options/0 for details on which options can be passed.

    Example:

    1> base64:mime_decode("AQIDBA==").
    +the correct number of = padding characters at the end of the encoded string.

    See decode_options/0 for details on which options can be passed.

    Example:

    1> base64:mime_decode("AQIDBA==").
     <<1,2,3,4>>
    -2> base64:mime_decode("AQIDB=A=").
    +2> base64:mime_decode("AQIDB=A=").
     <<1,2,3,4>>
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/beam_lib.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/beam_lib.xhtml 2025-05-10 20:19:24.281328007 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/beam_lib.xhtml 2025-05-10 20:19:24.325328406 +0000 @@ -46,8 +46,8 @@ Reconstruct Source Code

    The following example shows how to reconstruct Erlang source code from the debug -information in a BEAM file Beam:

    {ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(Beam,[abstract_code]).
    -io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).

    +information in a BEAM file Beam:

    {ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(Beam,[abstract_code]).
    +io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).

    @@ -77,13 +77,13 @@ user's home directory and then filename:basedir(user_config, "erlang"). If the file is found and contains a key, beam_lib implicitly creates a crypto key fun -and registers it.

    File .erlang.crypt is to contain a single list of tuples:

    {debug_info, Mode, Module, Key}

    Mode is the type of crypto algorithm; currently, the only allowed value is +and registers it.

    File .erlang.crypt is to contain a single list of tuples:

    {debug_info, Mode, Module, Key}

    Mode is the type of crypto algorithm; currently, the only allowed value is des3_cbc. Module is either an atom, in which case Key is only used for the module Module, or [], in which case Key is used for all modules. Key is the non-empty key string.

    Key in the first tuple where both Mode and Module match is used.

    The following is an example of an .erlang.crypt file that returns the same key -for all modules:

    [{debug_info, des3_cbc, [], "%>7}|pc/DM6Cga*68$Mw]L#&_Gejr]G^"}].

    The following is a slightly more complicated example of an .erlang.crypt -providing one key for module t and another key for all other modules:

    [{debug_info, des3_cbc, t, "My KEY"},
    - {debug_info, des3_cbc, [], "%>7}|pc/DM6Cga*68$Mw]L#&_Gejr]G^"}].

    Note

    Do not use any of the keys in these examples. Use your own keys.

    +for all modules:

    [{debug_info, des3_cbc, [], "%>7}|pc/DM6Cga*68$Mw]L#&_Gejr]G^"}].

    The following is a slightly more complicated example of an .erlang.crypt +providing one key for module t and another key for all other modules:

    [{debug_info, des3_cbc, t, "My KEY"},
    + {debug_info, des3_cbc, [], "%>7}|pc/DM6Cga*68$Mw]L#&_Gejr]G^"}].

    Note

    Do not use any of the keys in these examples. Use your own keys.

    @@ -1435,11 +1435,11 @@

    Registers an unary fun that is called if beam_lib must read an debug_info chunk that has been encrypted. The fun is held in a process that is started by the function.

    If a fun is already registered when attempting to register a fun, -{error, exists} is returned.

    The fun must handle the following arguments:

    CryptoKeyFun(init) -> ok | {ok, NewCryptoKeyFun} | {error, Term}

    Called when the fun is registered, in the process that holds the fun. Here the +{error, exists} is returned.

    The fun must handle the following arguments:

    CryptoKeyFun(init) -> ok | {ok, NewCryptoKeyFun} | {error, Term}

    Called when the fun is registered, in the process that holds the fun. Here the crypto key fun can do any necessary initializations. If {ok, NewCryptoKeyFun} is returned, NewCryptoKeyFun is registered instead of CryptoKeyFun. If {error, Term} is returned, the registration is aborted and -crypto_key_fun/1 also returns {error, Term}.

    CryptoKeyFun({debug_info, Mode, Module, Filename}) -> Key

    Called when the key is needed for module Module in the file named Filename. +crypto_key_fun/1 also returns {error, Term}.

    CryptoKeyFun({debug_info, Mode, Module, Filename}) -> Key

    Called when the key is needed for module Module in the file named Filename. Mode is the type of crypto algorithm; currently, the only possible value is des3_cbc. The call is to fail (raise an exception) if no key is available.

    CryptoKeyFun(clear) -> term()

    Called before the fun is unregistered. Here any cleaning up can be done. The return value is not important, but is passed back to the caller of @@ -1806,14 +1806,14 @@ -vsn(Vsn).

    If this attribute is not specified, the version defaults to the checksum of the module. Notice that if version Vsn is not a list, it is made into one, that is {ok,{Module,[Vsn]}} is returned. If there are many -vsn -module attributes, the result is the concatenated list of versions.

    Examples:

    1> beam_lib:version(a). % -vsn(1).
    -{ok,{a,[1]}}
    -2> beam_lib:version(b). % -vsn([1]).
    -{ok,{b,[1]}}
    -3> beam_lib:version(c). % -vsn([1]). -vsn(2).
    -{ok,{c,[1,2]}}
    -4> beam_lib:version(d). % no -vsn attribute
    -{ok,{d,[275613208176997377698094100858909383631]}}
    +module attributes, the result is the concatenated list of versions.

    Examples:

    1> beam_lib:version(a). % -vsn(1).
    +{ok,{a,[1]}}
    +2> beam_lib:version(b). % -vsn([1]).
    +{ok,{b,[1]}}
    +3> beam_lib:version(c). % -vsn([1]). -vsn(2).
    +{ok,{c,[1,2]}}
    +4> beam_lib:version(d). % no -vsn attribute
    +{ok,{d,[275613208176997377698094100858909383631]}}
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/binary.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/binary.xhtml 2025-05-10 20:19:24.281328007 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/binary.xhtml 2025-05-10 20:19:24.321328370 +0000 @@ -522,7 +522,7 @@ -

    Converts Subject to a list of byte/0s, each representing the value of one byte.

    Example:

    1> binary:bin_to_list(<<"erlang">>).
    +

    Converts Subject to a list of byte/0s, each representing the value of one byte.

    Example:

    1> binary:bin_to_list(<<"erlang">>).
     "erlang"
     %% or [101,114,108,97,110,103] in list notation.
    @@ -588,7 +588,7 @@

    Converts Subject to a list of byte/0s, each representing the value of one byte. PosLen or alternatively Pos and Len denote which part of the Subject binary to convert. By default, the entire Subject binary is -converted.

    Example:

    1> binary:bin_to_list(<<"erlang">>, {1,3}).
    +converted.

    Example:

    1> binary:bin_to_list(<<"erlang">>, {1,3}).
     "rla"
     %% or [114,108,97] in list notation.

    If PosLen or alternatively Pos and Len in any way reference outside the binary, a badarg exception is raised.

    @@ -730,7 +730,7 @@ -

    Decodes a hex encoded binary into a binary.

    Example

    1> binary:decode_hex(<<"66">>).
    +

    Decodes a hex encoded binary into a binary.

    Example

    1> binary:decode_hex(<<"66">>).
     <<"f">>
    @@ -796,11 +796,11 @@

    Converts the binary digit representation, in big endian or little endian, of a -positive integer in Subject to an Erlang integer/0.

    Example:

    1> binary:decode_unsigned(<<169,138,199>>).
    +positive integer in Subject to an Erlang integer/0.

    Example:

    1> binary:decode_unsigned(<<169,138,199>>).
     11111111
    -2> binary:decode_unsigned(<<169,138,199>>, big).
    +2> binary:decode_unsigned(<<169,138,199>>, big).
     11111111
    -3> binary:decode_unsigned(<<169,138,199>>, little).
    +3> binary:decode_unsigned(<<169,138,199>>, little).
     13077161
    @@ -863,13 +863,13 @@

    Encodes a binary into a hex encoded binary using the specified case for the -hexadecimal digits "a" to "f".

    The default case is uppercase.

    Example:

    1> binary:encode_hex(<<"f">>).
    +hexadecimal digits "a" to "f".

    The default case is uppercase.

    Example:

    1> binary:encode_hex(<<"f">>).
     <<"66">>
    -2> binary:encode_hex(<<"/">>).
    +2> binary:encode_hex(<<"/">>).
     <<"2F">>
    -3> binary:encode_hex(<<"/">>, lowercase).
    +3> binary:encode_hex(<<"/">>, lowercase).
     <<"2f">>
    -4> binary:encode_hex(<<"/">>, uppercase).
    +4> binary:encode_hex(<<"/">>, uppercase).
     <<"2F">>
    @@ -932,11 +932,11 @@

    Converts a positive integer to the smallest possible representation in a binary -digit representation, either big endian or little endian.

    Example:

    1> binary:encode_unsigned(11111111).
    +digit representation, either big endian or little endian.

    Example:

    1> binary:encode_unsigned(11111111).
     <<169,138,199>>
    -2> binary:encode_unsigned(11111111, big).
    +2> binary:encode_unsigned(11111111, big).
     <<169,138,199>>
    -2> binary:encode_unsigned(11111111, little).
    +2> binary:encode_unsigned(11111111, little).
     <<199,138,169>>
    @@ -1060,9 +1060,9 @@

    Returns the length of the longest common prefix of the binaries in list -Binaries.

    Example:

    1> binary:longest_common_prefix([<<"erlang">>, <<"ergonomy">>]).
    +Binaries.

    Example:

    1> binary:longest_common_prefix([<<"erlang">>, <<"ergonomy">>]).
     2
    -2> binary:longest_common_prefix([<<"erlang">>, <<"perl">>]).
    +2> binary:longest_common_prefix([<<"erlang">>, <<"perl">>]).
     0

    If Binaries is not a flat non-empty list of binaries, a badarg exception is raised.

    @@ -1095,9 +1095,9 @@

    Returns the length of the longest common suffix of the binaries in list -Binaries.

    Example:

    1> binary:longest_common_suffix([<<"erlang">>, <<"fang">>]).
    +Binaries.

    Example:

    1> binary:longest_common_suffix([<<"erlang">>, <<"fang">>]).
     3
    -2> binary:longest_common_suffix([<<"erlang">>, <<"perl">>]).
    +2> binary:longest_common_suffix([<<"erlang">>, <<"perl">>]).
     0

    If Binaries is not a flat non-empty list of binaries, a badarg exception is raised.

    @@ -1173,8 +1173,8 @@

    Searches for the first occurrence of Pattern in Subject and returns the position and length.

    The function returns {Pos, Length} for the binary in Pattern, starting at -the lowest position in Subject.

    Example:

    1> binary:match(<<"abcde">>, [<<"bcde">>, <<"cd">>],[]).
    -{1,4}

    Even though <<"cd">> ends before <<"bcde">>, <<"bcde">> begins first and +the lowest position in Subject.

    Example:

    1> binary:match(<<"abcde">>, [<<"bcde">>, <<"cd">>],[]).
    +{1,4}

    Even though <<"cd">> ends before <<"bcde">>, <<"bcde">> begins first and is therefore the first match. If two overlapping matches begin at the same position, the longest is returned.

    Summary of the options:

    • {scope, {Start, Length}} - Only the specified part is searched. Return values still have offsets from the beginning of Subject. A negative Length @@ -1254,9 +1254,9 @@

      As match/2, but Subject is searched until exhausted and a list of all non-overlapping parts matching Pattern is returned (in order).

      The first and longest match is preferred to a shorter, which is illustrated by -the following example:

      1> binary:matches(<<"abcde">>,
      -                  [<<"bcde">>,<<"bc">>,<<"de">>],[]).
      -[{1,4}]

      The result shows that <<"bcde">> is selected instead of the shorter match +the following example:

      1> binary:matches(<<"abcde">>,
      +                  [<<"bcde">>,<<"bc">>,<<"de">>],[]).
      +[{1,4}]

      The result shows that <<"bcde">> is selected instead of the shorter match <<"bc">> (which would have given raise to one more match, <<"de">>). This corresponds to the behavior of POSIX regular expressions (and programs like awk), but is not consistent with alternative matches in re (and Perl), where @@ -1325,7 +1325,7 @@

      Extracts the part of binary Subject described by PosLen.

      A negative length can be used to extract bytes at the end of a binary:

      1> Bin = <<1,2,3,4,5,6,7,8,9,10>>.
      -2> binary:part(Bin, {byte_size(Bin), -5}).
      +2> binary:part(Bin, {byte_size(Bin), -5}).
       <<6,7,8,9,10>>

      Note

      part/2 and part/3 are also available in the erlang module under the names binary_part/2 and binary_part/3. Those BIFs are allowed in guard tests.

      If PosLen in any way references outside the binary, a badarg exception is @@ -1363,33 +1363,33 @@ it can be useful to get the size of the referenced binary. This function can be used in a program to trigger the use of copy/1. By copying a binary, one can dereference the original, possibly large, binary that a -smaller binary is a reference to.

      Example:

      store(Binary, GBSet) ->
      +smaller binary is a reference to.

      Example:

      store(Binary, GBSet) ->
         NewBin =
      -      case binary:referenced_byte_size(Binary) of
      -          Large when Large > 2 * byte_size(Binary) ->
      -             binary:copy(Binary);
      +      case binary:referenced_byte_size(Binary) of
      +          Large when Large > 2 * byte_size(Binary) ->
      +             binary:copy(Binary);
                 _ ->
                    Binary
             end,
      -  gb_sets:insert(NewBin,GBSet).

      In this example, we chose to copy the binary content before inserting it in + gb_sets:insert(NewBin,GBSet).

      In this example, we chose to copy the binary content before inserting it in gb_sets:set() if it references a binary more than twice the data size we want to keep. Of course, different rules apply when copying to different programs.

      Binary sharing occurs whenever binaries are taken apart. This is the fundamental reason why binaries are fast, decomposition can always be done with O(1) complexity. In rare circumstances this data sharing is however undesirable, why this function together with copy/1 can be useful when optimizing -for memory use.

      Example of binary sharing:

      1> A = binary:copy(<<1>>, 100).
      +for memory use.

      Example of binary sharing:

      1> A = binary:copy(<<1>>, 100).
       <<1,1,1,1,1 ...
      -2> byte_size(A).
      +2> byte_size(A).
       100
      -3> binary:referenced_byte_size(A).
      +3> binary:referenced_byte_size(A).
       100
       4> <<B:10/binary, C:90/binary>> = A.
       <<1,1,1,1,1 ...
      -5> {byte_size(B), binary:referenced_byte_size(B)}.
      -{10,10}
      -6> {byte_size(C), binary:referenced_byte_size(C)}.
      -{90,100}

      In the above example, the small binary B was copied while the larger binary +5> {byte_size(B), binary:referenced_byte_size(B)}. +{10,10} +6> {byte_size(C), binary:referenced_byte_size(C)}. +{90,100}

      In the above example, the small binary B was copied while the larger binary C references binary A.

      Note

      Binary data is shared among processes. If another process still references the larger binary, copying the part this process uses only consumes more memory and does not free up the larger binary for garbage collection. Use this kind @@ -1478,28 +1478,28 @@ at the specified position (or positions) before inserting Replacement into Subject. If Replacement is given as a fun instead, this option is ignored.

      If any position specified in InsPos > size of the replacement binary, a badarg exception is raised.

      Options global and {scope, part()} work as for split/3. The return type is -always a binary/0.

      For a description of Pattern, see compile_pattern/1.

      Examples:

      1> binary:replace(<<"abcde">>, [<<"b">>, <<"d">>], <<"X">>, []).
      +always a binary/0.

      For a description of Pattern, see compile_pattern/1.

      Examples:

      1> binary:replace(<<"abcde">>, [<<"b">>, <<"d">>], <<"X">>, []).
       <<"aXcde">>
       
      -2> binary:replace(<<"abcde">>, [<<"b">>, <<"d">>], <<"X">>, [global]).
      +2> binary:replace(<<"abcde">>, [<<"b">>, <<"d">>], <<"X">>, [global]).
       <<"aXcXe">>
       
      -3> binary:replace(<<"abcde">>, <<"b">>, <<"[]">>, [{insert_replaced, 1}]).
      +3> binary:replace(<<"abcde">>, <<"b">>, <<"[]">>, [{insert_replaced, 1}]).
       <<"a[b]cde">>
       
      -4> binary:replace(<<"abcde">>, [<<"b">>, <<"d">>], <<"[]">>, [global, {insert_replaced, 1}]).
      +4> binary:replace(<<"abcde">>, [<<"b">>, <<"d">>], <<"[]">>, [global, {insert_replaced, 1}]).
       <<"a[b]c[d]e">>
       
      /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/c.xhtml differs (HTML document, ASCII text, with very long lines)
      --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/c.xhtml	2025-05-10 20:19:24.281328007 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/c.xhtml	2025-05-10 20:19:24.321328370 +0000
      @@ -1637,7 +1637,7 @@
             
       
       

      Compiles and then loads the code for a file on all nodes. Options defaults to -[]. Compilation is equivalent to:

      compile:file(File, Options ++ [report_errors, report_warnings])
      +[]. Compilation is equivalent to:

      compile:file(File, Options ++ [report_errors, report_warnings])
      /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/calendar.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/calendar.xhtml 2025-05-10 20:19:24.281328007 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/calendar.xhtml 2025-05-10 20:19:24.321328370 +0000 @@ -1724,10 +1724,10 @@

      Converts an RFC 3339 timestamp into system time. The data format of RFC 3339 timestamps is described by RFC 3339. Starting from OTP 25.1, the minutes part of the time zone is optional.

      Valid option:

      • {unit, Unit} - The time unit of the return value. The default is -second.
      1> calendar:rfc3339_to_system_time("2018-02-01T16:17:58+01:00").
      +second.
    1> calendar:rfc3339_to_system_time("2018-02-01T16:17:58+01:00").
     1517498278
    -2> calendar:rfc3339_to_system_time("2018-02-01 15:18:02.088Z",
    -   [{unit, nanosecond}]).
    +2> calendar:rfc3339_to_system_time("2018-02-01 15:18:02.088Z",
    +   [{unit, nanosecond}]).
     1517498282088000000
    @@ -1897,16 +1897,16 @@ the formatted string includes a fraction of a second. The number of fractional second digits is three, six, or nine depending on what time unit is chosen. For native three fractional digits are included. Notice that trailing zeros -are not removed from the fraction.

    1> calendar:system_time_to_rfc3339(erlang:system_time(second)).
    +are not removed from the fraction.

    1> calendar:system_time_to_rfc3339(erlang:system_time(second)).
     "2018-04-23T14:56:28+02:00"
    -2> calendar:system_time_to_rfc3339(erlang:system_time(second),
    -   [{offset, "-02:00"}]).
    +2> calendar:system_time_to_rfc3339(erlang:system_time(second),
    +   [{offset, "-02:00"}]).
     "2018-04-23T10:56:52-02:00"
    -3> calendar:system_time_to_rfc3339(erlang:system_time(second),
    -   [{offset, -7200}]).
    +3> calendar:system_time_to_rfc3339(erlang:system_time(second),
    +   [{offset, -7200}]).
     "2018-04-23T10:57:05-02:00"
    -4> calendar:system_time_to_rfc3339(erlang:system_time(millisecond),
    -   [{unit, millisecond}, {time_designator, $\s}, {offset, "Z"}]).
    +4> calendar:system_time_to_rfc3339(erlang:system_time(millisecond),
    +   [{unit, millisecond}, {time_designator, $\s}, {offset, "Z"}]).
     "2018-04-23 12:57:20.482Z"
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/content.opf 2025-05-10 20:19:24.281328007 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/content.opf 2025-05-10 20:19:24.321328370 +0000 @@ -4,10 +4,10 @@ version="3.0"> stdlib - 6.2.2 - urn:uuid:530a0847-654a-95bd-4f48-f4e6e344cc27 + urn:uuid:3c7ce40d-3d38-fd87-9429-21bd39c1951c en - 2025-05-10T20:10:00Z + 2041-06-12T09:29:56Z /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/dets.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/dets.xhtml 2025-05-10 20:19:24.281328007 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/dets.xhtml 2025-05-10 20:19:24.321328370 +0000 @@ -1793,14 +1793,14 @@

    Returns a list of all objects with key Key stored in table Name, for -example:

    2> dets:open_file(abc, [{type, bag}]).
    -{ok,abc}
    -3> dets:insert(abc, {1,2,3}).
    +example:

    2> dets:open_file(abc, [{type, bag}]).
    +{ok,abc}
    +3> dets:insert(abc, {1,2,3}).
     ok
    -4> dets:insert(abc, {1,3,4}).
    +4> dets:insert(abc, {1,3,4}).
     ok
    -5> dets:lookup(abc, 1).
    -[{1,2,3},{1,3,4}]

    If the table type is set, the function returns either the empty list or a list +5> dets:lookup(abc, 1). +[{1,2,3},{1,3,4}]

    If the table type is set, the function returns either the empty list or a list with one object, as there cannot be more than one object with a given key. If the table type is bag or duplicate_bag, the function returns a list of arbitrary length.

    Notice that the order of objects returned is unspecified. In particular, the @@ -2657,11 +2657,11 @@ specification is specified explicitly. This is how to state match specifications that cannot easily be expressed within the syntax provided by qlc.

    The following example uses an explicit match specification to traverse the -table:

    1> dets:open_file(t, []),
    -ok = dets:insert(t, [{1,a},{2,b},{3,c},{4,d}]),
    -MS = ets:fun2ms(fun({X,Y}) when (X > 1) or (X < 5) -> {Y} end),
    -QH1 = dets:table(t, [{traverse, {select, MS}}]).

    An example with implicit match specification:

    2> QH2 = qlc:q([{Y} || {X,Y} <- dets:table(t), (X > 1) or (X < 5)]).

    The latter example is equivalent to the former, which can be verified using -function qlc:info/1:

    3> qlc:info(QH1) =:= qlc:info(QH2).
    +table:

    1> dets:open_file(t, []),
    +ok = dets:insert(t, [{1,a},{2,b},{3,c},{4,d}]),
    +MS = ets:fun2ms(fun({X,Y}) when (X > 1) or (X < 5) -> {Y} end),
    +QH1 = dets:table(t, [{traverse, {select, MS}}]).

    An example with implicit match specification:

    2> QH2 = qlc:q([{Y} || {X,Y} <- dets:table(t), (X > 1) or (X < 5)]).

    The latter example is equivalent to the former, which can be verified using +function qlc:info/1:

    3> qlc:info(QH1) =:= qlc:info(QH2).
     true

    qlc:info/1 returns information about a query handle. In this case identical information is returned for the two query handles.

    @@ -2735,7 +2735,7 @@

    Applies Fun to each object stored in table Name in some unspecified order. Different actions are taken depending on the return value of Fun. The following Fun return values are allowed:

    • continue - Continue to perform the traversal. For example, the following -function can be used to print the contents of a table:

      fun(X) -> io:format("~p~n", [X]), continue end.
    • {continue, Val} - Continue the traversal and accumulate Val. The +function can be used to print the contents of a table:

      fun(X) -> io:format("~p~n", [X]), continue end.
    • {continue, Val} - Continue the traversal and accumulate Val. The following function is supplied to collect all objects of a table in a list:

      fun(X) -> {continue, X} end.
    • {done, Value} - Terminate the traversal and return [Value | Acc].

    Any other value OtherValue returned by Fun terminates the traversal and is returned immediately.

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/dict.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/dict.xhtml 2025-05-10 20:19:24.281328007 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/dict.xhtml 2025-05-10 20:19:24.321328370 +0000 @@ -33,13 +33,13 @@ Notes

    Functions append and append_list are included so that keyed values can be -stored in a list accumulator, for example:

    > D0 = dict:new(),
    -  D1 = dict:store(files, [], D0),
    -  D2 = dict:append(files, f1, D1),
    -  D3 = dict:append(files, f2, D2),
    -  D4 = dict:append(files, f3, D3),
    -  dict:fetch(files, D4).
    -[f1,f2,f3]

    This saves the trouble of first fetching a keyed value, appending a new value to +stored in a list accumulator, for example:

    > D0 = dict:new(),
    +  D1 = dict:store(files, [], D0),
    +  D2 = dict:append(files, f1, D1),
    +  D3 = dict:append(files, f2, D2),
    +  D4 = dict:append(files, f3, D3),
    +  dict:fetch(files, D4).
    +[f1,f2,f3]

    This saves the trouble of first fetching a keyed value, appending a new value to the list of stored values, and storing the result.

    Function fetch is to be used if the key is known to be in the dictionary, otherwise function find.

    @@ -784,10 +784,10 @@ the Key-Value pairs from both dictionaries are included in the new dictionary. If a key occurs in both dictionaries, Fun is called with the key and both values to return a new value. merge can be defined as follows, but is -faster:

    merge(Fun, D1, D2) ->
    -    fold(fun (K, V1, D) ->
    -                 update(K, fun (V2) -> Fun(K, V1, V2) end, V1, D)
    -         end, D2, D1).
    +faster:

    merge(Fun, D1, D2) ->
    +    fold(fun (K, V1, D) ->
    +                 update(K, fun (V2) -> Fun(K, V1, V2) end, V1, D)
    +         end, D2, D1).
    @@ -1000,8 +1000,8 @@

    Updates a value in a dictionary by calling Fun on the value to get a new value. If Key is not present in the dictionary, Initial is stored as the -first value. For example, append/3 can be defined as:

    append(Key, Val, D) ->
    -    update(Key, fun (Old) -> Old ++ [Val] end, [Val], D).
    +first value. For example, append/3 can be defined as:

    append(Key, Val, D) ->
    +    update(Key, fun (Old) -> Old ++ [Val] end, [Val], D).
    @@ -1032,8 +1032,8 @@

    Adds Increment to the value associated with Key and stores this value. If Key is not present in the dictionary, Increment is stored as the first -value.

    This can be defined as follows, but is faster:

    update_counter(Key, Incr, D) ->
    -    update(Key, fun (Old) -> Old + Incr end, Incr, D).
    +value.

    This can be defined as follows, but is faster:

    update_counter(Key, Incr, D) ->
    +    update(Key, fun (Old) -> Old + Incr end, Incr, D).
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/epp.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/epp.xhtml 2025-05-10 20:19:24.277327971 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/epp.xhtml 2025-05-10 20:19:24.321328370 +0000 @@ -35,7 +35,7 @@ Error Information

    ErrorInfo is the standard ErrorInfo structure that is returned from all I/O -modules. The format is as follows:

    {ErrorLine, Module, ErrorDescriptor}

    A string describing the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)

    +modules. The format is as follows:

    {ErrorLine, Module, ErrorDescriptor}

    A string describing the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/erl_error.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/erl_error.xhtml 2025-05-10 20:19:24.277327971 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/erl_error.xhtml 2025-05-10 20:19:24.321328370 +0000 @@ -201,7 +201,7 @@

    A fun used to format function arguments for BIF and function calls. By default -the following fun will be used:

    fun(Term, I) -> io_lib:print(Term, I, 80, 30) end
    +the following fun will be used:

    fun(Term, I) -> io_lib:print(Term, I, 80, 30) end
    @@ -317,23 +317,23 @@ caused the error starting at 1.

  • general - An error that is not associated with any argument caused the error.

  • reason - If the Reason should be printed differently than the default way.

  • If the text returned includes new-lines, format_exception/4 will indent the -text correctly.

    Example:

    -module(my_error_module).
    --export([atom_to_string/1, format_error/2]).
    +text correctly.

    Example:

    -module(my_error_module).
    +-export([atom_to_string/1, format_error/2]).
     
    -atom_to_string(Arg) when is_atom(Arg) ->
    -  atom_to_list(Arg);
    -atom_to_string(Arg) ->
    -  erlang:error(badarg,[Arg],
    -               [{error_info,#{ module => ?MODULE,
    -                               cause => #{ 1 => "should be an atom" }}}]).
    -
    -format_error(Reason, [{_M,_F,_As,Info}|_]) ->
    -  ErrorInfo = proplists:get_value(error_info, Info, #{}),
    -  ErrorMap = maps:get(cause, ErrorInfo),
    -  ErrorMap#{ general => "optional general information",
    -             reason => io_lib:format("~p: ~p",[?MODULE, Reason]) }.
    1> c(my_error_module).
    -{ok,my_error_module}
    -2> my_error_module:atom_to_string(1).
    +atom_to_string(Arg) when is_atom(Arg) ->
    +  atom_to_list(Arg);
    +atom_to_string(Arg) ->
    +  erlang:error(badarg,[Arg],
    +               [{error_info,#{ module => ?MODULE,
    +                               cause => #{ 1 => "should be an atom" }}}]).
    +
    +format_error(Reason, [{_M,_F,_As,Info}|_]) ->
    +  ErrorInfo = proplists:get_value(error_info, Info, #{}),
    +  ErrorMap = maps:get(cause, ErrorInfo),
    +  ErrorMap#{ general => "optional general information",
    +             reason => io_lib:format("~p: ~p",[?MODULE, Reason]) }.
    1> c(my_error_module).
    +{ok,my_error_module}
    +2> my_error_module:atom_to_string(1).
     ** exception error: my_error_module: badarg
          in function  my_error_module:atom_to_string/1
             called as my_error_module:atom_to_string(1)
    @@ -416,18 +416,18 @@
     
     

    Format the error reason and stack back-trace caught using try ... catch in the same style as the shell formats them.

    Example:

    try
    -    do_something()
    +    do_something()
     catch
         C:R:Stk ->
    -        Message = erl_error:format_exception(C, R, Stk),
    -        io:format(LogFile, "~ts\n", [Message])
    +        Message = erl_error:format_exception(C, R, Stk),
    +        io:format(LogFile, "~ts\n", [Message])
     end

    If error_info is provided with the exception, format_exception will use that information to provide additional information about the exception.

    Example:

    try
    -  erlang:raise(badarg,[],[{error_info,#{}}])
    +  erlang:raise(badarg,[],[{error_info,#{}}])
     catch
         C:R:Stk ->
    -        Message = erl_error:format_exception(C, R, Stk),
    -        io:format(LogFile, "~ts\n", [Message])
    +        Message = erl_error:format_exception(C, R, Stk),
    +        io:format(LogFile, "~ts\n", [Message])
     end

    See erlang:error/3 for details on how to raise an exception with error_info included.

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/erl_eval.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/erl_eval.xhtml 2025-05-10 20:19:24.277327971 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/erl_eval.xhtml 2025-05-10 20:19:24.317328334 +0000 @@ -36,13 +36,13 @@ LocalFunctionHandler can be used to define a function that is called when there is a call to a local function. The argument can have the following formats:

    • {value,Func} - This defines a local function handler that is called -with:

      Func(Name, Arguments)

      Name is the name of the local function (an atom) and Arguments is a list +with:

      Func(Name, Arguments)

      Name is the name of the local function (an atom) and Arguments is a list of the evaluated arguments. The function handler returns the value of the local function. In this case, the current bindings cannot be accessed. To signal an error, the function handler calls exit/1 with a -suitable exit value.

    • {eval,Func} - This defines a local function handler that is called with:

      Func(Name, Arguments, Bindings)

      Name is the name of the local function (an atom), Arguments is a list of +suitable exit value.

    • {eval,Func} - This defines a local function handler that is called with:

      Func(Name, Arguments, Bindings)

      Name is the name of the local function (an atom), Arguments is a list of the unevaluated arguments, and Bindings are the current variable bindings. -The function handler returns:

      {value,Value,NewBindings}

      Value is the value of the local function and NewBindings are the updated +The function handler returns:

      {value,Value,NewBindings}

      Value is the value of the local function and NewBindings are the updated variable bindings. In this case, the function handler must itself evaluate all the function arguments and manage the bindings. To signal an error, the function handler calls exit/1 with a suitable exit value.

    • none - There is no local function handler.

    @@ -56,7 +56,7 @@ expressions.
  • An operator Op/A is called (this is handled as a call to function erlang:Op/A).
  • Exceptions are calls to erlang:apply/2,3; neither of the function handlers are called for such calls. The argument can have the following formats:

    • {value,Func} - This defines a non-local function handler. The function -may be called with two arguments:

      Func(FuncSpec, Arguments)

      or three arguments:

      Func(Anno, FuncSpec, Arguments)

      Anno is the erl_anno:anno() of the node, FuncSpec +may be called with two arguments:

      Func(FuncSpec, Arguments)

      or three arguments:

      Func(Anno, FuncSpec, Arguments)

      Anno is the erl_anno:anno() of the node, FuncSpec is the name of the function on the form {Module,Function} or a fun, and Arguments is a list of the evaluated arguments. The function handler returns the value of the function. To signal an error, the function handler /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/erl_lint.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/erl_lint.xhtml 2025-05-10 20:19:24.277327971 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/erl_lint.xhtml 2025-05-10 20:19:24.317328334 +0000 @@ -34,7 +34,7 @@ Error Information

    ErrorInfo is the standard ErrorInfo structure that is returned from all I/O -modules. The format is as follows:

    {ErrorLine, Module, ErrorDescriptor}

    A string describing the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)

    +modules. The format is as follows:

    {ErrorLine, Module, ErrorDescriptor}

    A string describing the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/erl_parse.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/erl_parse.xhtml 2025-05-10 20:19:24.277327971 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/erl_parse.xhtml 2025-05-10 20:19:24.317328334 +0000 @@ -33,7 +33,7 @@ Error Information

    ErrorInfo is the standard ErrorInfo structure that is returned from all I/O modules. -The format is as follows:

    {ErrorLine, Module, ErrorDescriptor}

    A string describing the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)

    +The format is as follows:

    {ErrorLine, Module, ErrorDescriptor}

    A string describing the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/erl_scan.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/erl_scan.xhtml 2025-05-10 20:19:24.277327971 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/erl_scan.xhtml 2025-05-10 20:19:24.317328334 +0000 @@ -31,7 +31,7 @@ Error Information

    ErrorInfo is the standard ErrorInfo structure that is returned from all I/O -modules. The format is as follows:

    {ErrorLocation, Module, ErrorDescriptor}

    A string describing the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)

    +modules. The format is as follows:

    {ErrorLocation, Module, ErrorDescriptor}

    A string describing the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/erl_tar.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/erl_tar.xhtml 2025-05-10 20:19:24.277327971 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/erl_tar.xhtml 2025-05-10 20:19:24.317328334 +0000 @@ -1170,14 +1170,14 @@ Notice that there is only an arity-2 read function, not an arity-1 function.

  • (position,{UserData,Position}) - Sets the position of UserData as defined for files in file:position/2

  • Example:

    The following is a complete Fun parameter for reading and writing on files using the file module:

    ExampleFun =
    -   fun(write, {Fd,Data}) ->  file:write(Fd, Data);
    -      (position, {Fd,Pos}) -> file:position(Fd, Pos);
    -      (read2, {Fd,Size}) -> file:read(Fd, Size);
    -      (close, Fd) -> file:close(Fd)
    -   end

    Here Fd was specified to function init/3 as:

    {ok,Fd} = file:open(Name, ...).
    -{ok,TarDesc} = erl_tar:init(Fd, [write], ExampleFun),

    TarDesc is then used:

    erl_tar:add(TarDesc, SomeValueIwantToAdd, FileNameInTarFile),
    +   fun(write, {Fd,Data}) ->  file:write(Fd, Data);
    +      (position, {Fd,Pos}) -> file:position(Fd, Pos);
    +      (read2, {Fd,Size}) -> file:read(Fd, Size);
    +      (close, Fd) -> file:close(Fd)
    +   end

    Here Fd was specified to function init/3 as:

    {ok,Fd} = file:open(Name, ...).
    +{ok,TarDesc} = erl_tar:init(Fd, [write], ExampleFun),

    TarDesc is then used:

    erl_tar:add(TarDesc, SomeValueIwantToAdd, FileNameInTarFile),
     ...,
    -erl_tar:close(TarDesc)

    When the erl_tar core wants to, for example, write a piece of Data, it would +erl_tar:close(TarDesc)

    When the erl_tar core wants to, for example, write a piece of Data, it would call ExampleFun(write, {UserData,Data}).

    Note

    This example with the file module operations is not necessary to use directly, as that is what function open/2 in principle does.

    Warning

    The TarDescriptor term is not a file descriptor. You are advised not to rely on the specific contents of this term, as it can change in future Erlang/OTP /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/escript.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/escript.xhtml 2025-05-10 20:19:24.277327971 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/escript.xhtml 2025-05-10 20:19:24.317328334 +0000 @@ -401,67 +401,67 @@ number of schedulers with +S3. We also extract the different sections from the newly created script:

    > Source = "%% Demo\nmain(_Args) ->\n    io:format(\"~p\",[erlang:system_info(schedulers)]).\n".
     "%% Demo\nmain(_Args) ->\n    io:format(erlang:system_info(schedulers)).\n"
    -> io:format("~s\n", [Source]).
    +> io:format("~s\n", [Source]).
     %% Demo
    -main(_Args) ->
    -    io:format(erlang:system_info(schedulers)).
    +main(_Args) ->
    +    io:format(erlang:system_info(schedulers)).
     
     ok
    -> {ok, Bin} = escript:create(binary, [shebang, comment, {emu_args, "+S3"},
    -                                      {source, list_to_binary(Source)}]).
    -{ok,<<"#!/usr/bin/env escript\n%% This is an -*- erlang -*- file\n%%!+S3"...>>}
    -> file:write_file("demo.escript", Bin).
    +> {ok, Bin} = escript:create(binary, [shebang, comment, {emu_args, "+S3"},
    +                                      {source, list_to_binary(Source)}]).
    +{ok,<<"#!/usr/bin/env escript\n%% This is an -*- erlang -*- file\n%%!+S3"...>>}
    +> file:write_file("demo.escript", Bin).
     ok
    -> os:cmd("escript demo.escript").
    +> os:cmd("escript demo.escript").
     "3"
    -> escript:extract("demo.escript", []).
    -{ok,[{shebang,default}, {comment,default}, {emu_args,"+S3"},
    -     {source,<<"%% Demo\nmain(_Args) ->\n    io:format(erlang:system_info(schedu"...>>}]}

    An escript without header can be created as follows:

    > file:write_file("demo.erl",
    -                  ["%% demo.erl\n-module(demo).\n-export([main/1]).\n\n", Source]).
    +> escript:extract("demo.escript", []).
    +{ok,[{shebang,default}, {comment,default}, {emu_args,"+S3"},
    +     {source,<<"%% Demo\nmain(_Args) ->\n    io:format(erlang:system_info(schedu"...>>}]}

    An escript without header can be created as follows:

    > file:write_file("demo.erl",
    +                  ["%% demo.erl\n-module(demo).\n-export([main/1]).\n\n", Source]).
     ok
    -> {ok, _, BeamCode} = compile:file("demo.erl", [binary, debug_info]).
    -{ok,demo,
    +> {ok, _, BeamCode} = compile:file("demo.erl", [binary, debug_info]).
    +{ok,demo,
         <<70,79,82,49,0,0,2,208,66,69,65,77,65,116,111,109,0,0,0,
    -      79,0,0,0,9,4,100,...>>}
    -> escript:create("demo.beam", [{beam, BeamCode}]).
    +      79,0,0,0,9,4,100,...>>}
    +> escript:create("demo.beam", [{beam, BeamCode}]).
     ok
    -> escript:extract("demo.beam", []).
    -{ok,[{shebang,undefined}, {comment,undefined}, {emu_args,undefined},
    -     {beam,<<70,79,82,49,0,0,3,68,66,69,65,77,65,116,
    -             111,109,0,0,0,83,0,0,0,9,...>>}]}
    -> os:cmd("escript demo.beam").
    +> escript:extract("demo.beam", []).
    +{ok,[{shebang,undefined}, {comment,undefined}, {emu_args,undefined},
    +     {beam,<<70,79,82,49,0,0,3,68,66,69,65,77,65,116,
    +             111,109,0,0,0,83,0,0,0,9,...>>}]}
    +> os:cmd("escript demo.beam").
     "true"

    Here we create an archive script containing both Erlang code and Beam code, then we iterate over all files in the archive and collect their contents and some -information about them:

    > {ok, SourceCode} = file:read_file("demo.erl").
    -{ok,<<"%% demo.erl\n-module(demo).\n-export([main/1]).\n\n%% Demo\nmain(_Arg"...>>}
    -> escript:create("demo.escript",
    -                 [shebang,
    -                  {archive, [{"demo.erl", SourceCode},
    -                             {"demo.beam", BeamCode}], []}]).
    -ok
    -> {ok, [{shebang,default}, {comment,undefined}, {emu_args,undefined},
    -     {archive, ArchiveBin}]} = escript:extract("demo.escript", []).
    -{ok,[{shebang,default}, {comment,undefined}, {emu_args,undefined},
    -     {{archive,<<80,75,3,4,20,0,0,0,8,0,118,7,98,60,105,
    -                152,61,93,107,0,0,0,118,0,...>>}]}
    -> file:write_file("demo.zip", ArchiveBin).
    -ok
    -> zip:foldl(fun(N, I, B, A) -> [{N, I(), B()} | A] end, [], "demo.zip").
    -{ok,[{"demo.beam",
    -      {file_info,748,regular,read_write,
    -                 {{2010,3,2},{0,59,22}},
    -                 {{2010,3,2},{0,59,22}},
    -                 {{2010,3,2},{0,59,22}},
    -                 54,1,0,0,0,0,0},
    +information about them:

    > {ok, SourceCode} = file:read_file("demo.erl").
    +{ok,<<"%% demo.erl\n-module(demo).\n-export([main/1]).\n\n%% Demo\nmain(_Arg"...>>}
    +> escript:create("demo.escript",
    +                 [shebang,
    +                  {archive, [{"demo.erl", SourceCode},
    +                             {"demo.beam", BeamCode}], []}]).
    +ok
    +> {ok, [{shebang,default}, {comment,undefined}, {emu_args,undefined},
    +     {archive, ArchiveBin}]} = escript:extract("demo.escript", []).
    +{ok,[{shebang,default}, {comment,undefined}, {emu_args,undefined},
    +     {{archive,<<80,75,3,4,20,0,0,0,8,0,118,7,98,60,105,
    +                152,61,93,107,0,0,0,118,0,...>>}]}
    +> file:write_file("demo.zip", ArchiveBin).
    +ok
    +> zip:foldl(fun(N, I, B, A) -> [{N, I(), B()} | A] end, [], "demo.zip").
    +{ok,[{"demo.beam",
    +      {file_info,748,regular,read_write,
    +                 {{2010,3,2},{0,59,22}},
    +                 {{2010,3,2},{0,59,22}},
    +                 {{2010,3,2},{0,59,22}},
    +                 54,1,0,0,0,0,0},
           <<70,79,82,49,0,0,2,228,66,69,65,77,65,116,111,109,0,0,0,
    -        83,0,0,...>>},
    -     {"demo.erl",
    -      {file_info,118,regular,read_write,
    -                 {{2010,3,2},{0,59,22}},
    -                 {{2010,3,2},{0,59,22}},
    -                 {{2010,3,2},{0,59,22}},
    -                 54,1,0,0,0,0,0},
    -      <<"%% demo.erl\n-module(demo).\n-export([main/1]).\n\n%% Demo\nmain(_Arg"...>>}]}
    +
    83,0,0,...>>}, + {"demo.erl", + {file_info,118,regular,read_write, + {{2010,3,2},{0,59,22}}, + {{2010,3,2},{0,59,22}}, + {{2010,3,2},{0,59,22}}, + 54,1,0,0,0,0,0}, + <<"%% demo.erl\n-module(demo).\n-export([main/1]).\n\n%% Demo\nmain(_Arg"...>>}]}
    @@ -494,16 +494,16 @@ extracted value is set to the atom default. If a section is missing, the extracted value is set to the atom undefined.

    Option compile_source only affects the result if the escript contains source code. In this case the Erlang code is automatically compiled and -{source, BeamCode} is returned instead of {source, SourceCode}.

    Example:

    > escript:create("demo.escript",
    -                 [shebang, {archive, [{"demo.erl", SourceCode},
    -                                      {"demo.beam", BeamCode}], []}]).
    -ok
    -> {ok, [{shebang,default}, {comment,undefined}, {emu_args,undefined},
    -     {archive, ArchiveBin}]} =
    -              escript:extract("demo.escript", []).
    -{ok,[{{archive,<<80,75,3,4,20,0,0,0,8,0,118,7,98,60,105,
    -                152,61,93,107,0,0,0,118,0,...>>}
    -     {emu_args,undefined}]}
    +{source, BeamCode} is returned instead of {source, SourceCode}.

    Example:

    > escript:create("demo.escript",
    +                 [shebang, {archive, [{"demo.erl", SourceCode},
    +                                      {"demo.beam", BeamCode}], []}]).
    +ok
    +> {ok, [{shebang,default}, {comment,undefined}, {emu_args,undefined},
    +     {archive, ArchiveBin}]} =
    +              escript:extract("demo.escript", []).
    +{ok,[{{archive,<<80,75,3,4,20,0,0,0,8,0,118,7,98,60,105,
    +                152,61,93,107,0,0,0,118,0,...>>}
    +     {emu_args,undefined}]}
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/ets.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/ets.xhtml 2025-05-10 20:19:24.277327971 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/ets.xhtml 2025-05-10 20:19:24.317328334 +0000 @@ -115,10 +115,10 @@ find the next key is not done with such guarantees. This is often not a problem, but may cause rare subtle "unexpected" effects if a concurrent process inserts objects during a traversal. For example, consider one process -doing

    ets:new(t, [ordered_set, named_table]),
    -ets:insert(t, {1}),
    -ets:insert(t, {2}),
    -ets:insert(t, {3}),

    A concurrent call to ets:first(t), done by another process, may then in rare +doing

    ets:new(t, [ordered_set, named_table]),
    +ets:insert(t, {1}),
    +ets:insert(t, {2}),
    +ets:insert(t, {3}),

    A concurrent call to ets:first(t), done by another process, may then in rare cases return 2 even though 2 has never existed in the table ordered as the first key. In the same way, a concurrent call to ets:next(t, 1) may return 3 even though 3 never existed in the table ordered directly after 1.

    Effects like this are improbable but possible. The probability will further be @@ -131,11 +131,11 @@ lookup without any table traversal at all. For ordered_set a partially bound key will limit the traversal to only scan a subset of the table based on term order. A partially bound key is either a list or a tuple with a prefix that is -fully bound. Example:

    1> T = ets:new(t,[ordered_set]), ets:insert(T, {"555-1234", "John Smith"}).
    +fully bound. Example:

    1> T = ets:new(t,[ordered_set]), ets:insert(T, {"555-1234", "John Smith"}).
     true
     2> %% Efficient search of all with area code 555
    -2> ets:match(T,{[$5,$5,$5,$- |'$1'],'$2'}).
    -[["1234","John Smith"]]

    +2> ets:match(T,{[$5,$5,$5,$- |'$1'],'$2'}). +[["1234","John Smith"]]

    @@ -1815,19 +1815,19 @@ -include_lib("stdlib/include/ms_transform.hrl"). to the source file.

    The fun is very restricted, it can take only a single parameter (the object to match): a sole variable or a tuple. It must use the is_ guard tests. Language constructs that have no representation in a match specification (if, case, -receive, and so on) are not allowed.

    The return value is the resulting match specification.

    Example:

    1> ets:fun2ms(fun({M,N}) when N > 3 -> M end).
    -[{{'$1','$2'},[{'>','$2',3}],['$1']}]

    Variables from the environment can be imported, so that the following works:

    2> X=3.
    +receive, and so on) are not allowed.

    The return value is the resulting match specification.

    Example:

    1> ets:fun2ms(fun({M,N}) when N > 3 -> M end).
    +[{{'$1','$2'},[{'>','$2',3}],['$1']}]

    Variables from the environment can be imported, so that the following works:

    2> X=3.
     3
    -3> ets:fun2ms(fun({M,N}) when N > X -> M end).
    -[{{'$1','$2'},[{'>','$2',{const,3}}],['$1']}]

    The imported variables are replaced by match specification const expressions, +3> ets:fun2ms(fun({M,N}) when N > X -> M end). +[{{'$1','$2'},[{'>','$2',{const,3}}],['$1']}]

    The imported variables are replaced by match specification const expressions, which is consistent with the static scoping for Erlang funs. However, local or global function calls cannot be in the guard or body of the fun. Calls to -built-in match specification functions is of course allowed:

    4> ets:fun2ms(fun({M,N}) when N > X, my_fun(M) -> M end).
    +built-in match specification functions is of course allowed:

    4> ets:fun2ms(fun({M,N}) when N > X, my_fun(M) -> M end).
     Error: fun containing local Erlang function calls
    -('my_fun' called in guard) cannot be translated into match_spec
    -{error,transform_error}
    -5> ets:fun2ms(fun({M,N}) when N > X, is_atom(M) -> M end).
    -[{{'$1','$2'},[{'>','$2',{const,3}},{is_atom,'$1'}],['$1']}]

    As shown by the example, the function can be called from the shell also. The fun +('my_fun' called in guard) cannot be translated into match_spec +{error,transform_error} +5> ets:fun2ms(fun({M,N}) when N > X, is_atom(M) -> M end). +[{{'$1','$2'},[{'>','$2',{const,3}},{is_atom,'$1'}],['$1']}]

    As shown by the example, the function can be called from the shell also. The fun must be literally in the call when used from the shell as well.

    Warning

    If the parse_transform is not applied to a module that calls this pseudo function, the call fails in runtime (with a badarg). The ets module exports a function with this name, but it is never to be called except when @@ -2452,12 +2452,12 @@

    Matches the objects in table Table against pattern Pattern.

    A pattern is a term that can contain:

    • Bound parts (Erlang terms)
    • '_' that matches any Erlang term
    • Pattern variables '$N', where N=0,1,...

    The function returns a list with one element for each matching object, where -each element is an ordered list of pattern variable bindings, for example:

    6> ets:match(T, '$1'). % Matches every object in table
    -[[{rufsen,dog,7}],[{brunte,horse,5}],[{ludde,dog,5}]]
    -7> ets:match(T, {'_',dog,'$1'}).
    -[[7],[5]]
    -8> ets:match(T, {'_',cow,'$1'}).
    -[]

    If the key is specified in the pattern, the match is very efficient. If the key +each element is an ordered list of pattern variable bindings, for example:

    6> ets:match(T, '$1'). % Matches every object in table
    +[[{rufsen,dog,7}],[{brunte,horse,5}],[{ludde,dog,5}]]
    +7> ets:match(T, {'_',dog,'$1'}).
    +[[7],[5]]
    +8> ets:match(T, {'_',cow,'$1'}).
    +[]

    If the key is specified in the pattern, the match is very efficient. If the key is not specified, that is, if it is a variable or an underscore, the entire table must be searched. The search time can be substantial if the table is very large.

    For tables of type ordered_set, the result is in the same order as in a @@ -2709,10 +2709,10 @@ execution time):

    Table = ets:new...
     MatchSpec = ...
     % The following call...
    -ets:match_spec_run(ets:tab2list(Table),
    -                   ets:match_spec_compile(MatchSpec)),
    +ets:match_spec_run(ets:tab2list(Table),
    +                   ets:match_spec_compile(MatchSpec)),
     % ...gives the same result as the more common (and more efficient)
    -ets:select(Table, MatchSpec),

    Note

    This function has limited use in normal code. It is used by the dets +ets:select(Table, MatchSpec),

    Note

    This function has limited use in normal code. It is used by the dets module to perform the dets:select/1 operations and by Mnesia during transactions.

    @@ -3075,19 +3075,19 @@ format. Given that the original match specification is kept intact, the continuation can be restored, meaning it can once again be used in subsequent select/1 calls even though it has been stored on disk or on -another node.

    Examples:

    The following sequence of calls may fail:

    T=ets:new(x,[]),
    +another node.

    Examples:

    The following sequence of calls may fail:

    T=ets:new(x,[]),
     ...
    -MS = ets:fun2ms(fun({N,_}=A) when (N rem 10) =:= 0 -> A end),
    -{_,C} = ets:select(T, MS, 10),
    -MaybeBroken = binary_to_term(term_to_binary(C)),
    -ets:select(MaybeBroken).

    The following sequence works, as the call to +MS = ets:fun2ms(fun({N,_}=A) when (N rem 10) =:= 0 -> A end), +{_,C} = ets:select(T, MS, 10), +MaybeBroken = binary_to_term(term_to_binary(C)), +ets:select(MaybeBroken).

    The following sequence works, as the call to repair_continuation/2 reestablishes the -MaybeBroken continuation.

    T=ets:new(x,[]),
    +MaybeBroken continuation.

    T=ets:new(x,[]),
     ...
    -MS = ets:fun2ms(fun({N,_}=A) when (N rem 10) =:= 0 -> A end),
    -{_,C} = ets:select(T,MS,10),
    -MaybeBroken = binary_to_term(term_to_binary(C)),
    -ets:select(ets:repair_continuation(MaybeBroken,MS)).

    Note

    This function is rarely needed in application code. It is used by Mnesia to +MS = ets:fun2ms(fun({N,_}=A) when (N rem 10) =:= 0 -> A end), +{_,C} = ets:select(T,MS,10), +MaybeBroken = binary_to_term(term_to_binary(C)), +ets:select(ets:repair_continuation(MaybeBroken,MS)).

    Note

    This function is rarely needed in application code. It is used by Mnesia to provide distributed select/3 and select/1 sequences. A normal application would either use Mnesia or keep the continuation from being converted to external format.

    The actual behavior of compiled match specifications when recreated from @@ -3132,21 +3132,21 @@ to succeed even if keys are removed during the traversal. The keys for objects inserted or deleted during a traversal may or may not be returned by next/2 depending on the ordering of keys within the table and if -the key exists at the time next/2 is called.

    Example:

    clean_all_with_value(Table,X) ->
    -    safe_fixtable(Table,true),
    -    clean_all_with_value(Table,X,ets:first(Table)),
    -    safe_fixtable(Table,false).
    +the key exists at the time next/2 is called.

    Example:

    clean_all_with_value(Table,X) ->
    +    safe_fixtable(Table,true),
    +    clean_all_with_value(Table,X,ets:first(Table)),
    +    safe_fixtable(Table,false).
     
    -clean_all_with_value(Table,X,'$end_of_table') ->
    +clean_all_with_value(Table,X,'$end_of_table') ->
         true;
    -clean_all_with_value(Table,X,Key) ->
    -    case ets:lookup(Table,Key) of
    -        [{Key,X}] ->
    -            ets:delete(Table,Key);
    +clean_all_with_value(Table,X,Key) ->
    +    case ets:lookup(Table,Key) of
    +        [{Key,X}] ->
    +            ets:delete(Table,Key);
             _ ->
                 true
         end,
    -    clean_all_with_value(Table,X,ets:next(Table,Key)).

    Notice that deleted objects are not freed from a fixed table until it has been + clean_all_with_value(Table,X,ets:next(Table,Key)).

    Notice that deleted objects are not freed from a fixed table until it has been released. If a process fixes a table but never releases it, the memory used by the deleted objects is never freed. The performance of operations on the table also degrades significantly.

    To retrieve information about which processes have fixed which tables, use @@ -3234,7 +3234,7 @@ a list, so that the following code:

    ets:select(Table,[{{'$1','$2','$3'},[],['$$']}])

    gives the same output as:

    ets:select(Table,[{{'$1','$2','$3'},[],[['$1','$2','$3']]}])

    That is, all the bound variables in the match head as a list. If tuples are to be constructed, one has to write a tuple of arity 1 where the single element in the tuple is the tuple one wants to construct (as an ordinary tuple can be -mistaken for a Guard).

    Therefore the following call:

    ets:select(Table,[{{'$1','$2','$1'},[],['$_']}])

    gives the same output as:

    ets:select(Table,[{{'$1','$2','$1'},[],[{{'$1','$2','$3'}}]}])

    This syntax is equivalent to the syntax used in the trace patterns (see the +mistaken for a Guard).

    Therefore the following call:

    ets:select(Table,[{{'$1','$2','$1'},[],['$_']}])

    gives the same output as:

    ets:select(Table,[{{'$1','$2','$1'},[],[{{'$1','$2','$3'}}]}])

    This syntax is equivalent to the syntax used in the trace patterns (see the dbg) module in Runtime_Tools.

    The Guards are constructed as tuples, where the first element is the test name and the remaining elements are the test parameters. To check for a specific type (say a list) of the element bound to the match variable '$1', one would write @@ -3395,16 +3395,16 @@ object. If not, select_replace will fail with badarg without updating any objects.

    For the moment, due to performance and semantic constraints, tables of type bag are not yet supported.

    The function returns the total number of replaced objects.

    Example

    For all 2-tuples with a list in second position, add atom 'marker' first in -the list:

    1> T = ets:new(x,[]), ets:insert(T, {key, [1, 2, 3]}).
    +the list:

    1> T = ets:new(x,[]), ets:insert(T, {key, [1, 2, 3]}).
     true
    -2> MS = ets:fun2ms(fun({K, L}) when is_list(L) -> {K, [marker | L]} end).
    -[{{'$1','$2'},[{is_list,'$2'}],[{{'$1',[marker|'$2']}}]}]
    -3> ets:select_replace(T, MS).
    +2> MS = ets:fun2ms(fun({K, L}) when is_list(L) -> {K, [marker | L]} end).
    +[{{'$1','$2'},[{is_list,'$2'}],[{{'$1',[marker|'$2']}}]}]
    +3> ets:select_replace(T, MS).
     1
    -4> ets:tab2list(T).
    -[{key,[marker,1,2,3]}]

    A generic single object compare-and-swap operation:

    [Old] = ets:lookup(T, Key),
    -New = update_object(Old),
    -Success = (1 =:= ets:select_replace(T, [{Old, [], [{const, New}]}])),
    +4>
    ets:tab2list(T). +[{key,[marker,1,2,3]}]

    A generic single object compare-and-swap operation:

    [Old] = ets:lookup(T, Key),
    +New = update_object(Old),
    +Success = (1 =:= ets:select_replace(T, [{Old, [], [{const, New}]}])),
    @@ -3439,22 +3439,22 @@ ordered_set, the traversal of the table continues to objects with keys earlier in the Erlang term order. The returned list also contains objects with keys in reverse order. For all other table types, the behavior is exactly that of -select/1.

    Example:

    1> T = ets:new(x,[ordered_set]).
    -2> [ ets:insert(T,{N}) || N <- lists:seq(1,10) ].
    +select/1.

    Example:

    1> T = ets:new(x,[ordered_set]).
    +2> [ ets:insert(T,{N}) || N <- lists:seq(1,10) ].
     ...
    -3> {R0,C0} = ets:select_reverse(T,[{'_',[],['$_']}],4).
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/file_sorter.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/file_sorter.xhtml	2025-05-10 20:19:24.273327935 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/file_sorter.xhtml	2025-05-10 20:19:24.313328297 +0000
    @@ -90,35 +90,35 @@
     argument {value, Value}. This makes it easy to initiate the sequence of output
     functions with a value calculated by the input functions.

    As an example, consider sorting the terms on a disk log file. A function that reads chunks from the disk log and returns a list of binaries is used as input. -The results are collected in a list of terms.

    sort(Log) ->
    -    {ok, _} = disk_log:open([{name,Log}, {mode,read_only}]),
    -    Input = input(Log, start),
    -    Output = output([]),
    -    Reply = file_sorter:sort(Input, Output, {format,term}),
    -    ok = disk_log:close(Log),
    +The results are collected in a list of terms.

    sort(Log) ->
    +    {ok, _} = disk_log:open([{name,Log}, {mode,read_only}]),
    +    Input = input(Log, start),
    +    Output = output([]),
    +    Reply = file_sorter:sort(Input, Output, {format,term}),
    +    ok = disk_log:close(Log),
         Reply.
     
    -input(Log, Cont) ->
    -    fun(close) ->
    +input(Log, Cont) ->
    +    fun(close) ->
                 ok;
    -       (read) ->
    -            case disk_log:chunk(Log, Cont) of
    -                {error, Reason} ->
    -                    {error, Reason};
    -                {Cont2, Terms} ->
    -                    {Terms, input(Log, Cont2)};
    -                {Cont2, Terms, _Badbytes} ->
    -                    {Terms, input(Log, Cont2)};
    +       (read) ->
    +            case disk_log:chunk(Log, Cont) of
    +                {error, Reason} ->
    +                    {error, Reason};
    +                {Cont2, Terms} ->
    +                    {Terms, input(Log, Cont2)};
    +                {Cont2, Terms, _Badbytes} ->
    +                    {Terms, input(Log, Cont2)};
                     eof ->
                         end_of_input
                 end
         end.
     
    -output(L) ->
    -    fun(close) ->
    -            lists:append(lists:reverse(L));
    -       (Terms) ->
    -            output([Terms | L])
    +output(L) ->
    +    fun(close) ->
    +            lists:append(lists:reverse(L));
    +       (Terms) ->
    +            output([Terms | L])
         end.

    For more examples of functions as input and output, see the end of the file_sorter module; the term format is implemented with functions.

    The possible values of Reason returned when an error occurs are:

    • bad_object, {bad_object, FileName} - Applying the format function failed for some binary, or the key(s) could not be extracted from some term.
    • {bad_term, FileName} - io:read/2 failed to read some term.
    • {file_error, FileName, file:posix()} - For an explanation of /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/filelib.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/filelib.xhtml 2025-05-10 20:19:24.273327935 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/filelib.xhtml 2025-05-10 20:19:24.313328297 +0000 @@ -909,15 +909,15 @@

      Sanitizes the relative path by eliminating ".." and "." components to protect against directory traversal attacks.

      Either returns the sanitized path name, or the atom unsafe if the path is unsafe. -The path is considered unsafe in the following circumstances:

      • The path is not relative.
      • A ".." component would climb up above the root of the relative path.
      • A symbolic link in the path points above the root of the relative path.

      Examples:

      1> {ok, Cwd} = file:get_cwd().
      +The path is considered unsafe in the following circumstances:

      • The path is not relative.
      • A ".." component would climb up above the root of the relative path.
      • A symbolic link in the path points above the root of the relative path.

      Examples:

      1> {ok, Cwd} = file:get_cwd().
       ...
      -2> filelib:safe_relative_path("dir/sub_dir/..", Cwd).
      +2> filelib:safe_relative_path("dir/sub_dir/..", Cwd).
       "dir"
      -3> filelib:safe_relative_path("dir/..", Cwd).
      -[]
      -4> filelib:safe_relative_path("dir/../..", Cwd).
      +3> filelib:safe_relative_path("dir/..", Cwd).
      +[]
      +4> filelib:safe_relative_path("dir/../..", Cwd).
       unsafe
      -5> filelib:safe_relative_path("/abs/path", Cwd).
      +5> filelib:safe_relative_path("/abs/path", Cwd).
       unsafe
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/filename.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/filename.xhtml 2025-05-10 20:19:24.273327935 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/filename.xhtml 2025-05-10 20:19:24.313328297 +0000 @@ -405,20 +405,20 @@

    Converts a relative Filename and returns an absolute name. No attempt is made to create the shortest absolute name, as this can give incorrect results on file -systems that allow links.

    Unix examples:

    1> pwd().
    +systems that allow links.

    Unix examples:

    1> pwd().
     "/usr/local"
    -2> filename:absname("foo").
    +2> filename:absname("foo").
     "/usr/local/foo"
    -3> filename:absname("../x").
    +3> filename:absname("../x").
     "/usr/local/../x"
    -4> filename:absname("/").
    -"/"

    Windows examples:

    1> pwd().
    +4> filename:absname("/").
    +"/"

    Windows examples:

    1> pwd().
     "D:/usr/local"
    -2> filename:absname("foo").
    +2> filename:absname("foo").
     "D:/usr/local/foo"
    -3> filename:absname("../x").
    +3> filename:absname("../x").
     "D:/usr/local/../x"
    -4> filename:absname("/").
    +4> filename:absname("/").
     "D:/"
    @@ -558,58 +558,58 @@ Opts the function will default to the native option, that is 'linux', 'darwin' or 'windows', as understood by os:type/0. Anything not recognized as 'darwin' or 'windows' is interpreted as 'linux'.

    The options 'author' and 'version' are only used with 'windows' option -mode.

    • user_cache

      The path location is intended for transient data files on a local machine.

      On Linux: Respects the os environment variable XDG_CACHE_HOME.

      1> filename:basedir(user_cache, "my_application", #{os=>linux}).
      -"/home/otptest/.cache/my_application"

      On Darwin:

      1> filename:basedir(user_cache, "my_application", #{os=>darwin}).
      -"/home/otptest/Library/Caches/my_application"

      On Windows:

      1> filename:basedir(user_cache, "My App").
      +mode.

      • user_cache

        The path location is intended for transient data files on a local machine.

        On Linux: Respects the os environment variable XDG_CACHE_HOME.

        1> filename:basedir(user_cache, "my_application", #{os=>linux}).
        +"/home/otptest/.cache/my_application"

        On Darwin:

        1> filename:basedir(user_cache, "my_application", #{os=>darwin}).
        +"/home/otptest/Library/Caches/my_application"

        On Windows:

        1> filename:basedir(user_cache, "My App").
         "c:/Users/otptest/AppData/Local/My App/Cache"
        -2> filename:basedir(user_cache, "My App").
        +2> filename:basedir(user_cache, "My App").
         "c:/Users/otptest/AppData/Local/My App/Cache"
        -3> filename:basedir(user_cache, "My App", #{author=>"Erlang"}).
        +3> filename:basedir(user_cache, "My App", #{author=>"Erlang"}).
         "c:/Users/otptest/AppData/Local/Erlang/My App/Cache"
        -4> filename:basedir(user_cache, "My App", #{version=>"1.2"}).
        +4> filename:basedir(user_cache, "My App", #{version=>"1.2"}).
         "c:/Users/otptest/AppData/Local/My App/1.2/Cache"
        -5> filename:basedir(user_cache, "My App", #{author=>"Erlang",version=>"1.2"}).
        -"c:/Users/otptest/AppData/Local/Erlang/My App/1.2/Cache"
      • user_config

        The path location is intended for persistent configuration files.

        On Linux: Respects the os environment variable XDG_CONFIG_HOME.

        2> filename:basedir(user_config, "my_application", #{os=>linux}).
        -"/home/otptest/.config/my_application"

        On Darwin:

        2> filename:basedir(user_config, "my_application", #{os=>darwin}).
        -"/home/otptest/Library/Application Support/my_application"

        On Windows:

        1> filename:basedir(user_config, "My App").
        +5> filename:basedir(user_cache, "My App", #{author=>"Erlang",version=>"1.2"}).
        +"c:/Users/otptest/AppData/Local/Erlang/My App/1.2/Cache"
      • user_config

        The path location is intended for persistent configuration files.

        On Linux: Respects the os environment variable XDG_CONFIG_HOME.

        2> filename:basedir(user_config, "my_application", #{os=>linux}).
        +"/home/otptest/.config/my_application"

        On Darwin:

        2> filename:basedir(user_config, "my_application", #{os=>darwin}).
        +"/home/otptest/Library/Application Support/my_application"

        On Windows:

        1> filename:basedir(user_config, "My App").
         "c:/Users/otptest/AppData/Roaming/My App"
        -2> filename:basedir(user_config, "My App", #{author=>"Erlang", version=>"1.2"}).
        -"c:/Users/otptest/AppData/Roaming/Erlang/My App/1.2"
      • user_data

        The path location is intended for persistent data files.

        On Linux: Respects the os environment variable XDG_DATA_HOME.

        3> filename:basedir(user_data, "my_application", #{os=>linux}).
        -"/home/otptest/.local/my_application"

        On Darwin:

        3> filename:basedir(user_data, "my_application", #{os=>darwin}).
        -"/home/otptest/Library/Application Support/my_application"

        On Windows:

        8> filename:basedir(user_data, "My App").
        +2> filename:basedir(user_config, "My App", #{author=>"Erlang", version=>"1.2"}).
        +"c:/Users/otptest/AppData/Roaming/Erlang/My App/1.2"
      • user_data

        The path location is intended for persistent data files.

        On Linux: Respects the os environment variable XDG_DATA_HOME.

        3> filename:basedir(user_data, "my_application", #{os=>linux}).
        +"/home/otptest/.local/my_application"

        On Darwin:

        3> filename:basedir(user_data, "my_application", #{os=>darwin}).
        +"/home/otptest/Library/Application Support/my_application"

        On Windows:

        8> filename:basedir(user_data, "My App").
         "c:/Users/otptest/AppData/Local/My App"
        -9> filename:basedir(user_data, "My App",#{author=>"Erlang",version=>"1.2"}).
        -"c:/Users/otptest/AppData/Local/Erlang/My App/1.2"
      • user_log

        The path location is intended for transient log files on a local machine.

        On Linux: Respects the os environment variable XDG_CACHE_HOME.

        4> filename:basedir(user_log, "my_application", #{os=>linux}).
        -"/home/otptest/.cache/my_application/log"

        On Darwin:

        4> filename:basedir(user_log, "my_application", #{os=>darwin}).
        -"/home/otptest/Library/Logs/my_application"

        On Windows:

        12> filename:basedir(user_log, "My App").
        +9> filename:basedir(user_data, "My App",#{author=>"Erlang",version=>"1.2"}).
        +"c:/Users/otptest/AppData/Local/Erlang/My App/1.2"
      • user_log

        The path location is intended for transient log files on a local machine.

        On Linux: Respects the os environment variable XDG_CACHE_HOME.

        4> filename:basedir(user_log, "my_application", #{os=>linux}).
        +"/home/otptest/.cache/my_application/log"

        On Darwin:

        4> filename:basedir(user_log, "my_application", #{os=>darwin}).
        +"/home/otptest/Library/Logs/my_application"

        On Windows:

        12> filename:basedir(user_log, "My App").
         "c:/Users/otptest/AppData/Local/My App/Logs"
        -13> filename:basedir(user_log, "My App",#{author=>"Erlang",version=>"1.2"}).
        -"c:/Users/otptest/AppData/Local/Erlang/My App/1.2/Logs"
      • site_config

        On Linux: Respects the os environment variable XDG_CONFIG_DIRS.

        5> filename:basedir(site_config, "my_application", #{os=>linux}).
        -["/usr/local/share/my_application",
        - "/usr/share/my_application"]
        -6> os:getenv("XDG_CONFIG_DIRS").
        +13> filename:basedir(user_log, "My App",#{author=>"Erlang",version=>"1.2"}).
        +"c:/Users/otptest/AppData/Local/Erlang/My App/1.2/Logs"
      • site_config

        On Linux: Respects the os environment variable XDG_CONFIG_DIRS.

        5> filename:basedir(site_config, "my_application", #{os=>linux}).
        +["/usr/local/share/my_application",
        + "/usr/share/my_application"]
        +6> os:getenv("XDG_CONFIG_DIRS").
         "/etc/xdg/xdg-ubuntu:/usr/share/upstart/xdg:/etc/xdg"
        -7> filename:basedir(site_config, "my_application", #{os=>linux}).
        -["/etc/xdg/xdg-ubuntu/my_application",
        +7> filename:basedir(site_config, "my_application", #{os=>linux}).
        +["/etc/xdg/xdg-ubuntu/my_application",
          "/usr/share/upstart/xdg/my_application",
        - "/etc/xdg/my_application"]
        -8> os:unsetenv("XDG_CONFIG_DIRS").
        + "/etc/xdg/my_application"]
        +8> os:unsetenv("XDG_CONFIG_DIRS").
         true
        -9> filename:basedir(site_config, "my_application", #{os=>linux}).
        -["/etc/xdg/my_application"]

        On Darwin:

        5> filename:basedir(site_config, "my_application", #{os=>darwin}).
        -["/Library/Application Support/my_application"]
      • site_data

        On Linux: Respects the os environment variable XDG_DATA_DIRS.

        10> os:getenv("XDG_DATA_DIRS").
        +9> filename:basedir(site_config, "my_application", #{os=>linux}).
        +["/etc/xdg/my_application"]

        On Darwin:

        5> filename:basedir(site_config, "my_application", #{os=>darwin}).
        +["/Library/Application Support/my_application"]
      • site_data

        On Linux: Respects the os environment variable XDG_DATA_DIRS.

        10> os:getenv("XDG_DATA_DIRS").
         "/usr/share/ubuntu:/usr/share/gnome:/usr/local/share/:/usr/share/"
        -11> filename:basedir(site_data, "my_application", #{os=>linux}).
        -["/usr/share/ubuntu/my_application",
        +11> filename:basedir(site_data, "my_application", #{os=>linux}).
        +["/usr/share/ubuntu/my_application",
          "/usr/share/gnome/my_application",
          "/usr/local/share/my_application",
        - "/usr/share/my_application"]
        -12> os:unsetenv("XDG_DATA_DIRS").
        + "/usr/share/my_application"]
        +12> os:unsetenv("XDG_DATA_DIRS").
         true
        -13> filename:basedir(site_data, "my_application", #{os=>linux}).
        -["/usr/local/share/my_application",
        - "/usr/share/my_application"]

        On Darwin:

        5> filename:basedir(site_data, "my_application", #{os=>darwin}).
        -["/Library/Application Support/my_application"]
      +13>
      filename:basedir(site_data, "my_application", #{os=>linux}). +["/usr/local/share/my_application", + "/usr/share/my_application"]

      On Darwin:

      5> filename:basedir(site_data, "my_application", #{os=>darwin}).
      +["/Library/Application Support/my_application"]
    @@ -638,12 +638,12 @@

    Returns the last component of Filename, or Filename itself if it does not -contain any directory separators.

    Examples:

    5> filename:basename("foo").
    +contain any directory separators.

    Examples:

    5> filename:basename("foo").
     "foo"
    -6> filename:basename("/usr/foo").
    +6> filename:basename("/usr/foo").
     "foo"
    -7> filename:basename("/").
    -[]
    +7>
    filename:basename("/"). +[]
    @@ -674,15 +674,15 @@

    Returns the last component of Filename with extension Ext stripped.

    This function is to be used to remove a (possible) specific extension. To remove an existing extension when you are unsure which one it is, use -rootname(basename(Filename)).

    Examples:

    8> filename:basename("~/src/kalle.erl", ".erl").
    +rootname(basename(Filename)).

    Examples:

    8> filename:basename("~/src/kalle.erl", ".erl").
     "kalle"
    -9> filename:basename("~/src/kalle.beam", ".erl").
    +9> filename:basename("~/src/kalle.beam", ".erl").
     "kalle.beam"
    -10> filename:basename("~/src/kalle.old.erl", ".erl").
    +10> filename:basename("~/src/kalle.old.erl", ".erl").
     "kalle.old"
    -11> filename:rootname(filename:basename("~/src/kalle.erl")).
    +11> filename:rootname(filename:basename("~/src/kalle.erl")).
     "kalle"
    -12> filename:rootname(filename:basename("~/src/kalle.beam")).
    +12> filename:rootname(filename:basename("~/src/kalle.beam")).
     "kalle"
    @@ -711,10 +711,10 @@ -

    Returns the directory part of Filename.

    Examples:

    13> filename:dirname("/usr/src/kalle.erl").
    +

    Returns the directory part of Filename.

    Examples:

    13> filename:dirname("/usr/src/kalle.erl").
     "/usr/src"
    -14> filename:dirname("kalle.erl").
    -"."
    5> filename:dirname("\\usr\\src/kalle.erl"). % Windows
    +14> filename:dirname("kalle.erl").
    +"."
    5> filename:dirname("\\usr\\src/kalle.erl"). % Windows
     "/usr/src"
    @@ -744,10 +744,10 @@

    Returns the file extension of Filename, including the period. Returns an empty -string if no extension exists.

    Examples:

    15> filename:extension("foo.erl").
    +string if no extension exists.

    Examples:

    15> filename:extension("foo.erl").
     ".erl"
    -16> filename:extension("beam.src/kalle").
    -[]
    +16>
    filename:extension("beam.src/kalle"). +[]
    @@ -807,10 +807,10 @@

    Joins a list of filename Components with directory separators. If one of the elements of Components includes an absolute path, such as "/xxx", the preceding elements, if any, are removed from the result.

    The result is "normalized":

    • Redundant directory separators are removed.
    • In Windows, all directory separators are forward slashes and the drive letter -is in lower case.

    Examples:

    17> filename:join(["/usr", "local", "bin"]).
    +is in lower case.

    Examples:

    17> filename:join(["/usr", "local", "bin"]).
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/gen_event.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/gen_event.xhtml	2025-05-10 20:19:24.273327935 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/gen_event.xhtml	2025-05-10 20:19:24.313328297 +0000
    @@ -1182,15 +1182,15 @@
     but it may transform some values.

    Two possible use cases for this callback is to remove sensitive information from the state to prevent it from being printed in log files, or to compact large irrelevant status items -that would only clutter the logs.

    Example:

    format_status(Status) ->
    -  maps:map(
    -    fun(state,State) ->
    -            maps:remove(private_key, State);
    -       (message,{password, _Pass}) ->
    -            {password, removed};
    -       (_,Value) ->
    +that would only clutter the logs.

    Example:

    format_status(Status) ->
    +  maps:map(
    +    fun(state,State) ->
    +            maps:remove(private_key, State);
    +       (message,{password, _Pass}) ->
    +            {password, removed};
    +       (_,Value) ->
                 Value
    -    end, Status).

    Note

    This callback is optional, so event handler modules need not export it. + end, Status).

    Note

    This callback is optional, so event handler modules need not export it. If a handler does not export this function, the gen_event module uses the handler state directly for the purposes described below.

    If this callback is exported but fails, to hide possibly sensitive data, the default function will instead return the fact that /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/gen_fsm.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/gen_fsm.xhtml 2025-05-10 20:19:24.273327935 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/gen_fsm.xhtml 2025-05-10 20:19:24.313328297 +0000 @@ -30,163 +30,163 @@ Migration to gen_statem

    Here follows a simple example of turning a gen_fsm into a gen_statem. -The example comes from the previous User's Guide for gen_fsm

    -module(code_lock).
    --define(NAME, code_lock).
    +The example comes from the previous User's Guide for gen_fsm

    -module(code_lock).
    +-define(NAME, code_lock).
     %-define(BEFORE_REWRITE, true).
     
    --ifdef(BEFORE_REWRITE).
    --behaviour(gen_fsm).
    +-ifdef(BEFORE_REWRITE).
    +-behaviour(gen_fsm).
     -else.
    --behaviour(gen_statem).
    +-behaviour(gen_statem).
     -endif.
     
    --export([start_link/1, button/1, stop/0]).
    +-export([start_link/1, button/1, stop/0]).
     
    --ifdef(BEFORE_REWRITE).
    --export([init/1, locked/2, open/2, handle_sync_event/4, handle_event/3,
    -     handle_info/3, terminate/3, code_change/4]).
    +-ifdef(BEFORE_REWRITE).
    +-export([init/1, locked/2, open/2, handle_sync_event/4, handle_event/3,
    +     handle_info/3, terminate/3, code_change/4]).
     -else.
    --export([init/1, callback_mode/0, locked/3, open/3,
    -     terminate/3, code_change/4]).
    +-export([init/1, callback_mode/0, locked/3, open/3,
    +     terminate/3, code_change/4]).
     %% Add callback__mode/0
     %% Change arity of the state functions
     %% Remove handle_info/3
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -start_link(Code) ->
    -    gen_fsm:start_link({local, ?NAME}, ?MODULE, Code, []).
    +-ifdef(BEFORE_REWRITE).
    +start_link(Code) ->
    +    gen_fsm:start_link({local, ?NAME}, ?MODULE, Code, []).
     -else.
    -start_link(Code) ->
    -    gen_statem:start_link({local,?NAME}, ?MODULE, Code, []).
    +start_link(Code) ->
    +    gen_statem:start_link({local,?NAME}, ?MODULE, Code, []).
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -button(Digit) ->
    -    gen_fsm:send_event(?NAME, {button, Digit}).
    +-ifdef(BEFORE_REWRITE).
    +button(Digit) ->
    +    gen_fsm:send_event(?NAME, {button, Digit}).
     -else.
    -button(Digit) ->
    -    gen_statem:cast(?NAME, {button,Digit}).
    +button(Digit) ->
    +    gen_statem:cast(?NAME, {button,Digit}).
         %% send_event is asynchronous and becomes a cast
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -stop() ->
    -    gen_fsm:sync_send_all_state_event(?NAME, stop).
    +-ifdef(BEFORE_REWRITE).
    +stop() ->
    +    gen_fsm:sync_send_all_state_event(?NAME, stop).
     -else.
    -stop() ->
    -    gen_statem:call(?NAME, stop).
    +stop() ->
    +    gen_statem:call(?NAME, stop).
         %% sync_send is synchronous and becomes call
         %% all_state is handled by callback code in gen_statem
     -endif.
     
    -init(Code) ->
    -    do_lock(),
    -    Data = #{code => Code, remaining => Code},
    -    {ok, locked, Data}.
    +init(Code) ->
    +    do_lock(),
    +    Data = #{code => Code, remaining => Code},
    +    {ok, locked, Data}.
     
    --ifdef(BEFORE_REWRITE).
    +-ifdef(BEFORE_REWRITE).
     -else.
    -callback_mode() ->
    +callback_mode() ->
         state_functions.
     %% state_functions mode is the mode most similar to
     %% gen_fsm. There is also handle_event mode which is
     %% a fairly different concept.
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -locked({button, Digit}, Data0) ->
    -    case analyze_lock(Digit, Data0) of
    -    {open = StateName, Data} ->
    -        {next_state, StateName, Data, 10000};
    -    {StateName, Data} ->
    -        {next_state, StateName, Data}
    +-ifdef(BEFORE_REWRITE).
    +locked({button, Digit}, Data0) ->
    +    case analyze_lock(Digit, Data0) of
    +    {open = StateName, Data} ->
    +        {next_state, StateName, Data, 10000};
    +    {StateName, Data} ->
    +        {next_state, StateName, Data}
         end.
     -else.
    -locked(cast, {button,Digit}, Data0) ->
    -    case analyze_lock(Digit, Data0) of
    -    {open = StateName, Data} ->
    -        {next_state, StateName, Data, 10000};
    -    {StateName, Data} ->
    -        {next_state, StateName, Data}
    +locked(cast, {button,Digit}, Data0) ->
    +    case analyze_lock(Digit, Data0) of
    +    {open = StateName, Data} ->
    +        {next_state, StateName, Data, 10000};
    +    {StateName, Data} ->
    +        {next_state, StateName, Data}
         end;
    -locked({call, From}, Msg, Data) ->
    -    handle_call(From, Msg, Data);
    -locked({info, Msg}, StateName, Data) ->
    -    handle_info(Msg, StateName, Data).
    +locked({call, From}, Msg, Data) ->
    +    handle_call(From, Msg, Data);
    +locked({info, Msg}, StateName, Data) ->
    +    handle_info(Msg, StateName, Data).
     %% Arity differs
     %% All state events are dispatched to handle_call and handle_info help
     %% functions. If you want to handle a call or cast event specifically
     %% for this state you would add a special clause for it above.
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -open(timeout, State) ->
    -     do_lock(),
    -    {next_state, locked, State};
    -open({button,_}, Data) ->
    -    {next_state, locked, Data}.
    --else.
    -open(timeout, _, Data) ->
    -    do_lock(),
    -    {next_state, locked, Data};
    -open(cast, {button,_}, Data) ->
    -    {next_state, locked, Data};
    -open({call, From}, Msg, Data) ->
    -    handle_call(From, Msg, Data);
    -open(info, Msg, Data) ->
    -    handle_info(Msg, open, Data).
    +-ifdef(BEFORE_REWRITE).
    +open(timeout, State) ->
    +     do_lock(),
    +    {next_state, locked, State};
    +open({button,_}, Data) ->
    +    {next_state, locked, Data}.
    +-else.
    +open(timeout, _, Data) ->
    +    do_lock(),
    +    {next_state, locked, Data};
    +open(cast, {button,_}, Data) ->
    +    {next_state, locked, Data};
    +open({call, From}, Msg, Data) ->
    +    handle_call(From, Msg, Data);
    +open(info, Msg, Data) ->
    +    handle_info(Msg, open, Data).
     %% Arity differs
     %% All state events are dispatched to handle_call and handle_info help
     %% functions. If you want to handle a call or cast event specifically
     %% for this state you would add a special clause for it above.
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -handle_sync_event(stop, _From, _StateName, Data) ->
    -    {stop, normal, ok, Data}.
    +-ifdef(BEFORE_REWRITE).
    +handle_sync_event(stop, _From, _StateName, Data) ->
    +    {stop, normal, ok, Data}.
     
    -handle_event(Event, StateName, Data) ->
    -    {stop, {shutdown, {unexpected, Event, StateName}}, Data}.
    +handle_event(Event, StateName, Data) ->
    +    {stop, {shutdown, {unexpected, Event, StateName}}, Data}.
     
    -handle_info(Info, StateName, Data) ->
    -    {stop, {shutdown, {unexpected, Info, StateName}}, StateName, Data}.
    +handle_info(Info, StateName, Data) ->
    +    {stop, {shutdown, {unexpected, Info, StateName}}, StateName, Data}.
     -else.
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/gen_server.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/gen_server.xhtml	2025-05-10 20:19:24.269327898 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/gen_server.xhtml	2025-05-10 20:19:24.313328297 +0000
    @@ -1158,15 +1158,15 @@
     but it may transform some values.

    Two possible use cases for this callback is to remove sensitive information from the state to prevent it from being printed in log files, or to compact large irrelevant status items -that would only clutter the logs.

    Example:

    format_status(Status) ->
    -  maps:map(
    -    fun(state,State) ->
    -            maps:remove(private_key, State);
    -       (message,{password, _Pass}) ->
    -            {password, removed};
    -       (_,Value) ->
    +that would only clutter the logs.

    Example:

    format_status(Status) ->
    +  maps:map(
    +    fun(state,State) ->
    +            maps:remove(private_key, State);
    +       (message,{password, _Pass}) ->
    +            {password, removed};
    +       (_,Value) ->
                 Value
    -    end, Status).

    Note

    This callback is optional, so callback modules need not export it. The + end, Status).

    Note

    This callback is optional, so callback modules need not export it. The gen_server module provides a default implementation of this function that returns the callback module state.

    If this callback is exported but fails, to hide possibly sensitive data, /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/gen_statem.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/gen_statem.xhtml 2025-05-10 20:19:24.269327898 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/gen_statem.xhtml 2025-05-10 20:19:24.309328261 +0000 @@ -71,7 +71,7 @@ depending on callback mode Release upgrade/downgrade -(code change) +(code change) -----> Module:code_change/4

    State callback

    The state callback for a specific state in a gen_statem is the callback function that is called for all events in this state. It is selected depending on which callback mode @@ -197,97 +197,97 @@ Pushbutton Code -

    The following is the complete callback module file pushbutton.erl:

    -module(pushbutton).
    --behaviour(gen_statem).
    +

    The following is the complete callback module file pushbutton.erl:

    -module(pushbutton).
    +-behaviour(gen_statem).
     
    --export([start/0,push/0,get_count/0,stop/0]).
    --export([terminate/3,code_change/4,init/1,callback_mode/0]).
    --export([on/3,off/3]).
    +-export([start/0,push/0,get_count/0,stop/0]).
    +-export([terminate/3,code_change/4,init/1,callback_mode/0]).
    +-export([on/3,off/3]).
     
    -name() -> pushbutton_statem. % The registered server name
    +name() -> pushbutton_statem. % The registered server name
     
     %% API.  This example uses a registered name name()
     %% and does not link to the caller.
    -start() ->
    -    gen_statem:start({local,name()}, ?MODULE, [], []).
    -push() ->
    -    gen_statem:call(name(), push).
    -get_count() ->
    -    gen_statem:call(name(), get_count).
    -stop() ->
    -    gen_statem:stop(name()).
    +start() ->
    +    gen_statem:start({local,name()}, ?MODULE, [], []).
    +push() ->
    +    gen_statem:call(name(), push).
    +get_count() ->
    +    gen_statem:call(name(), get_count).
    +stop() ->
    +    gen_statem:stop(name()).
     
     %% Mandatory callback functions
    -terminate(_Reason, _State, _Data) ->
    +terminate(_Reason, _State, _Data) ->
         void.
    -code_change(_Vsn, State, Data, _Extra) ->
    -    {ok,State,Data}.
    -init([]) ->
    +code_change(_Vsn, State, Data, _Extra) ->
    +    {ok,State,Data}.
    +init([]) ->
         %% Set the initial state + data.  Data is used only as a counter.
         State = off, Data = 0,
    -    {ok,State,Data}.
    -callback_mode() -> state_functions.
    +    {ok,State,Data}.
    +callback_mode() -> state_functions.
     
     %%% state callback(s)
     
    -off({call,From}, push, Data) ->
    +off({call,From}, push, Data) ->
         %% Go to 'on', increment count and reply
         %% that the resulting status is 'on'
    -    {next_state,on,Data+1,[{reply,From,on}]};
    -off(EventType, EventContent, Data) ->
    -    handle_event(EventType, EventContent, Data).
    +    {next_state,on,Data+1,[{reply,From,on}]};
    +off(EventType, EventContent, Data) ->
    +    handle_event(EventType, EventContent, Data).
     
    -on({call,From}, push, Data) ->
    +on({call,From}, push, Data) ->
         %% Go to 'off' and reply that the resulting status is 'off'
    -    {next_state,off,Data,[{reply,From,off}]};
    -on(EventType, EventContent, Data) ->
    -    handle_event(EventType, EventContent, Data).
    +    {next_state,off,Data,[{reply,From,off}]};
    +on(EventType, EventContent, Data) ->
    +    handle_event(EventType, EventContent, Data).
     
     %% Handle events common to all states
    -handle_event({call,From}, get_count, Data) ->
    +handle_event({call,From}, get_count, Data) ->
         %% Reply with the current count
    -    {keep_state,Data,[{reply,From,Data}]};
    -handle_event(_, _, Data) ->
    +    {keep_state,Data,[{reply,From,Data}]};
    +handle_event(_, _, Data) ->
         %% Ignore all other events
    -    {keep_state,Data}.

    The following is a shell session when running it:

    1> pushbutton:start().
    -{ok,<0.36.0>}
    -2> pushbutton:get_count().
    +    {keep_state,Data}.

    The following is a shell session when running it:

    1> pushbutton:start().
    +{ok,<0.36.0>}
    +2> pushbutton:get_count().
     0
    -3> pushbutton:push().
    +3> pushbutton:push().
     on
    -4> pushbutton:get_count().
    +4> pushbutton:get_count().
     1
    -5> pushbutton:push().
    +5> pushbutton:push().
     off
    -6> pushbutton:get_count().
    +6> pushbutton:get_count().
     1
    -7> pushbutton:stop().
    +7> pushbutton:stop().
     ok
    -8> pushbutton:push().
    +8> pushbutton:push().
     ** exception exit: {noproc,{gen_statem,call,[pushbutton_statem,push,infinity]}}
          in function  gen:do_for_proc/2 (gen.erl, line 261)
          in call from gen_statem:call/3 (gen_statem.erl, line 386)

    To compare styles, here follows the same example using callback mode handle_event_function, or rather, the code to replace after function init/1 -of the pushbutton.erl example file above:

    callback_mode() -> handle_event_function.
    +of the pushbutton.erl example file above:

    callback_mode() -> handle_event_function.
     
     %%% state callback(s)
     
    -handle_event({call,From}, push, off, Data) ->
    +handle_event({call,From}, push, off, Data) ->
         %% Go to 'on', increment count and reply
         %% that the resulting status is 'on'
    -    {next_state,on,Data+1,[{reply,From,on}]};
    -handle_event({call,From}, push, on, Data) ->
    +    {next_state,on,Data+1,[{reply,From,on}]};
    +handle_event({call,From}, push, on, Data) ->
         %% Go to 'off' and reply that the resulting status is 'off'
    -    {next_state,off,Data,[{reply,From,off}]};
    +    {next_state,off,Data,[{reply,From,off}]};
     %%
     %% Event handling common to all states
    -handle_event({call,From}, get_count, State, Data) ->
    +handle_event({call,From}, get_count, State, Data) ->
         %% Reply with the current count
    -    {next_state,State,Data,[{reply,From,Data}]};
    -handle_event(_, _, State, Data) ->
    +    {next_state,State,Data,[{reply,From,Data}]};
    +handle_event(_, _, State, Data) ->
         %% Ignore all other events
    -    {next_state,State,Data}.

    Note

    + {next_state,State,Data}.

    Note

    @@ -3056,15 +3056,15 @@ containing the same keys as the input map, but it may transform some values.

    One use case for this function is to return compact alternative state representations to avoid having large state terms printed in log files. -Another is to hide sensitive data from being written to the error log.

    Example:

    format_status(Status) ->
    -  maps:map(
    -    fun(state,State) ->
    -            maps:remove(private_key, State);
    -       (message,{password, _Pass}) ->
    -            {password, removed};
    -       (_,Value) ->
    +Another is to hide sensitive data from being written to the error log.

    Example:

    format_status(Status) ->
    +  maps:map(
    +    fun(state,State) ->
    +            maps:remove(private_key, State);
    +       (message,{password, _Pass}) ->
    +            {password, removed};
    +       (_,Value) ->
                 Value
    -    end, Status).

    Note

    This callback is optional, so a callback module does not need + end, Status).

    Note

    This callback is optional, so a callback module does not need to export it. The gen_statem module provides a default implementation of this function that returns {State, Data}.

    If this callback is exported but fails, to hide possibly sensitive data, the default function will instead return {State, Info}, @@ -3238,8 +3238,8 @@ to initialize the implementation state and server data.

    Args is the Args argument provided to that start function.

    Note

    Note that if the gen_statem is started through proc_lib and enter_loop/4,5,6, this callback will never be called. Since this callback is not optional -it can in that case be implemented as:

    -spec init(_) -> no_return().
    -init(Args) -> erlang:error(not_implemented, [Args]).
    +it can in that case be implemented as:

    -spec init(_) -> no_return().
    +init(Args) -> erlang:error(not_implemented, [Args]).

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/io.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/io.xhtml 2025-05-10 20:19:24.269327898 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/io.xhtml 2025-05-10 20:19:24.309328261 +0000 @@ -43,7 +43,7 @@ Error Information

    The ErrorInfo mentioned in this module is the standard ErrorInfo structure -that is returned from all I/O modules. It has the following format:

    {ErrorLocation, Module, ErrorDescriptor}

    A string that describes the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)
    +that is returned from all I/O modules. It has the following format:

    {ErrorLocation, Module, ErrorDescriptor}

    A string that describes the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)
    @@ -1073,12 +1073,12 @@ no IoDevice argument is specified in the function calls in this module.

    It is sometimes desirable to use an explicit IoDevice argument that refers to the default I/O device. This is the case with functions that can access either a file or the default I/O device. The atom standard_io has this -special meaning. The following example illustrates this:

    27> io:read('enter>').
    +special meaning. The following example illustrates this:

    27> io:read('enter>').
     enter>foo.
    -{ok,foo}
    -28> io:read(standard_io, 'enter>').
    +{ok,foo}
    +28> io:read(standard_io, 'enter>').
     enter>bar.
    -{ok,bar}

    By default all I/O sent to standard_io will end up in the user +{ok,bar}

    By default all I/O sent to standard_io will end up in the user I/O device of the node that spawned the calling process.

    standard_io is an alias for group_leader/0, so in order to change where the default input/output requests are sent you can change the group leader of the current process using @@ -1348,33 +1348,33 @@ whitespace characters are stripped. An Erlang string (list of characters) is returned.

    If Unicode translation is in effect (~ts), characters > 255 are accepted, otherwise not. With the translation modifier, the returned list can as a -consequence also contain integers > 255:

    1> io:fread("Prompt> ","~s").
    +consequence also contain integers > 255:

    1> io:fread("Prompt> ","~s").
     Prompt> <Characters beyond latin1 range not printable in this medium>
    -{error,{fread,string}}
    -2> io:fread("Prompt> ","~ts").
    +{error,{fread,string}}
    +2> io:fread("Prompt> ","~ts").
     Prompt> <Characters beyond latin1 range not printable in this medium>
    -{ok,[[1091,1085,1080,1094,1086,1076,1077]]}
  • a - Similar to s, but the resulting string is converted into an +{ok,[[1091,1085,1080,1094,1086,1076,1077]]}

  • a - Similar to s, but the resulting string is converted into an atom.

  • c - The number of characters equal to the field width are read (default is 1) and returned as an Erlang string. However, leading and trailing whitespace characters are not omitted as they are with s. All -characters are returned.

    The Unicode translation modifier works as with s:

    1> io:fread("Prompt> ","~c").
    +characters are returned.

    The Unicode translation modifier works as with s:

    1> io:fread("Prompt> ","~c").
     Prompt> <Character beyond latin1 range not printable in this medium>
    -{error,{fread,string}}
    -2> io:fread("Prompt> ","~tc").
    +{error,{fread,string}}
    +2> io:fread("Prompt> ","~tc").
     Prompt> <Character beyond latin1 range not printable in this medium>
    -{ok,[[1091]]}
  • l - Returns the number of characters that have been scanned up to that +{ok,[[1091]]}

  • l - Returns the number of characters that have been scanned up to that point, including whitespace characters.

  • The function returns:
    • {ok, Terms} - The read was successful and Terms is the list of successfully matched and read items.

    • eof - End of file was encountered.

    • {error, FreadError} - The reading failed and FreadError gives a hint about the error.

    • {error, ErrorDescription} - The read operation failed and parameter -ErrorDescription gives a hint about the error.

    Examples:

    20> io:fread('enter>', "~f~f~f").
    +ErrorDescription gives a hint about the error.

    Examples:

    20> io:fread('enter>', "~f~f~f").
     enter>1.9 35.5e3 15.0
    -{ok,[1.9,3.55e4,15.0]}
    -21> io:fread('enter>', "~10f~d").
    +{ok,[1.9,3.55e4,15.0]}
    +21> io:fread('enter>', "~10f~d").
     enter>     5.67899
    -{ok,[5.678,99]}
    -22> io:fread('enter>', ":~10s:~10c:").
    +{ok,[5.678,99]}
    +22> io:fread('enter>', ":~10s:~10c:").
     enter>:   alan   :   joe    :
    -{ok, ["alan", "   joe    "]}
    +
    {ok, ["alan", " joe "]}
    @@ -1463,7 +1463,7 @@ the output device, and control sequences for formatting, see below. If Format is an atom or a binary, it is first converted to a list with the aid of atom_to_list/1 or -binary_to_list/1. Example:

    1> io:fwrite("Hello world!~n", []).
    +binary_to_list/1. Example:

    1> io:fwrite("Hello world!~n", []).
     Hello world!
     ok

    The general format of a control sequence is ~F.P.PadModC.

    The character C determines the type of control sequence to be used. It is the only required field. All of F, P, Pad, and Mod are optional. For @@ -1481,25 +1481,25 @@ padding character is ' ' (space).

  • Mod is the control sequence modifier. This is one or more characters that change the interpretation of Data.

    The current modifiers are:

    • t - For Unicode translation.

    • l - For stopping p and P from detecting printable characters.

    • k - For use with p, P, w, and W to format maps in map-key ordered order (see maps:iterator_order/0).

    • K - Similar to k, for formatting maps in map-key order, but takes an -extra argument that specifies the maps:iterator_order/0.

      For example:

      > M = #{ a => 1, b => 2 }.
      -#{a => 1,b => 2}
      -> io:format("~Kp~n", [reversed, M]).
      -#{b => 2,a => 1}
      +extra argument that specifies the maps:iterator_order/0.

      For example:

      > M = #{ a => 1, b => 2 }.
      +#{a => 1,b => 2}
      +> io:format("~Kp~n", [reversed, M]).
      +#{b => 2,a => 1}
       ok
  • If F, P, or Pad is a * character, the next argument in Data is used as -the value. For example:

    1> io:fwrite("~*.*.0f~n",[9, 5, 3.14159265]).
    +the value. For example:

    1> io:fwrite("~*.*.0f~n",[9, 5, 3.14159265]).
     003.14159
    -ok

    To use a literal * character as Pad, it must be passed as an argument:

    2> io:fwrite("~*.*.*f~n",[9, 5, $*, 3.14159265]).
    +ok

    To use a literal * character as Pad, it must be passed as an argument:

    2> io:fwrite("~*.*.*f~n",[9, 5, $*, 3.14159265]).
     **3.14159
     ok

    Available control sequences:

    • ~ - Character ~ is written.

    • c - The argument is a number that is interpreted as an ASCII code. The precision is the number of times the character is printed and defaults to the -field width, which in turn defaults to 1. Example:

      1> io:fwrite("|~10.5c|~-10.5c|~5c|~n", [$a, $b, $c]).
      +field width, which in turn defaults to 1. Example:

      1> io:fwrite("|~10.5c|~-10.5c|~5c|~n", [$a, $b, $c]).
       |     aaaaa|bbbbb     |ccccc|
       ok

      If the Unicode translation modifier (t) is in effect, the integer argument can be any number representing a valid Unicode codepoint, otherwise it is to -be an integer less than or equal to 255, otherwise it is masked with 16#FF:

      2> io:fwrite("~tc~n",[1024]).
      -\x{400}
      +be an integer less than or equal to 255, otherwise it is masked with 16#FF:

      2> io:fwrite("~tc~n",[1024]).
      +\x{400}
       ok
      -3> io:fwrite("~c~n",[1024]).
      +3> io:fwrite("~c~n",[1024]).
       ^@
       ok
    • f - The argument is a float that is written as [-]ddd.ddd, where the precision is the number of digits after the decimal point. The default @@ -1517,18 +1517,18 @@ binaries are in UTF-8. The characters are printed without quotes. The string is first truncated by the specified precision and then padded and justified to the specified field width. The default precision is the field width.

      This format can be used for printing any object and truncating the output so -it fits a specified field:

      1> io:fwrite("|~10w|~n", [{hey, hey, hey}]).
      +it fits a specified field:

      1> io:fwrite("|~10w|~n", [{hey, hey, hey}]).
       |**********|
       ok
      -2> io:fwrite("|~10s|~n", [io_lib:write({hey, hey, hey})]).
      -|{hey,hey,h|
      -3> io:fwrite("|~-10.8s|~n", [io_lib:write({hey, hey, hey})]).
      -|{hey,hey  |
      +2> io:fwrite("|~10s|~n", [io_lib:write({hey, hey, hey})]).
      +|{hey,hey,h|
      +3> io:fwrite("|~-10.8s|~n", [io_lib:write({hey, hey, hey})]).
      +|{hey,hey  |
       ok

      A list with integers > 255 is considered an error if the Unicode translation -modifier is not specified:

      4> io:fwrite("~ts~n",[[1024]]).
      -\x{400}
      +modifier is not specified:

      4> io:fwrite("~ts~n",[[1024]]).
      +\x{400}
       ok
      -5> io:fwrite("~s~n",[[1024]]).
      +5> io:fwrite("~s~n",[[1024]]).
       ** exception error: bad argument
            in function  io:format/3
               called as io:format(<0.53.0>,"~s~n",[[1024]])
    • w - Writes data with the standard syntax. This is used to output Erlang @@ -1539,122 +1539,122 @@ breaks terms whose printed representation is longer than one line into many lines and indents each line sensibly. Left-justification is not supported. It also tries to detect flat lists of printable characters and output these as -strings. For example:

      1> T = [{attributes,[[{id,age,1.50000},{mode,explicit},
      -{typename,"INTEGER"}], [{id,cho},{mode,explicit},{typename,'Cho'}]]},
      -{typename,'Person'},{tag,{'PRIVATE',3}},{mode,implicit}].
      +strings. For example:

      1> T = [{attributes,[[{id,age,1.50000},{mode,explicit},
      +{typename,"INTEGER"}], [{id,cho},{mode,explicit},{typename,'Cho'}]]},
      +{typename,'Person'},{tag,{'PRIVATE',3}},{mode,implicit}].
       ...
      -2> io:fwrite("~w~n", [T]).
      -[{attributes,[[{id,age,1.5},{mode,explicit},{typename,
      -[73,78,84,69,71,69,82]}],[{id,cho},{mode,explicit},{typena
      -me,'Cho'}]]},{typename,'Person'},{tag,{'PRIVATE',3}},{mode
      -,implicit}]
      +2> io:fwrite("~w~n", [T]).
      +[{attributes,[[{id,age,1.5},{mode,explicit},{typename,
      +[73,78,84,69,71,69,82]}],[{id,cho},{mode,explicit},{typena
      +me,'Cho'}]]},{typename,'Person'},{tag,{'PRIVATE',3}},{mode
      +,implicit}]
       ok
      -3> io:fwrite("~62p~n", [T]).
      -[{attributes,[[{id,age,1.5},
      -               {mode,explicit},
      -               {typename,"INTEGER"}],
      -              [{id,cho},{mode,explicit},{typename,'Cho'}]]},
      - {typename,'Person'},
      - {tag,{'PRIVATE',3}},
      - {mode,implicit}]
      +3> io:fwrite("~62p~n", [T]).
      +[{attributes,[[{id,age,1.5},
      +               {mode,explicit},
      +               {typename,"INTEGER"}],
      +              [{id,cho},{mode,explicit},{typename,'Cho'}]]},
      + {typename,'Person'},
      + {tag,{'PRIVATE',3}},
      + {mode,implicit}]
       ok

      The field width specifies the maximum line length. It defaults to 80. The precision specifies the initial indentation of the term. It defaults to the number of characters printed on this line in the same call to write/1 or -format/1,2,3. For example, using T above:

      4> io:fwrite("Here T = ~62p~n", [T]).
      -Here T = [{attributes,[[{id,age,1.5},
      -                        {mode,explicit},
      -                        {typename,"INTEGER"}],
      -                       [{id,cho},
      -                        {mode,explicit},
      -                        {typename,'Cho'}]]},
      -          {typename,'Person'},
      -          {tag,{'PRIVATE',3}},
      -          {mode,implicit}]
      +format/1,2,3. For example, using T above:

      4> io:fwrite("Here T = ~62p~n", [T]).
      /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/io_lib.xhtml differs (HTML document, ASCII text, with very long lines)
      --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/io_lib.xhtml	2025-05-10 20:19:24.265327862 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/io_lib.xhtml	2025-05-10 20:19:24.309328261 +0000
      @@ -911,8 +911,8 @@
       input is needed to complete the original format string. RestFormat is the
       remaining format string, Nchars is the number of characters scanned, and
       InputStack is the reversed list of inputs matched up to that point.

    • {error, What} - The read operation failed and parameter What gives a -hint about the error.

    Example:

    3> io_lib:fread("~f~f~f", "15.6 17.3e-6 24.5").
    -{ok,[15.6,1.73e-5,24.5],[]}
    +hint about the error.

    Example:

    3> io_lib:fread("~f~f~f", "15.6 17.3e-6 24.5").
    +{ok,[15.6,1.73e-5,24.5],[]}
    @@ -1417,11 +1417,11 @@ "...".

    Depth defaults to -1, which means no limitation. Option CharsLimit puts a soft limit on the number of characters returned. When the number of characters is reached, remaining structures are replaced by "...". CharsLimit defaults to -1, -which means no limit on the number of characters returned.

    Example:

    1> lists:flatten(io_lib:write({1,[2],[3],[4,5],6,7,8,9})).
    +which means no limit on the number of characters returned.

    Example:

    1> lists:flatten(io_lib:write({1,[2],[3],[4,5],6,7,8,9})).
     "{1,[2],[3],[4,5],6,7,8,9}"
    -2> lists:flatten(io_lib:write({1,[2],[3],[4,5],6,7,8,9}, 5)).
    +2> lists:flatten(io_lib:write({1,[2],[3],[4,5],6,7,8,9}, 5)).
     "{1,[2],[3],[...],...}"
    -3> lists:flatten(io_lib:write({[1,2,3],[4,5],6,7,8,9}, [{chars_limit,20}])).
    +3> lists:flatten(io_lib:write({[1,2,3],[4,5],6,7,8,9}, [{chars_limit,20}])).
     "{[1,2|...],[4|...],...}"
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/io_protocol.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/io_protocol.xhtml 2025-05-10 20:19:24.265327862 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/io_protocol.xhtml 2025-05-10 20:19:24.309328261 +0000 @@ -41,8 +41,8 @@ Protocol Basics

    As described in Robert's paper, I/O servers and clients communicate using -io_request/io_reply tuples as follows:

    {io_request, From, ReplyAs, Request}
    -{io_reply, ReplyAs, Reply}

    The client sends an io_request tuple to the I/O server and the server +io_request/io_reply tuples as follows:

    {io_request, From, ReplyAs, Request}
    +{io_reply, ReplyAs, Reply}

    The client sends an io_request tuple to the I/O server and the server eventually sends a corresponding io_reply tuple.

    • From is the pid/0 of the client, the process which the I/O server sends the I/O reply to.

    • ReplyAs can be any datum and is returned in the corresponding io_reply. The io module monitors the I/O server and uses the monitor reference as @@ -59,8 +59,8 @@ Output Requests -

      To output characters on an I/O device, the following Requests exist:

      {put_chars, Encoding, Characters}
      -{put_chars, Encoding, Module, Function, Args}
      • Encoding is unicode or latin1, meaning that the characters are (in case +

        To output characters on an I/O device, the following Requests exist:

        {put_chars, Encoding, Characters}
        +{put_chars, Encoding, Module, Function, Args}
        • Encoding is unicode or latin1, meaning that the characters are (in case of binaries) encoded as UTF-8 or ISO Latin-1 (pure bytes). A well-behaved I/O server is also to return an error indication if list elements contain integers > 255 when Encoding is set to latin1.

          Notice that this does not in any way tell how characters are to be put on the @@ -86,7 +86,7 @@ Input Requests -

          To read characters from an I/O device, the following Requests exist:

          {get_until, Encoding, Prompt, Module, Function, ExtraArgs}
          • Encoding denotes how data is to be sent back to the client and what data is +

            To read characters from an I/O device, the following Requests exist:

            {get_until, Encoding, Prompt, Module, Function, ExtraArgs}
            • Encoding denotes how data is to be sent back to the client and what data is sent to the function denoted by Module/Function/ExtraArgs. If the function supplied returns data as a list, the data is converted to this encoding. If the function supplied returns data in some other format, no @@ -102,8 +102,8 @@ nothing being written to the I/O device).

            • Module, Function, and ExtraArgs denote a function and arguments to determine when enough data is written. The function is to take two more arguments, the last state, and a list of characters. The function is to return -one of:

              {done, Result, RestChars}
              -{more, Continuation}

              Result can be any Erlang term, but if it is a list/0, the I/O server can +one of:

              {done, Result, RestChars}
              +{more, Continuation}

              Result can be any Erlang term, but if it is a list/0, the I/O server can convert it to a binary/0 of appropriate format before returning it to the client, if the I/O server is set in binary mode (see below).

              The function is called with the data the I/O server finds on its I/O device, returning one of:

              • {done, Result, RestChars} when enough data is read. In this case Result @@ -113,28 +113,28 @@ characters are available. When no more characters are available, the function must return {done, eof, Rest}. The initial state is the empty list. The data when an end of file is reached on the IO device is the atom eof.

                An emulation of the get_line request can be (inefficiently) implemented -using the following functions:

                -module(demo).
                --export([until_newline/3, get_line/1]).
                +using the following functions:

                -module(demo).
                +-export([until_newline/3, get_line/1]).
                 
                -until_newline(_ThisFar,eof,_MyStopCharacter) ->
                -    {done,eof,[]};
                -until_newline(ThisFar,CharList,MyStopCharacter) ->
                +until_newline(_ThisFar,eof,_MyStopCharacter) ->
                +    {done,eof,[]};
                +until_newline(ThisFar,CharList,MyStopCharacter) ->
                     case
                -        lists:splitwith(fun(X) -> X =/= MyStopCharacter end,  CharList)
                +        lists:splitwith(fun(X) -> X =/= MyStopCharacter end,  CharList)
                     of
                -  {L,[]} ->
                -            {more,ThisFar++L};
                -  {L2,[MyStopCharacter|Rest]} ->
                -      {done,ThisFar++L2++[MyStopCharacter],Rest}
                +  {L,[]} ->
                +            {more,ThisFar++L};
                +  {L2,[MyStopCharacter|Rest]} ->
                +      {done,ThisFar++L2++[MyStopCharacter],Rest}
                     end.
                 
                -get_line(IoServer) ->
                -    IoServer ! {io_request,
                -                self(),
                +get_line(IoServer) ->
                +    IoServer ! {io_request,
                +                self(),
                                 IoServer,
                -                {get_until, unicode, '', ?MODULE, until_newline, [$\n]}},
                +                {get_until, unicode, '', ?MODULE, until_newline, [$\n]}},
                     receive
                -        {io_reply, IoServer, Data} ->
                +        {io_reply, IoServer, Data} ->
                       Data
                     end.

                Notice that the last element in the Request tuple ([$\n]) is appended to the argument list when the function is called. The function is to be called @@ -172,10 +172,10 @@ must be able to handle binary data. For convenience, the modes of an I/O server can be set and retrieved using the following I/O requests:

                {setopts, Opts}
                • Opts is a list of options in the format recognized by the proplists module (and by the I/O server).

                As an example, the I/O server for the interactive shell (in group.erl) -understands the following options:

                {binary, boolean()} (or binary/list)
                -{echo, boolean()}
                -{expand_fun, fun()}
                -{encoding, unicode/latin1} (or unicode/latin1)

                Options binary and encoding are common for all I/O servers in OTP, while +understands the following options:

                {binary, boolean()} (or binary/list)
                +{echo, boolean()}
                +{expand_fun, fun()}
                +{encoding, unicode/latin1} (or unicode/latin1)

                Options binary and encoding are common for all I/O servers in OTP, while echo and expand are valid only for this I/O server. Option unicode notifies how characters are put on the physical I/O device, that is, if the terminal itself is Unicode-aware. It does not affect how characters are sent in @@ -198,9 +198,9 @@ continue until one of the requests results in an error or the list is consumed. The result of the last request is sent back to the client.

              The I/O server can, for a list of requests, send any of the following valid results in the reply, depending on the requests in the list:

              ok
              -{ok, Data}
              -{ok, Options}
              -{error, Error}

              +{ok, Data} +{ok, Options} +{error, Error}

    @@ -230,128 +230,128 @@ process handling incoming requests, usually both I/O-requests and other I/O device-specific requests (positioning, closing, and so on).

    The example I/O server stores characters in an ETS table, making up a fairly crude RAM file.

    The module begins with the usual directives, a function to start the I/O server -and a main loop handling the requests:

    -module(ets_io_server).
    +and a main loop handling the requests:

    -module(ets_io_server).
     
    --export([start_link/0, init/0, loop/1, until_newline/3, until_enough/3]).
    +-export([start_link/0, init/0, loop/1, until_newline/3, until_enough/3]).
     
    --define(CHARS_PER_REC, 10).
    +-define(CHARS_PER_REC, 10).
     
    --record(state, {
    +-record(state, {
     	  table,
     	  position, % absolute
     	  mode % binary | list
    -	 }).
    +	 }).
     
    -start_link() ->
    -    spawn_link(?MODULE,init,[]).
    +start_link() ->
    +    spawn_link(?MODULE,init,[]).
     
    -init() ->
    -    Table = ets:new(noname,[ordered_set]),
    -    ?MODULE:loop(#state{table = Table, position = 0, mode=list}).
    +init() ->
    +    Table = ets:new(noname,[ordered_set]),
    +    ?MODULE:loop(#state{table = Table, position = 0, mode=list}).
     
    -loop(State) ->
    +loop(State) ->
         receive
    -	{io_request, From, ReplyAs, Request} ->
    -	    case request(Request,State) of
    -		{Tag, Reply, NewState} when Tag =:= ok; Tag =:= error ->
    -		    reply(From, ReplyAs, Reply),
    -		    ?MODULE:loop(NewState);
    -		{stop, Reply, _NewState} ->
    -		    reply(From, ReplyAs, Reply),
    -		    exit(Reply)
    +	{io_request, From, ReplyAs, Request} ->
    +	    case request(Request,State) of
    +		{Tag, Reply, NewState} when Tag =:= ok; Tag =:= error ->
    +		    reply(From, ReplyAs, Reply),
    +		    ?MODULE:loop(NewState);
    +		{stop, Reply, _NewState} ->
    +		    reply(From, ReplyAs, Reply),
    +		    exit(Reply)
     	    end;
     	%% Private message
    -	{From, rewind} ->
    -	    From ! {self(), ok},
    -	    ?MODULE:loop(State#state{position = 0});
    +	{From, rewind} ->
    +	    From ! {self(), ok},
    +	    ?MODULE:loop(State#state{position = 0});
     	_Unknown ->
    -	    ?MODULE:loop(State)
    +	    ?MODULE:loop(State)
         end.

    The main loop receives messages from the client (which can use the the io module to send requests). For each request, the function request/2 is called and a reply is eventually sent using function reply/3.

    The "private" message {From, rewind} results in the current position in the pseudo-file to be reset to 0 (the beginning of the "file"). This is a typical example of I/O device-specific messages not being part of the I/O protocol. It is usually a bad idea to embed such private messages in io_request tuples, as -that can confuse the reader.

    First, we examine the reply function:

    reply(From, ReplyAs, Reply) ->
    -    From ! {io_reply, ReplyAs, Reply}.

    It sends the io_reply tuple back to the client, providing element ReplyAs +that can confuse the reader.

    First, we examine the reply function:

    reply(From, ReplyAs, Reply) ->
    +    From ! {io_reply, ReplyAs, Reply}.

    It sends the io_reply tuple back to the client, providing element ReplyAs received in the request along with the result of the request, as described -earlier.

    We need to handle some requests. First the requests for writing characters:

    request({put_chars, Encoding, Chars}, State) ->
    -    put_chars(unicode:characters_to_list(Chars,Encoding),State);
    -request({put_chars, Encoding, Module, Function, Args}, State) ->
    +earlier.

    We need to handle some requests. First the requests for writing characters:

    request({put_chars, Encoding, Chars}, State) ->
    +    put_chars(unicode:characters_to_list(Chars,Encoding),State);
    +request({put_chars, Encoding, Module, Function, Args}, State) ->
         try
    -	request({put_chars, Encoding, apply(Module, Function, Args)}, State)
    +	request({put_chars, Encoding, apply(Module, Function, Args)}, State)
         catch
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/json.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/json.xhtml	2025-05-10 20:19:24.265327862 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/json.xhtml	2025-05-10 20:19:24.305328225 +0000
    @@ -890,8 +890,8 @@
       
       Example
     

    -
    > json:decode(<<"{\"foo\": 1}">>).
    -#{<<"foo">> => 1}
    +
    > json:decode(<<"{\"foo\": 1}">>).
    +#{<<"foo">> => 1}
    @@ -943,9 +943,9 @@ Example -

    Decoding object keys as atoms:

    > Push = fun(Key, Value, Acc) -> [{binary_to_existing_atom(Key), Value} | Acc] end.
    -> json:decode(<<"{\"foo\": 1}">>, ok, #{object_push => Push}).
    -{#{foo => 1},ok,<<>>}
    +

    Decoding object keys as atoms:

    > Push = fun(Key, Value, Acc) -> [{binary_to_existing_atom(Key), Value} | Acc] end.
    +> json:decode(<<"{\"foo\": 1}">>, ok, #{object_push => Push}).
    +{#{foo => 1},ok,<<>>}
    @@ -978,11 +978,11 @@

    Continue parsing a stream of bytes of a JSON value.

    Similar to decode_start/3, if the function returns {continue, State} and -there is no more data, use end_of_input instead of a binary.

    > {continue, State} = json:decode_start(<<"{\"foo\":">>, ok, #{}).
    -> json:decode_continue(<<"1}">>, State).
    -{#{foo => 1},ok,<<>>}
    > {continue, State} = json:decode_start(<<"123">>, ok, #{}).
    -> json:decode_continue(end_of_input, State).
    -{123,ok,<<>>}
    +there is no more data, use end_of_input instead of a binary.

    > {continue, State} = json:decode_start(<<"{\"foo\":">>, ok, #{}).
    +> json:decode_continue(<<"1}">>, State).
    +{#{foo => 1},ok,<<>>}
    > {continue, State} = json:decode_start(<<"123">>, ok, #{}).
    +> json:decode_continue(end_of_input, State).
    +{123,ok,<<>>}
    @@ -1052,7 +1052,7 @@ Examples -
    > iolist_to_binary(json:encode(#{foo => <<"bar">>})).
    +
    > iolist_to_binary(json:encode(#{foo => <<"bar">>})).
     <<"{\"foo\":\"bar\"}">>
    @@ -1094,10 +1094,10 @@ Examples

    An encoder that uses a heuristic to differentiate object-like -lists of key-value pairs from plain lists:

    > encoder([{_, _} | _] = Value, Encode) -> json:encode_key_value_list(Value, Encode);
    -> encoder(Other, Encode) -> json:encode_value(Other, Encode).
    -> custom_encode(Value) -> json:encode(Value, fun(Value, Encode) -> encoder(Value, Encode) end).
    -> iolist_to_binary(custom_encode([{a, []}, {b, 1}])).
    +lists of key-value pairs from plain lists:

    > encoder([{_, _} | _] = Value, Encode) -> json:encode_key_value_list(Value, Encode);
    +> encoder(Other, Encode) -> json:encode_value(Other, Encode).
    +> custom_encode(Value) -> json:encode(Value, fun(Value, Encode) -> encoder(Value, Encode) end).
    +> iolist_to_binary(custom_encode([{a, []}, {b, 1}])).
     <<"{\"a\":[],\"b\":1}">>
    @@ -1489,11 +1489,11 @@ -

    Generates formatted JSON corresponding to Term.

    Similiar to encode/1 but with added whitespaces for formatting.

    > io:put_chars(json:format(#{foo => <<"bar">>, baz => 52})).
    -{
    +

    Generates formatted JSON corresponding to Term.

    Similiar to encode/1 but with added whitespaces for formatting.

    > io:put_chars(json:format(#{foo => <<"bar">>, baz => 52})).
    +{
       "baz": 52,
       "foo": "bar"
    -}
    +}
     ok
    @@ -1558,20 +1558,20 @@

    Generates formatted JSON corresponding to Term.

    Similar to encode/2, can be customised with the Encoder callback and Options.

    Options can include 'indent' to specify number of spaces per level and 'max' which loosely limits the width of lists.

    The Encoder will get a 'State' argument which contains the 'Options' maps merged with other data when recursing through 'Term'.

    format_value/3 or various encode_* functions in this module can be used -to help in constructing such callbacks.

    > formatter({posix_time, SysTimeSecs}, Encode, State) ->
    -    TimeStr = calendar:system_time_to_rfc3339(SysTimeSecs, [{offset, "Z"}]),
    -    json:format_value(unicode:characters_to_binary(TimeStr), Encode, State);
    -> formatter(Other, Encode, State) -> json:format_value(Other, Encode, State).
    +to help in constructing such callbacks.

    > formatter({posix_time, SysTimeSecs}, Encode, State) ->
    +    TimeStr = calendar:system_time_to_rfc3339(SysTimeSecs, [{offset, "Z"}]),
    +    json:format_value(unicode:characters_to_binary(TimeStr), Encode, State);
    +> formatter(Other, Encode, State) -> json:format_value(Other, Encode, State).
     >
    -> Fun = fun(Value, Encode, State) -> formatter(Value, Encode, State) end.
    -> Options = #{indent => 4}.
    -> Term = #{id => 1, time => {posix_time, erlang:system_time(seconds)}}.
    +> Fun = fun(Value, Encode, State) -> formatter(Value, Encode, State) end.
    +> Options = #{indent => 4}.
    +> Term = #{id => 1, time => {posix_time, erlang:system_time(seconds)}}.
     >
    -> io:put_chars(json:format(Term, Fun, Options)).
    -{
    +> io:put_chars(json:format(Term, Fun, Options)).
    +{
         "id": 1,
         "time": "2024-05-23T16:07:48Z"
    -}
    +}
     ok
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/lists.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/lists.xhtml 2025-05-10 20:19:24.265327862 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/lists.xhtml 2025-05-10 20:19:24.305328225 +0000 @@ -1051,8 +1051,8 @@ -

    Returns a list in which all the sublists of ListOfLists have been appended.

    Example:

    > lists:append([[1, 2, 3], [a, b], [4, 5, 6]]).
    -[1,2,3,a,b,4,5,6]
    +

    Returns a list in which all the sublists of ListOfLists have been appended.

    Example:

    > lists:append([[1, 2, 3], [a, b], [4, 5, 6]]).
    +[1,2,3,a,b,4,5,6]
    @@ -1081,7 +1081,7 @@

    Returns a new list List3, which is made from the elements of List1 followed -by the elements of List2.

    Example:

    > lists:append("abc", "def").
    +by the elements of List2.

    Example:

    > lists:append("abc", "def").
     "abcdef"

    lists:append(A, B) is equivalent to A ++ B.

    @@ -1112,7 +1112,7 @@

    Concatenates the text representation of the elements of Things. The elements -of Things can be atoms, integers, floats, or strings.

    Example:

    > lists:concat([doc, '/', file, '.', 3]).
    +of Things can be atoms, integers, floats, or strings.

    Example:

    > lists:concat([doc, '/', file, '.', 3]).
     "doc/file.3"
    @@ -1231,8 +1231,8 @@ -

    Returns a list containing N copies of term Elem.

    Example:

    > lists:duplicate(5, xx).
    -[xx,xx,xx,xx,xx]
    +

    Returns a list containing N copies of term Elem.

    Example:

    > lists:duplicate(5, xx).
    +[xx,xx,xx,xx,xx]
    @@ -1333,12 +1333,12 @@

    Returns List1 with each element H replaced by a tuple of form {I, H} where I is the position of H in List1. The enumeration starts with Index and increases by Step in each step.

    That is, enumerate/3 behaves as if it had been defined as -follows:

    enumerate(I, S, List) ->
    -  {List1, _ } = lists:mapfoldl(fun(T, Acc) -> {{Acc, T}, Acc+S} end, I, List),
    -  List1.

    The default values for Index and Step are both 1.

    Examples:

    > lists:enumerate([a,b,c]).
    -[{1,a},{2,b},{3,c}]
    > lists:enumerate(10, [a,b,c]).
    -[{10,a},{11,b},{12,c}]
    > lists:enumerate(0, -2, [a,b,c]).
    -[{0,a},{-2,b},{-4,c}]
    +follows:

    enumerate(I, S, List) ->
    +  {List1, _ } = lists:mapfoldl(fun(T, Acc) -> {{Acc, T}, Acc+S} end, I, List),
    +  List1.

    The default values for Index and Step are both 1.

    Examples:

    > lists:enumerate([a,b,c]).
    +[{1,a},{2,b},{3,c}]
    > lists:enumerate(10, [a,b,c]).
    +[{10,a},{11,b},{12,c}]
    > lists:enumerate(0, -2, [a,b,c]).
    +[{0,a},{-2,b},{-4,c}]
    @@ -1407,15 +1407,15 @@

    Calls Fun(Elem) on successive elements Elem of List1 in order to update or remove elements from List1.

    Fun/1 must return either a Boolean or a tuple {true, Value}. The function returns the list of elements for which Fun returns a new value, where a value -of true is synonymous with {true, Elem}.

    That is, filtermap behaves as if it had been defined as follows:

    filtermap(Fun, List1) ->
    -    lists:foldr(fun(Elem, Acc) ->
    -                       case Fun(Elem) of
    +of true is synonymous with {true, Elem}.

    That is, filtermap behaves as if it had been defined as follows:

    filtermap(Fun, List1) ->
    +    lists:foldr(fun(Elem, Acc) ->
    +                       case Fun(Elem) of
                                false -> Acc;
    -                           true -> [Elem|Acc];
    -                           {true,Value} -> [Value|Acc]
    +                           true -> [Elem|Acc];
    +                           {true,Value} -> [Value|Acc]
                            end
    -                end, [], List1).

    Example:

    > lists:filtermap(fun(X) -> case X rem 2 of 0 -> {true, X div 2}; _ -> false end end, [1,2,3,4,5]).
    -[1,2]
    +
    end, [], List1).

    Example:

    > lists:filtermap(fun(X) -> case X rem 2 of 0 -> {true, X div 2}; _ -> false end end, [1,2,3,4,5]).
    +[1,2]
    @@ -1474,9 +1474,9 @@

    Takes a function from As to lists of Bs, and a list of As (List1) and produces a list of Bs by applying the function to every element in List1 and -appending the resulting lists.

    That is, flatmap behaves as if it had been defined as follows:

    flatmap(Fun, List1) ->
    -    append(map(Fun, List1)).

    Example:

    > lists:flatmap(fun(X)->[X,X] end, [a,b,c]).
    -[a,a,b,b,c,c]
    +appending the resulting lists.

    That is, flatmap behaves as if it had been defined as follows:

    flatmap(Fun, List1) ->
    +    append(map(Fun, List1)).

    Example:

    > lists:flatmap(fun(X)->[X,X] end, [a,b,c]).
    +[a,a,b,b,c,c]
    @@ -1572,9 +1572,9 @@

    Calls Fun(Elem, AccIn) on successive elements A of List, starting with AccIn == Acc0. Fun/2 must return a new accumulator, which is passed to the next call. The function returns the final value of the accumulator. Acc0 is -returned if the list is empty.

    Example:

    > lists:foldl(fun(X, Sum) -> X + Sum end, 0, [1,2,3,4,5]).
    +returned if the list is empty.

    Example:

    > lists:foldl(fun(X, Sum) -> X + Sum end, 0, [1,2,3,4,5]).
     15
    -> lists:foldl(fun(X, Prod) -> X * Prod end, 1, [1,2,3,4,5]).
    +> lists:foldl(fun(X, Prod) -> X * Prod end, 1, [1,2,3,4,5]).
     120
    @@ -1611,11 +1611,11 @@ -

    Like foldl/3, but the list is traversed from right to left.

    Example:

    > P = fun(A, AccIn) -> io:format("~p ", [A]), AccIn end.
    +

    Like foldl/3, but the list is traversed from right to left.

    Example:

    > P = fun(A, AccIn) -> io:format("~p ", [A]), AccIn end.
     #Fun<erl_eval.12.2225172>
    -> lists:foldl(P, void, [1,2,3]).
    +> lists:foldl(P, void, [1,2,3]).
     1 2 3 void
    -> lists:foldr(P, void, [1,2,3]).
    +> lists:foldr(P, void, [1,2,3]).
     3 2 1 void

    foldl/3 is tail recursive and is usually preferred to foldr/3.

    @@ -1678,12 +1678,12 @@

    Inserts Sep between each element in List1. Has no effect on the empty list -and on a singleton list. For example:

    > lists:join(x, [a,b,c]).
    -[a,x,b,x,c]
    -> lists:join(x, [a]).
    -[a]
    -> lists:join(x, []).
    -[]
    +and on a singleton list. For example:

    > lists:join(x, [a,b,c]).
    +[a,x,b,x,c]
    +> lists:join(x, [a]).
    +[a]
    +> lists:join(x, []).
    +[]
    @@ -1784,10 +1784,10 @@

    Returns a list of tuples where, for each tuple in TupleList1, the Nth element Term1 of the tuple has been replaced with the result of calling -Fun(Term1).

    Examples:

    > Fun = fun(Atom) -> atom_to_list(Atom) end.
    +Fun(Term1).

    Examples:

    > Fun = fun(Atom) -> atom_to_list(Atom) end.
     #Fun<erl_eval.6.10732646>
    -2> lists:keymap(Fun, 2, [{name,jane,22},{name,lizzie,20},{name,lydia,15}]).
    -[{name,"jane",22},{name,"lizzie",20},{name,"lydia",15}]
    +2>
    lists:keymap(Fun, 2, [{name,jane,22},{name,lizzie,20},{name,lydia,15}]). +[{name,"jane",22},{name,"lizzie",20},{name,"lydia",15}]
    @@ -2128,9 +2128,9 @@ -

    Combines the operations of map/2 and foldl/3 into one pass.

    Example:

    Summing the elements in a list and double them at the same time:

    > lists:mapfoldl(fun(X, Sum) -> {2*X, X+Sum} end,
    -0, [1,2,3,4,5]).
    -{[2,4,6,8,10],15}
    +

    Combines the operations of map/2 and foldl/3 into one pass.

    Example:

    Summing the elements in a list and double them at the same time:

    > lists:mapfoldl(fun(X, Sum) -> {2*X, X+Sum} end,
    +0, [1,2,3,4,5]).
    +{[2,4,6,8,10],15}
    @@ -2422,7 +2422,7 @@ -

    Returns the Nth element of List.

    Example:

    > lists:nth(3, [a, b, c, d, e]).
    +

    Returns the Nth element of List.

    Example:

    > lists:nth(3, [a, b, c, d, e]).
     c
    @@ -2452,14 +2452,14 @@

    Returns the Nth tail of List, that is, the sublist of List starting at -N+1 and continuing up to the end of the list.

    Example

    > lists:nthtail(3, [a, b, c, d, e]).
    -[d,e]
    -> tl(tl(tl([a, b, c, d, e]))).
    -[d,e]
    -> lists:nthtail(0, [a, b, c, d, e]).
    -[a,b,c,d,e]
    -> lists:nthtail(5, [a, b, c, d, e]).
    -[]
    +N+1 and continuing up to the end of the list.

    Example

    > lists:nthtail(3, [a, b, c, d, e]).
    +[d,e]
    +> tl(tl(tl([a, b, c, d, e]))).
    +[d,e]
    +> lists:nthtail(0, [a, b, c, d, e]).
    +[a,b,c,d,e]
    +> lists:nthtail(5, [a, b, c, d, e]).
    +[]
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/maps.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/maps.xhtml 2025-05-10 20:19:24.265327862 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/maps.xhtml 2025-05-10 20:19:24.305328225 +0000 @@ -624,10 +624,10 @@

    Returns a map Map for which predicate Pred holds true in MapOrIter.

    The call fails with a {badmap,Map} exception if MapOrIter is not a map or -valid iterator, or with badarg if Pred is not a function of arity 2.

    Example:

    > M = #{a => 2, b => 3, c=> 4, "a" => 1, "b" => 2, "c" => 4},
    -  Pred = fun(K,V) -> is_atom(K) andalso (V rem 2) =:= 0 end,
    -  maps:filter(Pred,M).
    -#{a => 2,c => 4}
    +valid iterator, or with badarg if Pred is not a function of arity 2.

    Example:

    > M = #{a => 2, b => 3, c=> 4, "a" => 1, "b" => 2, "c" => 4},
    +  Pred = fun(K,V) -> is_atom(K) andalso (V rem 2) =:= 0 end,
    +  maps:filter(Pred,M).
    +#{a => 2,c => 4}
    @@ -666,10 +666,10 @@ map. If it returns false, the association is not copied. If it returns {true, NewValue}, the value for Key is replaced with NewValue in the result map.

    The call fails with a {badmap,Map} exception if MapOrIter is not a map or -valid iterator, or with badarg if Fun is not a function of arity 2.

    Example:

    > Fun = fun(K,V) when is_atom(K) -> {true, V*2}; (_,V) -> (V rem 2) =:= 0 end,
    -  Map = #{k1 => 1, "k2" => 2, "k3" => 3},
    -  maps:filtermap(Fun,Map).
    -#{k1 => 2,"k2" => 2}
    +valid iterator, or with badarg if Fun is not a function of arity 2.

    Example:

    > Fun = fun(K,V) when is_atom(K) -> {true, V*2}; (_,V) -> (V rem 2) =:= 0 end,
    +  Map = #{k1 => 1, "k2" => 2, "k3" => 3},
    +  maps:filtermap(Fun,Map).
    +#{k1 => 2,"k2" => 2}
    @@ -700,10 +700,10 @@

    Returns a tuple {ok, Value}, where Value is the value associated with Key, -or error if no value is associated with Key in Map.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Example:

    > Map = #{"hi" => 42},
    +or error if no value is associated with Key in Map.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Example:

    > Map = #{"hi" => 42},
       Key = "hi",
    -  maps:find(Key,Map).
    -{ok,42}
    +
    maps:find(Key,Map). +{ok,42}
    @@ -744,9 +744,9 @@ which is passed to the next successive call. This function returns the final value of the accumulator. The initial accumulator value Init is returned if the map is empty.

    The call fails with a {badmap,Map} exception if MapOrIter is not a map or -valid iterator, or with badarg if Fun is not a function of arity 3.

    Example:

    > Fun = fun(K,V,AccIn) when is_list(K) -> AccIn + V end,
    -  Map = #{"k1" => 1, "k2" => 2, "k3" => 3},
    -  maps:fold(Fun,0,Map).
    +valid iterator, or with badarg if Fun is not a function of arity 3.

    Example:

    > Fun = fun(K,V,AccIn) when is_list(K) -> AccIn + V end,
    +  Map = #{"k1" => 1, "k2" => 2, "k3" => 3},
    +  maps:fold(Fun,0,Map).
     6
    @@ -813,8 +813,8 @@

    Takes a list of keys and a value and builds a map where all keys point to the -same value. The key can be in any order, and keys and value can be of any term.

    Example:

    > Keys = ["a", "b", "c"], maps:from_keys(Keys, ok).
    -#{"a" => ok,"b" => ok,"c" => ok}
    +same value. The key can be in any order, and keys and value can be of any term.

    Example:

    > Keys = ["a", "b", "c"], maps:from_keys(Keys, ok).
    +#{"a" => ok,"b" => ok,"c" => ok}
    @@ -846,9 +846,9 @@

    Takes a list of key-value tuples elements and builds a map. The associations can be in any order, and both keys and values in the association can be of any term.

    If the same key appears more than once, the latter (right-most) value is used -and the previous values are ignored.

    Example:

    > List = [{"a",ignored},{1337,"value two"},{42,value_three},{"a",1}],
    -  maps:from_list(List).
    -#{42 => value_three,1337 => "value two","a" => 1}
    +and the previous values are ignored.

    Example:

    > List = [{"a",ignored},{1337,"value two"},{42,value_three},{"a",1}],
    +  maps:from_list(List).
    +#{42 => value_three,1337 => "value two","a" => 1}
    @@ -880,8 +880,8 @@

    Returns value Value associated with Key if Map contains Key.

    The call fails with a {badmap,Map} exception if Map is not a map, or with a {badkey,Key} exception if no value is associated with Key.

    Example:

    > Key = 1337,
    -  Map = #{42 => value_two,1337 => "value one","a" => 1},
    -  maps:get(Key,Map).
    +  Map = #{42 => value_two,1337 => "value one","a" => 1},
    +  maps:get(Key,Map).
     "value one"
    @@ -913,11 +913,11 @@

    Returns value Value associated with Key if Map contains Key. If no value -is associated with Key, Default is returned.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Example:

    > Map = #{ key1 => val1, key2 => val2 }.
    -#{key1 => val1,key2 => val2}
    -> maps:get(key1, Map, "Default value").
    +is associated with Key, Default is returned.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Example:

    > Map = #{ key1 => val1, key2 => val2 }.
    +#{key1 => val1,key2 => val2}
    +> maps:get(key1, Map, "Default value").
     val1
    -> maps:get(key3, Map, "Default value").
    +> maps:get(key3, Map, "Default value").
     "Default value"
    @@ -957,11 +957,11 @@

    Partitions the given List into a map of groups.

    The result is a map where each key is given by KeyFun and each value is a list of elements from the given List for which KeyFun returned the same key.

    The order of elements within each group list is preserved from the original -list.

    Examples:

    > EvenOdd = fun(X) -> case X rem 2 of 0 -> even; 1 -> odd end end,
    -maps:groups_from_list(EvenOdd, [1, 2, 3]).
    -#{even => [2], odd => [1, 3]}
    -> maps:groups_from_list(fun erlang:length/1, ["ant", "buffalo", "cat", "dingo"]).
    -#{3 => ["ant", "cat"], 5 => ["dingo"], 7 => ["buffalo"]}
    +list.

    Examples:

    > EvenOdd = fun(X) -> case X rem 2 of 0 -> even; 1 -> odd end end,
    +maps:groups_from_list(EvenOdd, [1, 2, 3]).
    +#{even => [2], odd => [1, 3]}
    +> maps:groups_from_list(fun erlang:length/1, ["ant", "buffalo", "cat", "dingo"]).
    +#{3 => ["ant", "cat"], 5 => ["dingo"], 7 => ["buffalo"]}
    @@ -1003,15 +1003,15 @@

    Partitions the given List into a map of groups.

    The result is a map where each key is given by KeyFun and each value is a list of elements from the given List, mapped via ValueFun, for which KeyFun returned the same key.

    The order of elements within each group list is preserved from the original -list.

    Examples:

    > EvenOdd = fun(X) -> case X rem 2 of 0 -> even; 1 -> odd end end,
    -> Square = fun(X) -> X * X end,
    -> maps:groups_from_list(EvenOdd, Square, [1, 2, 3]).
    -#{even => [4], odd => [1, 9]}
    -> maps:groups_from_list(
    +list.

    Examples:

    > EvenOdd = fun(X) -> case X rem 2 of 0 -> even; 1 -> odd end end,
    +> Square = fun(X) -> X * X end,
    +> maps:groups_from_list(EvenOdd, Square, [1, 2, 3]).
    +#{even => [4], odd => [1, 9]}
    +> maps:groups_from_list(
         fun erlang:length/1,
         fun lists:reverse/1,
    -    ["ant", "buffalo", "cat", "dingo"]).
    -#{3 => ["tna", "tac"],5 => ["ognid"],7 => ["olaffub"]}
    +
    ["ant", "buffalo", "cat", "dingo"]). +#{3 => ["tna", "tac"],5 => ["ognid"],7 => ["olaffub"]}
    @@ -1043,10 +1043,10 @@

    Intersects two maps into a single map Map3. If a key exists in both maps, the -value in Map1 is superseded by the value in Map2.

    The call fails with a {badmap,Map} exception if Map1 or Map2 is not a map.

    Example:

    > Map1 = #{a => "value_one", b => "value_two"},
    -  Map2 = #{a => 1, c => 2},
    -  maps:intersect(Map1,Map2).
    -#{a => 1}
    +value in Map1 is superseded by the value in Map2.

    The call fails with a {badmap,Map} exception if Map1 or Map2 is not a map.

    Example:

    > Map1 = #{a => "value_one", b => "value_two"},
    +  Map2 = #{a => 1, c => 2},
    +  maps:intersect(Map1,Map2).
    +#{a => 1}
    @@ -1086,10 +1086,10 @@ the value from Map1 is the second parameter, and the value from Map2 is the third parameter.

    The call fails with a {badmap,Map} exception if Map1 or Map2 is not a map. The call fails with a badarg exception if Combiner is not a fun that takes -three arguments.

    Example:

    > Map1 = #{a => "value_one", b => "value_two"},
    -  Map2 = #{a => 1, c => 2},
    -  maps:intersect_with(fun(_Key, Value1, Value2) -> {Value1, Value2} end, Map1, Map2).
    -#{a => {"value_one",1}}
    +three arguments.

    Example:

    > Map1 = #{a => "value_one", b => "value_two"},
    +  Map2 = #{a => 1, c => 2},
    +  maps:intersect_with(fun(_Key, Value1, Value2) -> {Value1, Value2} end, Map1, Map2).
    +#{a => {"value_one",1}}
    @@ -1120,11 +1120,11 @@

    Returns true if map Map contains Key and returns false if it does not -contain the Key.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Example:

    > Map = #{"42" => value}.
    -#{"42" => value}
    -> maps:is_key("42",Map).
    +contain the Key.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Example:

    > Map = #{"42" => value}.
    +#{"42" => value}
    +> maps:is_key("42",Map).
     true
    -> maps:is_key(value,Map).
    +> maps:is_key(value,Map).
     false
    @@ -1157,15 +1157,15 @@

    Returns a map iterator Iterator that can be used by maps:next/1 to traverse the key-value associations in a map. When iterating over a map, the /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/ms_transform.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/ms_transform.xhtml 2025-05-10 20:19:24.261327826 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/ms_transform.xhtml 2025-05-10 20:19:24.305328225 +0000 @@ -49,31 +49,31 @@ table and construct a list of tuples containing relevant parts of the data in these rows. One can use ets:foldl/3 instead, but the ets:select/2 call is far more efficient. Without the translation provided by ms_transform, one must -struggle with writing match specifications terms to accommodate this.

    Consider a simple table of employees:

    -record(emp, {empno,     %Employee number as a string, the key
    +struggle with writing match specifications terms to accommodate this.

    Consider a simple table of employees:

    -record(emp, {empno,     %Employee number as a string, the key
                   surname,   %Surname of the employee
                   givenname, %Given name of employee
                   dept,      %Department, one of {dev,sales,prod,adm}
    -              empyear}). %Year the employee was employed

    We create the table using:

    ets:new(emp_tab, [{keypos,#emp.empno},named_table,ordered_set]).

    We fill the table with randomly chosen data:

    [{emp,"011103","Black","Alfred",sales,2000},
    - {emp,"041231","Doe","John",prod,2001},
    - {emp,"052341","Smith","John",dev,1997},
    - {emp,"076324","Smith","Ella",sales,1995},
    - {emp,"122334","Weston","Anna",prod,2002},
    - {emp,"535216","Chalker","Samuel",adm,1998},
    - {emp,"789789","Harrysson","Joe",adm,1996},
    - {emp,"963721","Scott","Juliana",dev,2003},
    - {emp,"989891","Brown","Gabriel",prod,1999}]

    Assuming that we want the employee numbers of everyone in the sales department, -there are several ways.

    ets:match/2 can be used:

    1> ets:match(emp_tab, {'_', '$1', '_', '_', sales, '_'}).
    -[["011103"],["076324"]]

    ets:match/2 uses a simpler type of match specification, but it is still + empyear}). %Year the employee was employed

    We create the table using:

    ets:new(emp_tab, [{keypos,#emp.empno},named_table,ordered_set]).

    We fill the table with randomly chosen data:

    [{emp,"011103","Black","Alfred",sales,2000},
    + {emp,"041231","Doe","John",prod,2001},
    + {emp,"052341","Smith","John",dev,1997},
    + {emp,"076324","Smith","Ella",sales,1995},
    + {emp,"122334","Weston","Anna",prod,2002},
    + {emp,"535216","Chalker","Samuel",adm,1998},
    + {emp,"789789","Harrysson","Joe",adm,1996},
    + {emp,"963721","Scott","Juliana",dev,2003},
    + {emp,"989891","Brown","Gabriel",prod,1999}]

    Assuming that we want the employee numbers of everyone in the sales department, +there are several ways.

    ets:match/2 can be used:

    1> ets:match(emp_tab, {'_', '$1', '_', '_', sales, '_'}).
    +[["011103"],["076324"]]

    ets:match/2 uses a simpler type of match specification, but it is still unreadable, and one has little control over the returned result. It is always a -list of lists.

    ets:foldl/3 or ets:foldr/3 can be used to avoid the nested lists:

    ets:foldr(fun(#emp{empno = E, dept = sales},Acc) -> [E | Acc];
    -             (_,Acc) -> Acc
    +list of lists.

    ets:foldl/3 or ets:foldr/3 can be used to avoid the nested lists:

    ets:foldr(fun(#emp{empno = E, dept = sales},Acc) -> [E | Acc];
    +             (_,Acc) -> Acc
               end,
    -          [],
    -          emp_tab).

    The result is ["011103","076324"]. The fun is straightforward, so the only + [], + emp_tab).

    The result is ["011103","076324"]. The fun is straightforward, so the only problem is that all the data from the table must be transferred from the table to the calling process for filtering. That is inefficient compared to the ets:match/2 call where the filtering can be done "inside" the emulator and -only the result is transferred to the process.

    Consider a "pure" ets:select/2 call that does what ets:foldr does:

    ets:select(emp_tab, [{#emp{empno = '$1', dept = sales, _='_'},[],['$1']}]).

    Although the record syntax is used, it is still hard to read and even harder to +only the result is transferred to the process.

    Consider a "pure" ets:select/2 call that does what ets:foldr does:

    ets:select(emp_tab, [{#emp{empno = '$1', dept = sales, _='_'},[],['$1']}]).

    Although the record syntax is used, it is still hard to read and even harder to write. The first element of the tuple, #emp{empno = '$1', dept = sales, _='_'}, tells what to match. Elements not matching this are not returned, as in the ets:match/2 example. The second @@ -84,12 +84,12 @@ hence the employee number is returned. The result is ["011103","076324"], as in the ets:foldr/3 example, but the result is retrieved much more efficiently in terms of execution speed and memory consumption.

    Using ets:fun2ms/1, we can combine the ease of use of the ets:foldr/3 and -the efficiency of the pure ets:select/2 example:

    -include_lib("stdlib/include/ms_transform.hrl").
    +the efficiency of the pure ets:select/2 example:

    -include_lib("stdlib/include/ms_transform.hrl").
     
    -ets:select(emp_tab, ets:fun2ms(
    -                      fun(#emp{empno = E, dept = sales}) ->
    +ets:select(emp_tab, ets:fun2ms(
    +                      fun(#emp{empno = E, dept = sales}) ->
                                   E
    -                      end)).

    This example requires no special knowledge of match specifications to + end)).

    This example requires no special knowledge of match specifications to understand. The head of the fun matches what you want to filter out and the body returns what you want returned. As long as the fun can be kept within the limits of the match specifications, there is no need to transfer all table data to the @@ -111,22 +111,22 @@

    Assume that we want to get all the employee numbers of employees hired before year 2000. Using ets:match/2 is not an alternative here, as relational operators cannot be expressed there. Once again, ets:foldr/3 can do it -(slowly, but correct):

    ets:foldr(fun(#emp{empno = E, empyear = Y},Acc) when Y < 2000 -> [E | Acc];
    -                  (_,Acc) -> Acc
    +(slowly, but correct):

    ets:foldr(fun(#emp{empno = E, empyear = Y},Acc) when Y < 2000 -> [E | Acc];
    +                  (_,Acc) -> Acc
               end,
    -          [],
    -          emp_tab).

    The result is ["052341","076324","535216","789789","989891"], as expected. The + [], + emp_tab).

    The result is ["052341","076324","535216","789789","989891"], as expected. The equivalent expression using a handwritten match specification would look like -this:

    ets:select(emp_tab, [{#emp{empno = '$1', empyear = '$2', _='_'},
    -                     [{'<', '$2', 2000}],
    -                     ['$1']}]).

    This gives the same result. [{'<', '$2', 2000}] is in the guard part and +this:

    ets:select(emp_tab, [{#emp{empno = '$1', empyear = '$2', _='_'},
    +                     [{'<', '$2', 2000}],
    +                     ['$1']}]).

    This gives the same result. [{'<', '$2', 2000}] is in the guard part and therefore discards anything that does not have an empyear (bound to '$2' in -the head) less than 2000, as the guard in the foldr/3 example.

    We write it using ets:fun2ms/1:

    -include_lib("stdlib/include/ms_transform.hrl").
    +the head) less than 2000, as the guard in the foldr/3 example.

    We write it using ets:fun2ms/1:

    -include_lib("stdlib/include/ms_transform.hrl").
     
    -ets:select(emp_tab, ets:fun2ms(
    -                      fun(#emp{empno = E, empyear = Y}) when Y < 2000 ->
    +ets:select(emp_tab, ets:fun2ms(
    +                      fun(#emp{empno = E, empyear = Y}) when Y < 2000 ->
                                E
    -                      end)).

    + end)).

    @@ -134,11 +134,11 @@

    Assume that we want the whole object matching instead of only one element. One alternative is to assign a variable to every part of the record and build it up -once again in the body of the fun, but the following is easier:

    ets:select(emp_tab, ets:fun2ms(
    -                      fun(Obj = #emp{empno = E, empyear = Y})
    +once again in the body of the fun, but the following is easier:

    ets:select(emp_tab, ets:fun2ms(
    +                      fun(Obj = #emp{empno = E, empyear = Y})
                              when Y < 2000 ->
                                   Obj
    -                      end)).

    As in ordinary Erlang matching, you can bind a variable to the whole matched + end)).

    As in ordinary Erlang matching, you can bind a variable to the whole matched object using a "match inside the match", that is, a =. Unfortunately in funs translated to match specifications, it is allowed only at the "top-level", that is, matching the whole object arriving to be matched into a separate variable. @@ -153,10 +153,10 @@

    This example concerns the body of the fun. Assume that all employee numbers beginning with zero (0) must be changed to begin with one (1) instead, and -that we want to create the list [{<Old empno>,<New empno>}]:

    ets:select(emp_tab, ets:fun2ms(
    -                      fun(#emp{empno = [$0 | Rest] }) ->
    -                              {[$0|Rest],[$1|Rest]}
    -                      end)).

    This query hits the feature of partially bound keys in table type ordered_set, +that we want to create the list [{<Old empno>,<New empno>}]:

    ets:select(emp_tab, ets:fun2ms(
    +                      fun(#emp{empno = [$0 | Rest] }) ->
    +                              {[$0|Rest],[$1|Rest]}
    +                      end)).

    This query hits the feature of partially bound keys in table type ordered_set, so that not the whole table needs to be searched, only the part containing keys beginning with 0 is looked into.

    @@ -169,24 +169,24 @@ {rookie, <employee number>}.
  • For all other employees, return {newbie, <employee number>}, except for those named Smith as they would be affronted by anything other than the tag guru and that is also what is returned for their numbers: -{guru, <employee number>}.
  • This is accomplished as follows:

    ets:select(emp_tab, ets:fun2ms(
    -                      fun(#emp{empno = E, surname = "Smith" }) ->
    -                              {guru,E};
    -                         (#emp{empno = E, empyear = Y}) when Y < 1997  ->
    -                              {inventory, E};
    -                         (#emp{empno = E, empyear = Y}) when Y > 2001  ->
    -                              {newbie, E};
    -                         (#emp{empno = E, empyear = Y}) -> % 1997 -- 2001
    -                              {rookie, E}
    -                      end)).

    The result is as follows:

    [{rookie,"011103"},
    - {rookie,"041231"},
    - {guru,"052341"},
    - {guru,"076324"},
    - {newbie,"122334"},
    - {rookie,"535216"},
    - {inventory,"789789"},
    - {newbie,"963721"},
    - {rookie,"989891"}]

    +{guru, <employee number>}.

    This is accomplished as follows:

    ets:select(emp_tab, ets:fun2ms(
    +                      fun(#emp{empno = E, surname = "Smith" }) ->
    +                              {guru,E};
    +                         (#emp{empno = E, empyear = Y}) when Y < 1997  ->
    +                              {inventory, E};
    +                         (#emp{empno = E, empyear = Y}) when Y > 2001  ->
    +                              {newbie, E};
    +                         (#emp{empno = E, empyear = Y}) -> % 1997 -- 2001
    +                              {rookie, E}
    +                      end)).

    The result is as follows:

    [{rookie,"011103"},
    + {rookie,"041231"},
    + {guru,"052341"},
    + {guru,"076324"},
    + {newbie,"122334"},
    + {rookie,"535216"},
    + {inventory,"789789"},
    + {newbie,"963721"},
    + {rookie,"989891"}]

    @@ -233,18 +233,18 @@ more, as filtering using Erlang code is not a good idea when tracing (except afterwards, if you trace to file). The concept is similar to that of ets:fun2ms/1 except that you usually use it directly from the shell (which can -also be done with ets:fun2ms/1).

    The following is an example module to trace on:

    -module(toy).
    +also be done with ets:fun2ms/1).

    The following is an example module to trace on:

    -module(toy).
     
    --export([start/1, store/2, retrieve/1]).
    +-export([start/1, store/2, retrieve/1]).
     
    -start(Args) ->
    -    toy_table = ets:new(toy_table, Args).
    +start(Args) ->
    +    toy_table = ets:new(toy_table, Args).
     
    -store(Key, Value) ->
    -    ets:insert(toy_table, {Key,Value}).
    +store(Key, Value) ->
    +    ets:insert(toy_table, {Key,Value}).
     
    -retrieve(Key) ->
    -    [{Key, Value}] = ets:lookup(toy_table, Key),
    +retrieve(Key) ->
    +    [{Key, Value}] = ets:lookup(toy_table, Key),
         Value.

    During model testing, the first test results in {badmatch,16} in /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/notes.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/notes.xhtml 2025-05-10 20:19:24.261327826 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/notes.xhtml 2025-05-10 20:19:24.305328225 +0000 @@ -58,25 +58,25 @@

    • Made it possible to expand help text displayed by pressing ^[h by pressing ^[h again.

      Own Id: OTP-19260 Aux Id: PR-8884

    • Defining a fun in the shell using the syntax fun Name/Arity would fail. This has been corrected so that the following now works:

      1> F = fun is_atom/1.
       #Fun.erl.42.18682967>
      -> F(a).
      +> F(a).
       true
       3> Id = fun id/1.
       #Fun.erl.42.18682967>
      -4> Id(42).
      +4> Id(42).
       ** exception error: undefined shell command id/1
      -5> id(I) -> I.
      +5> id(I) -> I.
       ok
      -6> Id(42).
      +6> Id(42).
       42

      The Debugger has also been corrected to correctly handle this syntax for a BIF.

      Own Id: OTP-19322 Aux Id: GH-8963, PR-8987

    • Fixed a bug where completion of 'fun(' would cause the shell to crash.

      Own Id: OTP-19351 Aux Id: PR-9043

    • Fixed a bug causing the shell to crash while trying to complete an expression starting with a '/' or a variable followed by '(' or '/'. E.g. Foo/ and Foo(.

      Own Id: OTP-19361 Aux Id: PR-9078

    • zip:extract/2 with keep_old_files now respects the cwd option.

      Own Id: OTP-19370 Aux Id: PR-9097, GH-9087

    • Fixed an error in uri_string:percent_decode spec

      Own Id: OTP-19380 Aux Id: GH-8755

    Improvements and New Features

    -
    • Updated shell docs to display the type spec, that is, h(erlang, min, 2)) now prints the type spec and documentation in the shell.

      > h(erlang,min,2).
      +
      • Updated shell docs to display the type spec, that is, h(erlang, min, 2)) now prints the type spec and documentation in the shell.

        > h(erlang,min,2).
         
        -  -spec min(Term1, Term2) -> Minimum
        -               when Term1 :: term(), Term2 :: term(), Minimum :: term().
        +  -spec min(Term1, Term2) -> Minimum
        +               when Term1 :: term(), Term2 :: term(), Minimum :: term().
         
           Returns the smallest of Term1 and Term2. If the terms compare equal with the == operator, Term1 is returned.

        Own Id: OTP-19234 Aux Id: GH-8544, PR-8833

      • The file:io_device/0 type has been updated to clearly show the difference between a raw and cooked IoDevice.

        Own Id: OTP-19301 Aux Id: PR-8956

      • Added json:format_key_value_list/3 and json:format_key_value_list_checked/3.

        Own Id: OTP-19320 Aux Id: PR-8889

      • Improved documentation of timers.

        Own Id: OTP-19360 Aux Id: ERIERL-1149, PR-9062

      • Added logging support to io:user/0, io:standard_io/0 and io:standard_error/0. See io:setopts/2 for more details.

        Own Id: OTP-19372 Aux Id: PR-8947

      @@ -156,8 +156,8 @@ Improvements and New Features

      • The functions is_equal/2, map/2, and filtermap/2 have been added to the modules sets, ordsets, and gb_sets.

        Own Id: OTP-18622 Aux Id: PR-7183, PR-7232

      • The compiler now emits nicer error message for function head mismatches. -For example, given:

        a() -> ok;
        -a(_) -> error.

        Erlang/OTP 26 and earlier would emit a diagnostic similar to:

        t.erl:6:1: head mismatch
        +For example, given:

        a() -> ok;
        +a(_) -> error.

        Erlang/OTP 26 and earlier would emit a diagnostic similar to:

        t.erl:6:1: head mismatch
         %    6| a(_) -> error.
         %     | ^

        while in Erlang/OTP 27 the diagnostic is similar to:

        t.erl:6:1: head mismatch: function a with arities 0 and 1 is regarded as two distinct functions. Is the number of arguments incorrect or is the semicolon in a/0 unwanted?
         %    6| a(_) -> error.
        @@ -190,12 +190,12 @@
         shell:prompt_width/1 have been exported to help with custom prompt implementations.

        Own Id: OTP-18834 Aux Id: PR-7675, PR-7816

      • The shell now pages long output from the documentation help command (h(Module)), auto completions and the search command.

        Own Id: OTP-18846 Aux Id: PR-7845

      • The M-h hotkey (Alt/Option-h) now outputs help for the module or function directly before the cursor.

        Own Id: OTP-18847 Aux Id: PR-7846

      • Added support for adding a custom code formatter that formats your multi-line shell commands in your preferred formatting on submission. See shell:format_shell_func/ and shell:erl_pp_format_func/1.

        Own Id: OTP-18848 Aux Id: PR-7847

      • Added shell functions for viewing, forgetting and saving locally defined functions, types and records.

        Own Id: OTP-18852 Aux Id: PR-7844

      • Added string:jaro_similarity/2, which can be used to calculate the similarity between two strings.

        Own Id: OTP-18865 Aux Id: PR-7879

      • The new function ets:update_element/4 is similar to ets:update_element/3, but takes a default tuple as the fourth argument, which will be inserted if no previous record with that key exists.

        Own Id: OTP-18870 Aux Id: PR-7857

      • Added functions to retrieve the next higher or lower key/element from gb_trees and gb_sets, as well as returning iterators that start at given keys/elements.

        Own Id: OTP-18874 Aux Id: PR-7745

      • When the shell built-in function c/1,2 is used to re-compile a module, the current working directory of the original compilation is now added to the include path.

        Own Id: OTP-18908 Aux Id: PR-7957

      • The timer module now uses a private table for its internal state, slightly improving its performance.

        Own Id: OTP-18914 Aux Id: PR-7973

      • EEP-59 - Documentation Attributes has been implemented.

        Documentation attributes can be used to document functions, types, callbacks, and modules. The keyword -moduledoc "Documentation here". is used to document modules, while -doc "Documentation here". can be used on top of functions, types, and callbacks to document them, respectively.

        • Types, callbacks, and function documentation can be set to hidden either via -doc false or -doc hidden. When documentation attributes mark a type as hidden, they will not be part of the documentation.

        • The documentation from moduledoc and doc gets added by default to the binary beam file, following the format of EEP-48.

        • Using the compiler flag warn_missing_doc will raise a warning when -doc attributes are missing in exported functions, types, and callbacks.

        • Using the compiler flag warn_missing_spec_documented will raise a warning when -spec attributes are missing in documented functions, types, and callbacks.

        • moduledocs and docs may refer to external files to be embedded, such as -doc {file, "README.md"}., which refers to the file README.md found in the current working directory.

        • The compiler warns about exported functions whose specs refer to hidden types. Thus, there will be warnings when a hidden type (meaning, the type is not part of the documentation) gets used in an exported function.

        Own Id: OTP-18916 Aux Id: PR-7936

      • New ets functions ets:first_lookup/1, ets:next_lookup/2, ets:prev_lookup/2 and ets:last_lookup/1. Example: ets:next_lookup/1 is equivalent to ets:next/2 followed by ets:lookup/2 with the next key. The new combined functions are more efficient and with guaranteed atomicity.

        Own Id: OTP-18923 Aux Id: PR-6791

      • The maybe expression is now enabled by default.

        To use maybe as an atom, it needs to be single-quoted. Alternatively, the maybe expression can be disabled by disabling the maybe_expr feature. That can be done by placing the following the line at the beginning of an Erlang source file:

        -feature(maybe_expr, disable).

        Another way to disable the maybe_expr feature is by passing the -disable-feature option to erlc:

        erlc -disable-feature maybe_expr some_file.erl

        Own Id: OTP-18944 Aux Id: PR-8067

      • The compiler will now raise a warning when updating record/map literals. As an example, consider this module:

        -module(t).
        --export([f/0]).
        --record(r, {a,b,c}).
        +spec attributes are missing in documented functions, types, and callbacks.

      • moduledocs and docs may refer to external files to be embedded, such as -doc {file, "README.md"}., which refers to the file README.md found in the current working directory.

      • The compiler warns about exported functions whose specs refer to hidden types. Thus, there will be warnings when a hidden type (meaning, the type is not part of the documentation) gets used in an exported function.

      Own Id: OTP-18916 Aux Id: PR-7936

    • New ets functions ets:first_lookup/1, ets:next_lookup/2, ets:prev_lookup/2 and ets:last_lookup/1. Example: ets:next_lookup/1 is equivalent to ets:next/2 followed by ets:lookup/2 with the next key. The new combined functions are more efficient and with guaranteed atomicity.

      Own Id: OTP-18923 Aux Id: PR-6791

    • The maybe expression is now enabled by default.

      To use maybe as an atom, it needs to be single-quoted. Alternatively, the maybe expression can be disabled by disabling the maybe_expr feature. That can be done by placing the following the line at the beginning of an Erlang source file:

      -feature(maybe_expr, disable).

      Another way to disable the maybe_expr feature is by passing the -disable-feature option to erlc:

      erlc -disable-feature maybe_expr some_file.erl

      Own Id: OTP-18944 Aux Id: PR-8067

    • The compiler will now raise a warning when updating record/map literals. As an example, consider this module:

      -module(t).
      +-export([f/0]).
      +-record(r, {a,b,c}).
       
      -f() ->
      -    #r{a=1}#r{b=2}.

      The compiler raises the following warning:

      1> c(t).
      +f() ->
      +    #r{a=1}#r{b=2}.

      The compiler raises the following warning:

      1> c(t).
       t.erl:6:12: Warning: expression updates a literal
       %    6|     #r{a=1}#r{b=2}.
       %     |            ^

      Own Id: OTP-18951 Aux Id: PR-8069

    • The documentation has been migrated to use Markdown and ExDoc.

      Own Id: OTP-18955 Aux Id: PR-8026

    • Optimized ets:foldl and ets:foldr to use new ets:next_lookup. Also made them immune against table renaming.

      Own Id: OTP-18993 Aux Id: PR-8048

    • Windows now supports all functions in math.

      Own Id: OTP-19001 Aux Id: PR-8164

    • erl_lint (and by extension the compiler) will now warn for code using deprecated callbacks.

      The only callback currenly deprecated is format_status/2 in gen_server, gen_event and gen_statem.

      You can use nowarn_deprecated_callback to silence the warning.

      Own Id: OTP-19010 Aux Id: PR-8205

    • There is a new module json for encoding and decoding JSON.

      Both encoding and decoding can be customized. Decoding can be done in a SAX-like fashion and handle multiple documents and streams of data.

      Own Id: OTP-19020 Aux Id: PR-8111

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/orddict.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/orddict.xhtml 2025-05-10 20:19:24.257327790 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/orddict.xhtml 2025-05-10 20:19:24.301328189 +0000 @@ -37,13 +37,13 @@

    Functions append/3 and append_list/3 are included so that keyed values can be stored in a list accumulator, for -example:

    > D0 = orddict:new(),
    -  D1 = orddict:store(files, [], D0),
    -  D2 = orddict:append(files, f1, D1),
    -  D3 = orddict:append(files, f2, D2),
    -  D4 = orddict:append(files, f3, D3),
    -  orddict:fetch(files, D4).
    -[f1,f2,f3]

    This saves the trouble of first fetching a keyed value, appending a new value to +example:

    > D0 = orddict:new(),
    +  D1 = orddict:store(files, [], D0),
    +  D2 = orddict:append(files, f1, D1),
    +  D3 = orddict:append(files, f2, D2),
    +  D4 = orddict:append(files, f3, D3),
    +  orddict:fetch(files, D4).
    +[f1,f2,f3]

    This saves the trouble of first fetching a keyed value, appending a new value to the list of stored values, and storing the result.

    Function fetch/2 is to be used if the key is known to be in the dictionary, otherwise function find/2.

    @@ -416,16 +416,16 @@

    Appends a new Value to the current list of values associated with Key. An exception is generated if the initial value associated with Key is not a list -of values.

    See also section Notes.

    Example 1:

    1> OrdDict1 = orddict:from_list([{x, []}]).
    -[{x,[]}]
    -2> OrdDict2 = orddict:append(x, 1, OrdDict1).
    -[{x,[1]}]
    -3> OrdDict3 = orddict:append(x, 2, OrdDict2).
    -[{x,[1,2]}]
    -4> orddict:append(y, 3, OrdDict3).
    -[{x,[1,2]},{y,[3]}]

    Example 2:

    1> OrdDict1 = orddict:from_list([{a, no_list}]).
    -[{a,no_list}]
    -2> orddict:append(a, 1, OrdDict1).
    +of values.

    See also section Notes.

    Example 1:

    1> OrdDict1 = orddict:from_list([{x, []}]).
    +[{x,[]}]
    +2> OrdDict2 = orddict:append(x, 1, OrdDict1).
    +[{x,[1]}]
    +3> OrdDict3 = orddict:append(x, 2, OrdDict2).
    +[{x,[1,2]}]
    +4> orddict:append(y, 3, OrdDict3).
    +[{x,[1,2]},{y,[3]}]

    Example 2:

    1> OrdDict1 = orddict:from_list([{a, no_list}]).
    +[{a,no_list}]
    +2> orddict:append(a, 1, OrdDict1).
     ** exception error: bad argument
          in operator  ++/2
             called as no_list ++ [1]
    @@ -462,12 +462,12 @@

    Appends a list of values ValList to the current list of values associated with Key. An exception is generated if the initial value associated with Key is -not a list of values.

    See also section Notes.

    Example:

    1> OrdDict1 = orddict:from_list([{x, []}]).
    -[{x,[]}]
    -2> OrdDict2 = orddict:append_list(x, [1,2], OrdDict1).
    -[{x,[1,2]}]
    -3> OrdDict3 = orddict:append_list(y, [3,4], OrdDict2).
    -[{x,[1,2]},{y,[3,4]}]
    +not a list of values.

    See also section Notes.

    Example:

    1> OrdDict1 = orddict:from_list([{x, []}]).
    +[{x,[]}]
    +2> OrdDict2 = orddict:append_list(x, [1,2], OrdDict1).
    +[{x,[1,2]}]
    +3> OrdDict3 = orddict:append_list(y, [3,4], OrdDict2).
    +[{x,[1,2]},{y,[3,4]}]
    @@ -496,10 +496,10 @@ -

    Erases all items with a specified key from a dictionary.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    -[{a,1},{b,2}]
    -2> orddict:erase(a, OrdDict1).
    -[{b,2}]
    +

    Erases all items with a specified key from a dictionary.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    +[{a,1},{b,2}]
    +2> orddict:erase(a, OrdDict1).
    +[{b,2}]
    @@ -529,11 +529,11 @@

    Returns the value associated with Key in dictionary Orddict. This function assumes that the Key is present in the dictionary. An exception is generated -if Key is not in the dictionary.

    See also section Notes.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    -[{a,1},{b,2}]
    -2> orddict:fetch(a, OrdDict1).
    +if Key is not in the dictionary.

    See also section Notes.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    +[{a,1},{b,2}]
    +2> orddict:fetch(a, OrdDict1).
     1
    -3> orddict:fetch(missing, OrdDict1).
    +3> orddict:fetch(missing, OrdDict1).
     ** exception error: no function clause matching orddict:fetch(missing,[])
    @@ -562,10 +562,10 @@ -

    Returns a list of all keys in a dictionary.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    -[{a,1},{b,2}]
    -2> orddict:fetch_keys(OrdDict1).
    -[a,b]
    +

    Returns a list of all keys in a dictionary.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    +[{a,1},{b,2}]
    +2> orddict:fetch_keys(OrdDict1).
    +[a,b]
    @@ -598,10 +598,10 @@

    Orddict2 is a dictionary of all keys and values in Orddict1 for which -Pred(Key, Value) is true.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    -[{a,1},{b,2}]
    -2> orddict:filter(fun (K, V) -> V > 1 end, OrdDict1).
    -[{b,2}]
    +Pred(Key, Value) is true.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    +[{a,1},{b,2}]
    +2> orddict:filter(fun (K, V) -> V > 1 end, OrdDict1).
    +[{b,2}]
    @@ -631,11 +631,11 @@

    Searches for a key in a dictionary. Returns {ok, Value}, where Value is the value associated with Key, or error if the key is not present in the -dictionary.

    See also section Notes.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    -[{a,1},{b,2}]
    -2> orddict:find(a, OrdDict1).
    -{ok,1}
    -3> orddict:find(c, OrdDict1).
    +dictionary.

    See also section Notes.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    +[{a,1},{b,2}]
    +2> orddict:find(a, OrdDict1).
    +{ok,1}
    +3> orddict:find(c, OrdDict1).
     error
    @@ -673,10 +673,10 @@

    Calls Fun on successive keys and values of Orddict together with an extra argument Acc (short for accumulator). Fun must return a new accumulator that -is passed to the next call. Acc0 is returned if the list is empty.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    -[{a,1},{b,2}]
    -2> orddict:fold(fun (K, V, Acc) -> [{K, V+100} | Acc] end, [], OrdDict1).
    -[{b,102},{a,101}]
    +is passed to the next call. Acc0 is returned if the list is empty.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    +[{a,1},{b,2}]
    +2> orddict:fold(fun (K, V, Acc) -> [{K, V+100} | Acc] end, [], OrdDict1).
    +[{b,102},{a,101}]
    @@ -795,10 +795,10 @@

    Calls Fun on successive keys and values of Orddict1 to return a new value -for each key.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    -[{a,1},{b,2}]
    -2> orddict:map(fun (_K, V) -> V + 100 end, OrdDict1).
    -[{a,101},{b,102}]
    +for each key.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    +[{a,1},{b,2}]
    +2> orddict:map(fun (_K, V) -> V + 100 end, OrdDict1).
    +[{a,101},{b,102}]
    @@ -834,15 +834,15 @@

    Merges two dictionaries, Orddict1 and Orddict2, to create a new dictionary. All the Key-Value pairs from both dictionaries are included in the new dictionary.

    If a key occurs in both dictionaries, Fun is called with the key -and both values to return a new value.

    merge/3 can be defined as follows, but is faster:

    merge(Fun, D1, D2) ->
    -    fold(fun (K, V1, D) ->
    -                 update(K, fun (V2) -> Fun(K, V1, V2) end, V1, D)
    -         end, D2, D1).

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    -[{a,1},{b,2}]
    -2> OrdDict2 = orddict:from_list([{b, 7}, {c, 8}]).
    -[{b,7},{c,8}]
    -3> orddict:merge(fun (K, V1, V2) -> V1 * V2 end, OrdDict1, OrdDict2).
    -[{a,1},{b,14},{c,8}]
    +and both values to return a new value.

    merge/3 can be defined as follows, but is faster:

    merge(Fun, D1, D2) ->
    +    fold(fun (K, V1, D) ->
    +                 update(K, fun (V2) -> Fun(K, V1, V2) end, V1, D)
    +         end, D2, D1).

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    +[{a,1},{b,2}]
    +2> OrdDict2 = orddict:from_list([{b, 7}, {c, 8}]).
    +[{b,7},{c,8}]
    +3> orddict:merge(fun (K, V1, V2) -> V1 * V2 end, OrdDict1, OrdDict2).
    +[{a,1},{b,14},{c,8}]
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/peer.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/peer.xhtml 2025-05-10 20:19:24.257327790 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/peer.xhtml 2025-05-10 20:19:24.301328189 +0000 @@ -56,127 +56,127 @@ manual analysis. If the test case fails, the CRASH REPORT contains these arguments
  • multiple test cases can run concurrently speeding up overall testing process, peer node names are unique even when there are multiple instances of the same -test suite running in parallel
  • -module(my_SUITE).
    --behaviour(ct_suite).
    --export([all/0, groups/0]).
    --export([basic/1, args/1, named/1, restart_node/1, multi_node/1]).
    +test suite running in parallel
    -module(my_SUITE).
    +-behaviour(ct_suite).
    +-export([all/0, groups/0]).
    +-export([basic/1, args/1, named/1, restart_node/1, multi_node/1]).
     
    --include_lib("common_test/include/ct.hrl").
    +-include_lib("common_test/include/ct.hrl").
     
    -groups() ->
    -    [{quick, [parallel],
    -        [basic, args, named, restart_node, multi_node]}].
    +groups() ->
    +    [{quick, [parallel],
    +        [basic, args, named, restart_node, multi_node]}].
     
    -all() ->
    -    [{group, quick}].
    +all() ->
    +    [{group, quick}].
     
    -basic(Config) when is_list(Config) ->
    -    {ok, Peer, _Node} = ?CT_PEER(),
    -    peer:stop(Peer).
    +basic(Config) when is_list(Config) ->
    +    {ok, Peer, _Node} = ?CT_PEER(),
    +    peer:stop(Peer).
     
    -args(Config) when is_list(Config) ->
    +args(Config) when is_list(Config) ->
         %% specify additional arguments to the new node
    -    {ok, Peer, _Node} = ?CT_PEER(["-emu_flavor", "smp"]),
    -    peer:stop(Peer).
    +    {ok, Peer, _Node} = ?CT_PEER(["-emu_flavor", "smp"]),
    +    peer:stop(Peer).
     
    -named(Config) when is_list(Config) ->
    +named(Config) when is_list(Config) ->
         %% pass test case name down to function starting nodes
    -    Peer = start_node_impl(named_test),
    -    peer:stop(Peer).
    +    Peer = start_node_impl(named_test),
    +    peer:stop(Peer).
     
    -start_node_impl(ActualTestCase) ->
    -    {ok, Peer, Node} = ?CT_PEER(#{name => ?CT_PEER_NAME(ActualTestCase)}),
    +start_node_impl(ActualTestCase) ->
    +    {ok, Peer, Node} = ?CT_PEER(#{name => ?CT_PEER_NAME(ActualTestCase)}),
         %% extra setup needed for multiple test cases
    -    ok = rpc:call(Node, application, set_env, [kernel, key, value]),
    +    ok = rpc:call(Node, application, set_env, [kernel, key, value]),
         Peer.
     
    -restart_node(Config) when is_list(Config) ->
    -    Name = ?CT_PEER_NAME(),
    -    {ok, Peer, Node} = ?CT_PEER(#{name => Name}),
    -    peer:stop(Peer),
    +restart_node(Config) when is_list(Config) ->
    +    Name = ?CT_PEER_NAME(),
    +    {ok, Peer, Node} = ?CT_PEER(#{name => Name}),
    +    peer:stop(Peer),
         %% restart the node with the same name as before
    -    {ok, Peer2, Node} = ?CT_PEER(#{name => Name, args => ["+fnl"]}),
    -    peer:stop(Peer2).

    The next example demonstrates how to start multiple nodes concurrently:

    multi_node(Config) when is_list(Config) ->
    -    Peers = [?CT_PEER(#{wait_boot => {self(), tag}})
    -        || _ <- lists:seq(1, 4)],
    +    {ok, Peer2, Node} = ?CT_PEER(#{name => Name, args => ["+fnl"]}),
    +    peer:stop(Peer2).

    The next example demonstrates how to start multiple nodes concurrently:

    multi_node(Config) when is_list(Config) ->
    +    Peers = [?CT_PEER(#{wait_boot => {self(), tag}})
    +        || _ <- lists:seq(1, 4)],
         %% wait for all nodes to complete boot process, get their names:
    -    _Nodes = [receive {tag, {started, Node, Peer}} -> Node end
    -        || {ok, Peer} <- Peers],
    -    [peer:stop(Peer) || {ok, Peer} <- Peers].

    Start a peer on a different host. Requires ssh key-based authentication set -up, allowing "another_host" connection without password prompt.

    Ssh = os:find_executable("ssh"),
    -peer:start_link(#{exec => {Ssh, ["another_host", "erl"]},
    -    connection => standard_io}),

    The following Common Test case demonstrates Docker integration, starting two + _Nodes = [receive {tag, {started, Node, Peer}} -> Node end + || {ok, Peer} <- Peers], + [peer:stop(Peer) || {ok, Peer} <- Peers].

    Start a peer on a different host. Requires ssh key-based authentication set +up, allowing "another_host" connection without password prompt.

    Ssh = os:find_executable("ssh"),
    +peer:start_link(#{exec => {Ssh, ["another_host", "erl"]},
    +    connection => standard_io}),

    The following Common Test case demonstrates Docker integration, starting two containers with hostnames "one" and "two". In this example Erlang nodes running -inside containers form an Erlang cluster.

    docker(Config) when is_list(Config) ->
    -    Docker = os:find_executable("docker"),
    -    PrivDir = proplists:get_value(priv_dir, Config),
    -    build_release(PrivDir),
    -    build_image(PrivDir),
    +inside containers form an Erlang cluster.

    docker(Config) when is_list(Config) ->
    +    Docker = os:find_executable("docker"),
    +    PrivDir = proplists:get_value(priv_dir, Config),
    +    build_release(PrivDir),
    +    build_image(PrivDir),
     
         %% start two Docker containers
    -    {ok, Peer, Node} = peer:start_link(#{name => lambda,
    +    {ok, Peer, Node} = peer:start_link(#{name => lambda,
             connection => standard_io,
    -        exec => {Docker, ["run", "-h", "one", "-i", "lambda"]}}),
    -    {ok, Peer2, Node2} = peer:start_link(#{name => lambda,
    +        exec => {Docker, ["run", "-h", "one", "-i", "lambda"]}}),
    +    {ok, Peer2, Node2} = peer:start_link(#{name => lambda,
             connection => standard_io,
    -        exec => {Docker, ["run", "-h", "two", "-i", "lambda"]}}),
    +        exec => {Docker, ["run", "-h", "two", "-i", "lambda"]}}),
     
         %% find IP address of the second node using alternative connection RPC
    -    {ok, Ips} = peer:call(Peer2, inet, getifaddrs, []),
    -    {"eth0", Eth0} = lists:keyfind("eth0", 1, Ips),
    -    {addr, Ip} = lists:keyfind(addr, 1, Eth0),
    +    {ok, Ips} = peer:call(Peer2, inet, getifaddrs, []),
    +    {"eth0", Eth0} = lists:keyfind("eth0", 1, Ips),
    +    {addr, Ip} = lists:keyfind(addr, 1, Eth0),
     
         %% make first node to discover second one
    -    ok = peer:call(Peer, inet_db, set_lookup, [[file]]),
    -    ok = peer:call(Peer, inet_db, add_host, [Ip, ["two"]]),
    +    ok = peer:call(Peer, inet_db, set_lookup, [[file]]),
    +    ok = peer:call(Peer, inet_db, add_host, [Ip, ["two"]]),
     
         %% join a cluster
    -    true = peer:call(Peer, net_kernel, connect_node, [Node2]),
    +    true = peer:call(Peer, net_kernel, connect_node, [Node2]),
         %% verify that second peer node has only the first node visible
    -    [Node] = peer:call(Peer2, erlang, nodes, []),
    +    [Node] = peer:call(Peer2, erlang, nodes, []),
     
         %% stop peers, causing containers to also stop
    -    peer:stop(Peer2),
    -    peer:stop(Peer).
    +    peer:stop(Peer2),
    +    peer:stop(Peer).
     
    -build_release(Dir) ->
    +build_release(Dir) ->
         %% load sasl.app file, otherwise application:get_key will fail
    -    application:load(sasl),
    +    application:load(sasl),
         %% create *.rel - release file
    -    RelFile = filename:join(Dir, "lambda.rel"),
    -    Release = {release, {"lambda", "1.0.0"},
    -        {erts, erlang:system_info(version)},
    -        [{App, begin {ok, Vsn} = application:get_key(App, vsn), Vsn end}
    -            || App <- [kernel, stdlib, sasl]]},
    -    ok = file:write_file(RelFile, list_to_binary(lists:flatten(
    -        io_lib:format("~tp.", [Release])))),
    -    RelFileNoExt = filename:join(Dir, "lambda"),
    +    RelFile = filename:join(Dir, "lambda.rel"),
    +    Release = {release, {"lambda", "1.0.0"},
    +        {erts, erlang:system_info(version)},
    +        [{App, begin {ok, Vsn} = application:get_key(App, vsn), Vsn end}
    +            || App <- [kernel, stdlib, sasl]]},
    +    ok = file:write_file(RelFile, list_to_binary(lists:flatten(
    +        io_lib:format("~tp.", [Release])))),
    +    RelFileNoExt = filename:join(Dir, "lambda"),
     
         %% create boot script
    -    {ok, systools_make, []} = systools:make_script(RelFileNoExt,
    -        [silent, {outdir, Dir}]),
    +    {ok, systools_make, []} = systools:make_script(RelFileNoExt,
    +        [silent, {outdir, Dir}]),
         %% package release into *.tar.gz
    -    ok = systools:make_tar(RelFileNoExt, [{erts, code:root_dir()}]).
    +    ok = systools:make_tar(RelFileNoExt, [{erts, code:root_dir()}]).
     
    -build_image(Dir) ->
    +build_image(Dir) ->
         %% Create Dockerfile example, working only for Ubuntu 20.04
         %% Expose port 4445, and make Erlang distribution to listen
         %%  on this port, and connect to it without EPMD
         %% Set cookie on both nodes to be the same.
    -    BuildScript = filename:join(Dir, "Dockerfile"),
    +    BuildScript = filename:join(Dir, "Dockerfile"),
         Dockerfile =
           "FROM ubuntu:20.04 as runner\n"
           "EXPOSE 4445\n"
           "WORKDIR /opt/lambda\n"
           "COPY lambda.tar.gz /tmp\n"
           "RUN tar -zxvf /tmp/lambda.tar.gz -C /opt/lambda\n"
    -      "ENTRYPOINT [\"/opt/lambda/erts-" ++ erlang:system_info(version) ++
    +      "ENTRYPOINT [\"/opt/lambda/erts-" ++ erlang:system_info(version) ++
           "/bin/dyn_erl\", \"-boot\", \"/opt/lambda/releases/1.0.0/start\","
           " \"-kernel\", \"inet_dist_listen_min\", \"4445\","
           " \"-erl_epmd_port\", \"4445\","
           " \"-setcookie\", \"secret\"]\n",
    -    ok = file:write_file(BuildScript, Dockerfile),
    -    os:cmd("docker build -t lambda " ++ Dir).
    +
    ok = file:write_file(BuildScript, Dockerfile), + os:cmd("docker build -t lambda " ++ Dir).
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/proc_lib.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/proc_lib.xhtml 2025-05-10 20:19:24.257327790 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/proc_lib.xhtml 2025-05-10 20:19:24.297328152 +0000 @@ -874,21 +874,21 @@ failed. When doing so the start function can return before the failing process has exited, which may block VM resources required for a new start attempt to succeed. Use init_fail/2,3 for that purpose.

    The following example illustrates how this function and proc_lib:start_link/3 -are used:

    -module(my_proc).
    --export([start_link/0]).
    --export([init/1]).
    +are used:

    -module(my_proc).
    +-export([start_link/0]).
    +-export([init/1]).
     
    -start_link() ->
    -    proc_lib:start_link(my_proc, init, [self()]).
    +start_link() ->
    +    proc_lib:start_link(my_proc, init, [self()]).
     
    -init(Parent) ->
    -    case do_initialization() of
    +init(Parent) ->
    +    case do_initialization() of
             ok ->
    -            proc_lib:init_ack(Parent, {ok, self()});
    -        {error, Reason} ->
    -            exit(Reason)
    +            proc_lib:init_ack(Parent, {ok, self()});
    +        {error, Reason} ->
    +            exit(Reason)
         end,
    -    loop().
    +    loop().
     
     ...
    @@ -961,21 +961,21 @@ started process, the start function returns an error tuple when the started process exits, or when the start function time-out (if used) has passed, see start/3,4,5.

    The following example illustrates how this function and proc_lib:start_link/3 -can be used:

    -module(my_proc).
    --export([start_link/0]).
    --export([init/1]).
    +can be used:

    -module(my_proc).
    +-export([start_link/0]).
    +-export([init/1]).
     
    -start_link() ->
    -    proc_lib:start_link(my_proc, init, [self()]).
    +start_link() ->
    +    proc_lib:start_link(my_proc, init, [self()]).
     
    -init(Parent) ->
    -    case do_initialization() of
    +init(Parent) ->
    +    case do_initialization() of
             ok ->
    -            proc_lib:init_ack(Parent, {ok, self()});
    -        {error, Reason} = Error ->
    -            proc_lib:init_fail(Parent, Error, {exit, normal})
    +            proc_lib:init_ack(Parent, {ok, self()});
    +        {error, Reason} = Error ->
    +            proc_lib:init_fail(Parent, Error, {exit, normal})
         end,
    -    loop().
    +    loop().
     
     ...
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/proplists.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/proplists.xhtml 2025-05-10 20:19:24.257327790 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/proplists.xhtml 2025-05-10 20:19:24.297328152 +0000 @@ -411,7 +411,7 @@

    Similar to get_all_values/2, but each value is wrapped in a list unless it is already itself a list. The resulting list of lists is concatenated. This is -often useful for "incremental" options.

    Example:

    append_values(a, [{a, [1,2]}, {b, 0}, {a, 3}, {c, -1}, {a, [4]}])

    returns:

    [1,2,3,4]
    +often useful for "incremental" options.

    Example:

    append_values(a, [{a, [1,2]}, {b, 0}, {a, 3}, {c, -1}, {a, [4]}])

    returns:

    [1,2,3,4]
    @@ -505,10 +505,10 @@ first entry in ListIn with the same key as Property, and E and Property have equivalent normal forms, then E is replaced with the terms in Expansion, and any following entries with the same key are deleted from -ListIn.

    For example, the following expressions all return [fie, bar, baz, fum]:

    expand([{foo, [bar, baz]}], [fie, foo, fum])
    -expand([{{foo, true}, [bar, baz]}], [fie, foo, fum])
    -expand([{{foo, false}, [bar, baz]}], [fie, {foo, false}, fum])

    However, no expansion is done in the following call because {foo, false} -shadows foo:

    expand([{{foo, true}, [bar, baz]}], [{foo, false}, fie, foo, fum])

    Notice that if the original property term is to be preserved in the result when +ListIn.

    For example, the following expressions all return [fie, bar, baz, fum]:

    expand([{foo, [bar, baz]}], [fie, foo, fum])
    +expand([{{foo, true}, [bar, baz]}], [fie, foo, fum])
    +expand([{{foo, false}, [bar, baz]}], [fie, {foo, false}, fum])

    However, no expansion is done in the following call because {foo, false} +shadows foo:

    expand([{{foo, true}, [bar, baz]}], [{foo, false}, fie, foo, fum])

    Notice that if the original property term is to be preserved in the result when expanded, it must be included in the expansion list. The inserted terms are not expanded recursively. If Expansions contains more than one property with the same key, only the first occurrence is used.

    See also normalize/2.

    @@ -913,7 +913,7 @@

    Partitions List into a list of sublists and a remainder.

    Lists contains one sublist for each key in Keys, in the corresponding order. The relative order of the elements in each sublist is preserved from the original List. Rest contains the elements in List that are not associated with any of the -specified keys, also with their original relative order preserved.

    Example:

    split([{c, 2}, {e, 1}, a, {c, 3, 4}, d, {b, 5}, b], [a, b, c])

    returns:

    {[[a], [{b, 5}, b],[{c, 2}, {c, 3, 4}]], [{e, 1}, d]}
    +specified keys, also with their original relative order preserved.

    Example:

    split([{c, 2}, {e, 1}, a, {c, 3, 4}, d, {b, 5}, b], [a, b, c])

    returns:

    {[[a], [{b, 5}, b],[{c, 2}, {c, 3, 4}]], [{e, 1}, d]}
    @@ -1036,7 +1036,7 @@ an association of the form Key => Value. Anything else will be silently ignored.

    If the same key appears in List multiple times, the value of the one appearing nearest to the head of List will be in the result map, that is the value that -would be returned by a call to get_value(Key, List).

    Example:

    to_map([a, {b, 1}, {c, 2}, {c, 3}])

    returns:

    #{a => true, b => 1, c => 2}
    +would be returned by a call to get_value(Key, List).

    Example:

    to_map([a, {b, 1}, {c, 2}, {c, 3}])

    returns:

    #{a => true, b => 1, c => 2}
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/qlc.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/qlc.xhtml 2025-05-10 20:19:24.257327790 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/qlc.xhtml 2025-05-10 20:19:24.297328152 +0000 @@ -180,24 +180,24 @@ If a tuple {finished} exists among the answers to QH, it is returned twice from append/2.

    As another example, consider concatenating the answers to two queries QH1 and QH2 while removing all duplicates. This is accomplished by using option -unique:

    qlc:q([X || X <- qlc:append(QH1, QH2)], {unique, true})

    The cost is substantial: every returned answer is stored in an ETS table. Before +unique:

    qlc:q([X || X <- qlc:append(QH1, QH2)], {unique, true})

    The cost is substantial: every returned answer is stored in an ETS table. Before returning an answer, it is looked up in the ETS table to check if it has already been returned. Without the unique option, all answers to QH1 would be returned followed by all answers to QH2. The unique option keeps the order between the remaining answers.

    If the order of the answers is not important, there is an alternative to the -unique option, namely to sort the answers uniquely:

    qlc:sort(qlc:q([X || X <- qlc:append(QH1, QH2)], {unique, true})).

    This query also removes duplicates but the answers are sorted. If there are many +unique option, namely to sort the answers uniquely:

    qlc:sort(qlc:q([X || X <- qlc:append(QH1, QH2)], {unique, true})).

    This query also removes duplicates but the answers are sorted. If there are many answers, temporary files are used. Notice that to get the first unique answer, all answers must be found and sorted. Both alternatives find duplicates by comparing answers, that is, if A1 and A2 are answers found in that order, then A2 is a removed if A1 == A2.

    To return only a few answers, cursors can be used. The following code returns no -more than five answers using an ETS table for storing the unique answers:

    C = qlc:cursor(qlc:q([X || X <- qlc:append(QH1, QH2)],{unique,true})),
    -R = qlc:next_answers(C, 5),
    -ok = qlc:delete_cursor(C),
    +more than five answers using an ETS table for storing the unique answers:

    C = qlc:cursor(qlc:q([X || X <- qlc:append(QH1, QH2)],{unique,true})),
    +R = qlc:next_answers(C, 5),
    +ok = qlc:delete_cursor(C),
     R.

    QLCs are convenient for stating constraints on data from two or more tables. The -following example does a natural join on two query handles on position 2:

    qlc:q([{X1,X2,X3,Y1} ||
    -          {X1,X2,X3} <- QH1,
    -          {Y1,Y2} <- QH2,
    -          X2 =:= Y2])

    The qlc module evaluates this differently depending on the query handles QH1 +following example does a natural join on two query handles on position 2:

    qlc:q([{X1,X2,X3,Y1} ||
    +          {X1,X2,X3} <- QH1,
    +          {Y1,Y2} <- QH2,
    +          X2 =:= Y2])

    The qlc module evaluates this differently depending on the query handles QH1 and QH2. If, for example, X2 is matched against the key of a QLC table, the lookup join method traverses the objects of QH2 while looking up key values in the table. However, if not X2 or Y2 is matched against the key or an indexed @@ -205,11 +205,11 @@ both sorted on position 2 and next do the join by traversing the objects one by one.

    Option join can be used to force the qlc module to use a certain join method. For the rest of this section it is assumed that the excessively slow -join method called "nested loop" has been chosen:

    qlc:q([{X1,X2,X3,Y1} ||
    -          {X1,X2,X3} <- QH1,
    -          {Y1,Y2} <- QH2,
    -          X2 =:= Y2],
    -      {join, nested_loop})

    In this case the filter is applied to every possible pair of answers to QH1 +join method called "nested loop" has been chosen:

    qlc:q([{X1,X2,X3,Y1} ||
    +          {X1,X2,X3} <- QH1,
    +          {Y1,Y2} <- QH2,
    +          X2 =:= Y2],
    +      {join, nested_loop})

    In this case the filter is applied to every possible pair of answers to QH1 and QH2, one at a time. If there are M answers to QH1 and N answers to QH2, the filter is run M*N times.

    If QH2 is a call to the function for gb_trees, as defined in section Implementing a QLC Table, then @@ -223,7 +223,7 @@ no side effects so that the meaning of the query does not change if QH2 is evaluated only once. One way of caching the answers is to evaluate QH2 first of all and substitute the list of answers for QH2 in the query. Another way is -to use option cache. It is expressed like this:

    QH2' = qlc:q([X || X <- QH2], {cache, ets})

    or only

    QH2' = qlc:q([X || X <- QH2], cache)

    The effect of option cache is that when generator QH2' is run the first +to use option cache. It is expressed like this:

    QH2' = qlc:q([X || X <- QH2], {cache, ets})

    or only

    QH2' = qlc:q([X || X <- QH2], cache)

    The effect of option cache is that when generator QH2' is run the first time, every answer is stored in an ETS table. When the next answer of QH1 is tried, answers to QH2' are copied from the ETS table, which is very fast. As for option unique the cost is a possibly substantial amount of RAM memory.

    Option {cache, list} offers the possibility to store the answers in a list on @@ -245,62 +245,62 @@ Implementing a QLC Table

    As an example of how to use function table/2, the implementation of a QLC -table for the gb_trees module is given:

    -module(gb_table).
    +table for the gb_trees module is given:

    -module(gb_table).
     
    --export([table/1]).
    +-export([table/1]).
     
    -table(T) ->
    -    TF = fun() -> qlc_next(gb_trees:next(gb_trees:iterator(T))) end,
    -    InfoFun = fun(num_of_objects) -> gb_trees:size(T);
    -                 (keypos) -> 1;
    -                 (is_sorted_key) -> true;
    -                 (is_unique_objects) -> true;
    -                 (_) -> undefined
    +table(T) ->
    +    TF = fun() -> qlc_next(gb_trees:next(gb_trees:iterator(T))) end,
    +    InfoFun = fun(num_of_objects) -> gb_trees:size(T);
    +                 (keypos) -> 1;
    +                 (is_sorted_key) -> true;
    +                 (is_unique_objects) -> true;
    +                 (_) -> undefined
                   end,
         LookupFun =
    -        fun(1, Ks) ->
    -                lists:flatmap(fun(K) ->
    -                                      case gb_trees:lookup(K, T) of
    -                                          {value, V} -> [{K,V}];
    -                                          none -> []
    +        fun(1, Ks) ->
    +                lists:flatmap(fun(K) ->
    +                                      case gb_trees:lookup(K, T) of
    +                                          {value, V} -> [{K,V}];
    +                                          none -> []
                                           end
    -                              end, Ks)
    +                              end, Ks)
             end,
         FormatFun =
    -        fun({all, NElements, ElementFun}) ->
    -                ValsS = io_lib:format("gb_trees:from_orddict(~w)",
    -                                      [gb_nodes(T, NElements, ElementFun)]),
    -                io_lib:format("gb_table:table(~s)", [ValsS]);
    -           ({lookup, 1, KeyValues, _NElements, ElementFun}) ->
    -                ValsS = io_lib:format("gb_trees:from_orddict(~w)",
    -                                      [gb_nodes(T, infinity, ElementFun)]),
    -                io_lib:format("lists:flatmap(fun(K) -> "
    +        fun({all, NElements, ElementFun}) ->
    +                ValsS = io_lib:format("gb_trees:from_orddict(~w)",
    +                                      [gb_nodes(T, NElements, ElementFun)]),
    +                io_lib:format("gb_table:table(~s)", [ValsS]);
    +           ({lookup, 1, KeyValues, _NElements, ElementFun}) ->
    +                ValsS = io_lib:format("gb_trees:from_orddict(~w)",
    +                                      [gb_nodes(T, infinity, ElementFun)]),
    +                io_lib:format("lists:flatmap(fun(K) -> "
                                   "case gb_trees:lookup(K, ~s) of "
                                   "{value, V} -> [{K,V}];none -> [] end "
                                   "end, ~w)",
    -                              [ValsS, [ElementFun(KV) || KV <- KeyValues]])
    +                              [ValsS, [ElementFun(KV) || KV <- KeyValues]])
             end,
    -    qlc:table(TF, [{info_fun, InfoFun}, {format_fun, FormatFun},
    -                   {lookup_fun, LookupFun},{key_equality,'=='}]).
    +    qlc:table(TF, [{info_fun, InfoFun}, {format_fun, FormatFun},
    +                   {lookup_fun, LookupFun},{key_equality,'=='}]).
     
    -qlc_next({X, V, S}) ->
    -    [{X,V} | fun() -> qlc_next(gb_trees:next(S)) end];
    -qlc_next(none) ->
    -    [].
    -
    -gb_nodes(T, infinity, ElementFun) ->
    -    gb_nodes(T, -1, ElementFun);
    -gb_nodes(T, NElements, ElementFun) ->
    -    gb_iter(gb_trees:iterator(T), NElements, ElementFun).
    +qlc_next({X, V, S}) ->
    +    [{X,V} | fun() -> qlc_next(gb_trees:next(S)) end];
    +qlc_next(none) ->
    +    [].
    +
    +gb_nodes(T, infinity, ElementFun) ->
    +    gb_nodes(T, -1, ElementFun);
    +gb_nodes(T, NElements, ElementFun) ->
    +    gb_iter(gb_trees:iterator(T), NElements, ElementFun).
     
    -gb_iter(_I, 0, _EFun) ->
    +gb_iter(_I, 0, _EFun) ->
         '...';
    -gb_iter(I0, N, EFun) ->
    -    case gb_trees:next(I0) of
    -        {X, V, I} ->
    -            [EFun({X,V}) | gb_iter(I, N-1, EFun)];
    +gb_iter(I0, N, EFun) ->
    +    case gb_trees:next(I0) of
    +        {X, V, I} ->
    +            [EFun({X,V}) | gb_iter(I, N-1, EFun)];
             none ->
    -            []
    +            []
         end.

    TF is the traversal function. The qlc module requires that there is a way of traversing all objects of the data structure. gb_trees has an iterator function suitable for that purpose. Notice that for each object returned, a new @@ -336,49 +336,49 @@ example, 2 == 2.0 evaluates to true while 2 =:= 2.0 evaluates to false. Normally this is a minor issue, but the qlc module cannot ignore the difference, which affects the user's choice of operators in QLCs.

    If the qlc module at compile time can determine that some constant is free of -integers, it does not matter which one of ==/2 or =:=/2 is used:

    1> E1 = ets:new(t, [set]), % uses =:=/2 for key equality
    -Q1 = qlc:q([K ||
    -{K} <- ets:table(E1),
    -K == 2.71 orelse K == a]),
    -io:format("~s~n", [qlc:info(Q1)]).
    -ets:match_spec_run(
    -       lists:flatmap(fun(V) ->
    -			    ets:lookup(#Ref<0.3098908599.2283929601.256025>,
    -				       V)
    +integers, it does not matter which one of ==/2 or =:=/2 is used:

    1> E1 = ets:new(t, [set]), % uses =:=/2 for key equality
    +Q1 = qlc:q([K ||
    +{K} <- ets:table(E1),
    +K == 2.71 orelse K == a]),
    +io:format("~s~n", [qlc:info(Q1)]).
    +ets:match_spec_run(
    +       lists:flatmap(fun(V) ->
    +			    ets:lookup(#Ref<0.3098908599.2283929601.256025>,
    +				       V)
     		     end,
    -		     [a, 2.71]),
    -       ets:match_spec_compile([{{'$1'}, [], ['$1']}]))

    In the example, operator ==/2 has been handled exactly as =:=/2 would have + [a, 2.71]), + ets:match_spec_compile([{{'$1'}, [], ['$1']}]))

    In the example, operator ==/2 has been handled exactly as =:=/2 would have been handled. However, if it cannot be determined at compile time that some constant is free of integers, and the table uses =:=/2 when comparing keys for equality (see option key_equality), then the qlc module does not try to look up the constant. The reason is that there is in the general case no upper limit on the number of key values that can compare equal -to such a constant; every combination of integers and floats must be looked up:

    2> E2 = ets:new(t, [set]),
    -true = ets:insert(E2, [{{2,2},a},{{2,2.0},b},{{2.0,2},c}]),
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/queue.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/queue.xhtml	2025-05-10 20:19:24.257327790 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/queue.xhtml	2025-05-10 20:19:24.297328152 +0000
    @@ -602,10 +602,10 @@
           
     
     

    Returns true if Pred(Item) returns true for all items Item in Q, -otherwise false.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    -2> queue:all(fun (E) -> E > 3 end, Queue).
    +otherwise false.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    +2> queue:all(fun (E) -> E > 3 end, Queue).
     false
    -3> queue:all(fun (E) -> E > 0 end, Queue).
    +3> queue:all(fun (E) -> E > 0 end, Queue).
     true
    @@ -637,10 +637,10 @@

    Returns true if Pred(Item) returns true for at least one item Item in -Q, otherwise false.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    -2> queue:any(fun (E) -> E > 10 end, Queue).
    +Q, otherwise false.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    +2> queue:any(fun (E) -> E > 10 end, Queue).
     false
    -3> queue:any(fun (E) -> E > 3 end, Queue).
    +3> queue:any(fun (E) -> E > 3 end, Queue).
     true
    @@ -672,9 +672,9 @@

    Returns a copy of Q1 where the first item matching Item is deleted, if there -is such an item.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    -2> Queue1 = queue:delete(3, Queue).
    -3> queue:member(3, Queue1).
    +is such an item.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    +2> Queue1 = queue:delete(3, Queue).
    +3> queue:member(3, Queue1).
     false
    @@ -706,10 +706,10 @@

    Returns a copy of Q1 where the last item matching Item is deleted, if there -is such an item.

    Example:

    1> Queue = queue:from_list([1,2,3,4,3,5]).
    -2> Queue1 = queue:delete_r(3, Queue).
    -3> queue:to_list(Queue1).
    -[1,2,3,4,5]
    +is such an item.

    Example:

    1> Queue = queue:from_list([1,2,3,4,3,5]).
    +2> Queue1 = queue:delete_r(3, Queue).
    +3> queue:to_list(Queue1).
    +[1,2,3,4,5]
    @@ -745,10 +745,10 @@

    Returns a copy of Q1 where the first item for which Pred returns true is -deleted, if there is such an item.

    Example:

    1> Queue = queue:from_list([100,1,2,3,4,5]).
    -2> Queue1 = queue:delete_with(fun (E) -> E > 0, Queue).
    -3> queue:to_list(Queue1).
    -[1,2,3,4,5]
    +deleted, if there is such an item.

    Example:

    1> Queue = queue:from_list([100,1,2,3,4,5]).
    +2> Queue1 = queue:delete_with(fun (E) -> E > 0, Queue).
    +3> queue:to_list(Queue1).
    +[1,2,3,4,5]
    @@ -784,10 +784,10 @@

    Returns a copy of Q1 where the last item for which Pred returns true is -deleted, if there is such an item.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5,100]).
    -2> Queue1 = queue:delete_with(fun (E) -> E > 10, Queue).
    -3> queue:to_list(Queue1).
    -[1,2,3,4,5]
    +deleted, if there is such an item.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5,100]).
    +2> Queue1 = queue:delete_with(fun (E) -> E > 10, Queue).
    +3> queue:to_list(Queue1).
    +[1,2,3,4,5]
    @@ -818,19 +818,19 @@

    Returns a queue Q2 that is the result of calling Fun(Item) on all items in Q1.

    If Fun(Item) returns true, Item is copied to the result queue. If it returns false, Item is not copied. If it returns a list, the list elements -are inserted instead of Item in the result queue.

    Example 1:

    1> Queue = queue:from_list([1,2,3,4,5]).
    -{[5,4,3],[1,2]}
    -2> Queue1 = queue:filter(fun (E) -> E > 2 end, Queue).
    -{[5],[3,4]}
    -3> queue:to_list(Queue1).
    -[3,4,5]

    So, Fun(Item) returning [Item] is thereby semantically equivalent to +are inserted instead of Item in the result queue.

    Example 1:

    1> Queue = queue:from_list([1,2,3,4,5]).
    +{[5,4,3],[1,2]}
    +2> Queue1 = queue:filter(fun (E) -> E > 2 end, Queue).
    +{[5],[3,4]}
    +3> queue:to_list(Queue1).
    +[3,4,5]

    So, Fun(Item) returning [Item] is thereby semantically equivalent to returning true, just as returning [] is semantically equivalent to returning -false. But returning a list builds more garbage than returning an atom.

    Example 2:

    1> Queue = queue:from_list([1,2,3,4,5]).
    -{[5,4,3],[1,2]}
    -2> Queue1 = queue:filter(fun (E) -> [E, E+1] end, Queue).
    -{[6,5,5,4,4,3],[1,2,2,3]}
    -3> queue:to_list(Queue1).
    -[1,2,2,3,3,4,4,5,5,6]
    +false. But returning a list builds more garbage than returning an atom.

    Example 2:

    1> Queue = queue:from_list([1,2,3,4,5]).
    +{[5,4,3],[1,2]}
    +2> Queue1 = queue:filter(fun (E) -> [E, E+1] end, Queue).
    +{[6,5,5,4,4,3],[1,2,2,3]}
    +3> queue:to_list(Queue1).
    +[1,2,2,3,3,4,4,5,5,6]
    @@ -869,15 +869,15 @@

    Returns a queue Q2 that is the result of calling Fun(Item) on all items in Q1.

    If Fun(Item) returns true, Item is copied to the result queue. If it returns false, Item is not copied. If it returns {true, NewItem}, the -queue element at this position is replaced with NewItem in the result queue.

    Example 1:

    1> Queue = queue:from_list([1,2,3,4,5]).
    -{[5,4,3],[1,2]}
    -2> Queue1 = queue:filtermap(fun (E) -> E > 2 end, Queue).
    -{[5],[3,4]}
    -3> queue:to_list(Queue1).
    -[3,4,5]
    -4> Queue1 = queue:filtermap(fun (E) -> {true, E+100} end, Queue).
    -{"ihg","ef"}
    -5> queue:to_list(Queue1).
    +queue element at this position is replaced with NewItem in the result queue.

    Example 1:

    1> Queue = queue:from_list([1,2,3,4,5]).
    +{[5,4,3],[1,2]}
    +2> Queue1 = queue:filtermap(fun (E) -> E > 2 end, Queue).
    +{[5],[3,4]}
    +3> queue:to_list(Queue1).
    +[3,4,5]
    +4> Queue1 = queue:filtermap(fun (E) -> {true, E+100} end, Queue).
    +{"ihg","ef"}
    +5> queue:to_list(Queue1).
     "efghi
    @@ -918,9 +918,9 @@ AccIn == Acc0. The queue is traversed in queue order, that is, from front to rear. Fun/2 must return a new accumulator, which is passed to the next call. The function returns the final value of the accumulator. Acc0 is returned if -the queue is empty.

    Example:

    1> queue:fold(fun(X, Sum) -> X + Sum end, 0, queue:from_list([1,2,3,4,5])).
    +the queue is empty.

    Example:

    1> queue:fold(fun(X, Sum) -> X + Sum end, 0, queue:from_list([1,2,3,4,5])).
     15
    -2> queue:fold(fun(X, Prod) -> X * Prod end, 1, queue:from_list([1,2,3,4,5])).
    +2> queue:fold(fun(X, Prod) -> X * Prod end, 1, queue:from_list([1,2,3,4,5])).
     120
    @@ -978,12 +978,12 @@ -

    Inserts Item at the rear of queue Q1. Returns the resulting queue Q2.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    -{[5,4,3],[1,2]}
    -2> Queue1 = queue:in(100, Queue).
    -{[100,5,4,3],[1,2]}
    -3> queue:to_list(Queue1).
    -[1,2,3,4,5,100]
    +

    Inserts Item at the rear of queue Q1. Returns the resulting queue Q2.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    +{[5,4,3],[1,2]}
    +2> Queue1 = queue:in(100, Queue).
    +{[100,5,4,3],[1,2]}
    +3> queue:to_list(Queue1).
    +[1,2,3,4,5,100]
    @@ -1011,12 +1011,12 @@ -

    Inserts Item at the front of queue Q1. Returns the resulting queue Q2.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    -{[5,4,3],[1,2]}
    -2> Queue1 = queue:in_r(100, Queue).
    -{[5,4,3],[100,1,2]}
    -3> queue:to_list(Queue1).
    -[100,1,2,3,4,5]
    +

    Inserts Item at the front of queue Q1. Returns the resulting queue Q2.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    +{[5,4,3],[1,2]}
    +2> Queue1 = queue:in_r(100, Queue).
    +{[5,4,3],[100,1,2]}
    +3> queue:to_list(Queue1).
    +[100,1,2,3,4,5]
    @@ -1104,12 +1104,12 @@

    Returns a queue Q3 that is the result of joining Q1 and Q2 with Q1 in -front of Q2.

    Example:

    1> Queue1 = queue:from_list([1,3]).
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/rand.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/rand.xhtml	2025-05-10 20:19:24.253327753 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/rand.xhtml	2025-05-10 20:19:24.297328152 +0000
    @@ -96,13 +96,13 @@
     a reasonably unpredictable seed.

    The functions with explicit state don't use the process dictionary.

    Examples

    Simple use; create and seed the default algorithm with a non-fixed seed, if not already done, and generate two uniformly distibuted -floating point numbers.

    R0 = rand:uniform(),
    -R1 = rand:uniform(),

    Use a specified algorithm:

    _ = rand:seed(exro928ss),
    -R2 = rand:uniform(),

    Use a specified algorithm with a fixed seed:

    _ = rand:seed(exro928ss, {123, 123534, 345345}),
    -R3 = rand:uniform(),

    Use the functional API with a non-fixed seed:

    S0 = rand:seed_s(exsss),
    -{R4, S1} = rand:uniform_s(S0),

    Generate a textbook basic form Box-Muller standard normal distribution number:

    R5 = rand:uniform_real(),
    -R6 = rand:uniform(),
    -SND0 = math:sqrt(-2 * math:log(R5)) * math:cos(math:pi() * R6)

    Generate a standard normal distribution number:

    {SND1, S2} = rand:normal_s(S1),

    Generate a normal distribution number with with mean -3 and variance 0.5:

    {ND0, S3} = rand:normal_s(-3, 0.5, S2),

    Quality of the Generated Numbers

    Note

    The builtin random number generator algorithms are not cryptographically +floating point numbers.

    R0 = rand:uniform(),
    +R1 = rand:uniform(),

    Use a specified algorithm:

    _ = rand:seed(exro928ss),
    +R2 = rand:uniform(),

    Use a specified algorithm with a fixed seed:

    _ = rand:seed(exro928ss, {123, 123534, 345345}),
    +R3 = rand:uniform(),

    Use the functional API with a non-fixed seed:

    S0 = rand:seed_s(exsss),
    +{R4, S1} = rand:uniform_s(S0),

    Generate a textbook basic form Box-Muller standard normal distribution number:

    R5 = rand:uniform_real(),
    +R6 = rand:uniform(),
    +SND0 = math:sqrt(-2 * math:log(R5)) * math:cos(math:pi() * R6)

    Generate a standard normal distribution number:

    {SND1, S2} = rand:normal_s(S1),

    Generate a normal distribution number with with mean -3 and variance 0.5:

    {ND0, S3} = rand:normal_s(-3, 0.5, S2),

    Quality of the Generated Numbers

    Note

    The builtin random number generator algorithms are not cryptographically strong. If a cryptographically strong random number generator is needed, use something like crypto:rand_seed/0.

    For all these generators except exro928ss and exsss the lowest bit(s) have got a slightly less random behaviour than all other bits. @@ -113,7 +113,7 @@ up to (and included) 16TB, with the exception of binary rank tests, which fail due to the lowest bit being an LFSR; all other bits pass all tests. We suggest to use a sign test to extract a random Boolean value.

    If this is a problem; to generate a boolean with these algorithms, -use something like this:

    (rand:uniform(256) > 128) % -> boolean()
    ((rand:uniform(256) - 1) bsr 7) % -> 0 | 1

    For a general range, with N = 1 for exrop, and N = 3 for exs1024s:

    (((rand:uniform(Range bsl N) - 1) bsr N) + 1)

    The floating point generating functions in this module waste the lowest bits +use something like this:

    (rand:uniform(256) > 128) % -> boolean()
    ((rand:uniform(256) - 1) bsr 7) % -> 0 | 1

    For a general range, with N = 1 for exrop, and N = 3 for exs1024s:

    (((rand:uniform(Range bsl N) - 1) bsr N) + 1)

    The floating point generating functions in this module waste the lowest bits when converting from an integer so they avoid this snag.

    @@ -1826,10 +1826,10 @@ equally spaced in the interval.

    Warning

    This function may return exactly 0.0 which can be fatal for certain applications. If that is undesired you can use (1.0 - rand:uniform()) to get the interval 0.0 < X =< 1.0, or instead use uniform_real/0.

    If neither endpoint is desired you can achieve the range -0.0 < X < 1.0 using test and re-try like this:

    my_uniform() ->
    -    case rand:uniform() of
    +0.0 < X < 1.0 using test and re-try like this:

    my_uniform() ->
    +    case rand:uniform() of
             X when 0.0 < X -> X;
    -        _ -> my_uniform()
    +        _ -> my_uniform()
         end.

    @@ -1985,7 +1985,7 @@ 16#7fa6502 * 2^32 - 1, which have been selected, in collaboration with Sebastiano Vigna, to avoid bignum operations and still get good statistical quality. It has been named "MWC59" and can be written as:

    C = CX0 bsr 32
    -X = CX0 band ((1 bsl 32)-1))
    +X = CX0 band ((1 bsl 32)-1))
     CX1 = 16#7fa6502 * X + C

    Because the generator uses a multiplier that is a power of 2 it gets statistical flaws for collision tests and birthday spacings tests in 2 and 3 dimensions, and these caveats apply even when looking /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/random.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/random.xhtml 2025-05-10 20:19:24.253327753 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/random.xhtml 2025-05-10 20:19:24.297328152 +0000 @@ -351,9 +351,9 @@

    Seeds random number generation with integer values in the process dictionary and -returns the old state.

    The following is an easy way of obtaining a unique value to seed with:

    random:seed(erlang:phash2([node()]),
    -            erlang:monotonic_time(),
    -            erlang:unique_integer())

    For details, see erlang:phash2/1, erlang:node/0, erlang:monotonic_time/0, +returns the old state.

    The following is an easy way of obtaining a unique value to seed with:

    random:seed(erlang:phash2([node()]),
    +            erlang:monotonic_time(),
    +            erlang:unique_integer())

    For details, see erlang:phash2/1, erlang:node/0, erlang:monotonic_time/0, and erlang:unique_integer/0.

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/re.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/re.xhtml 2025-05-10 20:19:24.253327753 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/re.xhtml 2025-05-10 20:19:24.297328152 +0000 @@ -1270,9 +1270,9 @@ follows (COMMIT) can be triggered first, so merely passing (COMMIT) during a match does not always guarantee that a match must be at this starting point.

    Notice that (*COMMIT) at the start of a pattern is not the same as an anchor, unless the PCRE start-of-match optimizations are turned off, as shown in the -following example:

    1> re:run("xyzabc","(*COMMIT)abc",[{capture,all,list}]).
    -{match,["abc"]}
    -2> re:run("xyzabc","(*COMMIT)abc",[{capture,all,list},no_start_optimize]).
    +following example:

    1> re:run("xyzabc","(*COMMIT)abc",[{capture,all,list}]).
    +{match,["abc"]}
    +2> re:run("xyzabc","(*COMMIT)abc",[{capture,all,list},no_start_optimize]).
     nomatch

    For this pattern, PCRE knows that any match must start with "a", so the optimization skips along the subject to "a" before applying the pattern to the first set of data. The match attempt then succeeds. In the second call the @@ -1989,32 +1989,32 @@

    Takes a compiled regular expression and an item, and returns the relevant data from the regular expression.

    The only supported item is namelist, which returns the tuple {namelist, [binary()]}, -containing the names of all (unique) named subpatterns in the regular expression.

    For example:

    1> {ok,MP} = re:compile("(?<A>A)|(?<B>B)|(?<C>C)").
    -{ok,{re_pattern,3,0,0,
    +containing the names of all (unique) named subpatterns in the regular expression.

    For example:

    1> {ok,MP} = re:compile("(?<A>A)|(?<B>B)|(?<C>C)").
    +{ok,{re_pattern,3,0,0,
                     <<69,82,67,80,119,0,0,0,0,0,0,0,1,0,0,0,255,255,255,255,
    -                  255,255,...>>}}
    -2> re:inspect(MP,namelist).
    -{namelist,[<<"A">>,<<"B">>,<<"C">>]}
    -3> {ok,MPD} = re:compile("(?<C>A)|(?<B>B)|(?<C>C)",[dupnames]).
    -{ok,{re_pattern,3,0,0,
    +                  255,255,...>>}}
    +2> re:inspect(MP,namelist).
    +{namelist,[<<"A">>,<<"B">>,<<"C">>]}
    +3> {ok,MPD} = re:compile("(?<C>A)|(?<B>B)|(?<C>C)",[dupnames]).
    +{ok,{re_pattern,3,0,0,
                     <<69,82,67,80,119,0,0,0,0,0,8,0,1,0,0,0,255,255,255,255,
    -                  255,255,...>>}}
    -4> re:inspect(MPD,namelist).
    -{namelist,[<<"B">>,<<"C">>]}

    Notice in the second example that the duplicate name only occurs once in the + 255,255,...>>}} +4> re:inspect(MPD,namelist). +{namelist,[<<"B">>,<<"C">>]}

    Notice in the second example that the duplicate name only occurs once in the returned list, and that the list is in alphabetical order regardless of where the names are positioned in the regular expression. The order of the names is the same as the order of captured subexpressions if {capture, all_names} is specified as an option to run/3. You can therefore create a name-to-value -mapping from the result of run/3 like this:

    1> {ok,MP} = re:compile("(?<A>A)|(?<B>B)|(?<C>C)").
    -{ok,{re_pattern,3,0,0,
    +mapping from the result of run/3 like this:

    1> {ok,MP} = re:compile("(?<A>A)|(?<B>B)|(?<C>C)").
    +{ok,{re_pattern,3,0,0,
                     <<69,82,67,80,119,0,0,0,0,0,0,0,1,0,0,0,255,255,255,255,
    -                  255,255,...>>}}
    -2> {namelist, N} = re:inspect(MP,namelist).
    -{namelist,[<<"A">>,<<"B">>,<<"C">>]}
    -3> {match,L} = re:run("AA",MP,[{capture,all_names,binary}]).
    -{match,[<<"A">>,<<>>,<<>>]}
    -4> NameMap = lists:zip(N,L).
    -[{<<"A">>,<<"A">>},{<<"B">>,<<>>},{<<"C">>,<<>>}]
    +
    255,255,...>>}} +2> {namelist, N} = re:inspect(MP,namelist). +{namelist,[<<"A">>,<<"B">>,<<"C">>]} +3> {match,L} = re:run("AA",MP,[{capture,all_names,binary}]). +{match,[<<"A">>,<<>>,<<>>]} +4> NameMap = lists:zip(N,L). +[{<<"A">>,<<"A">>},{<<"B">>,<<>>},{<<"C">>,<<>>}]
    @@ -2107,16 +2107,16 @@ subexpression number N, is inserted in the result. If no subexpression with that number is generated by the regular expression, nothing is inserted.

    To insert an & or a \ in the result, precede it with a \. Notice that Erlang already gives a special meaning to \ in literal strings, so a single \ must be -written as "\\" and therefore a double \ as "\\\\".

    Example:

    1> re:replace("abcd","c","[&]",[{return,list}]).
    -"ab[c]d"

    while

    2> re:replace("abcd","c","[\\&]",[{return,list}]).
    +written as "\\" and therefore a double \ as "\\\\".

    Example:

    1> re:replace("abcd","c","[&]",[{return,list}]).
    +"ab[c]d"

    while

    2> re:replace("abcd","c","[\\&]",[{return,list}]).
     "ab[&]d"

    If the replacement is given as a fun, it will be called with the whole matching expression as the first argument and a list of subexpression matches in the order in which they appear in the regular expression. The returned value will be -inserted in the result.

    Example:

    3> re:replace("abcd", ".(.)",
    -    fun(Whole, [<<C>>]) ->
    -         <<$#, Whole/binary, $-, (C - $a + $A), $#>>
    +inserted in the result.

    Example:

    3> re:replace("abcd", ".(.)",
    +    fun(Whole, [<<C>>]) ->
    +         <<$#, Whole/binary, $-, (C - $a + $A), $#>>
         end,
    -    [{return, list}]).
    +    [{return, list}]).
     "#ab-B#cd"

    Note

    Non-matching optional subexpressions will not be included in the list of subexpression matches if they are the last subexpressions in the regular expression.

    Example:

    The regular expression "(a)(b)?(c)?" ("a", optionally followed by "b", @@ -2233,7 +2233,7 @@ run/3 handles empty matches in the same way as Perl: a zero-length match at any point is also retried with options [anchored, notempty_atstart]. If that search gives a result of length > 0, -the result is included. Example:

    re:run("cat","(|at)",[global]).

    The following matchings are performed:

    • At offset 0 - The regular expression (|at) first match at the +the result is included. Example:

      re:run("cat","(|at)",[global]).

      The following matchings are performed:

      • At offset 0 - The regular expression (|at) first match at the initial position of string cat, giving the result set [{0,0},{0,0}] (the second {0,0} is because of the subexpression marked by the parentheses). As the length of the match is 0, we do not advance to the next position yet.

      • At offset 0 with [anchored, notempty_atstart] - The search is @@ -2245,7 +2245,7 @@ of results and the position in the search string is advanced two steps.

      • At offset 3 - The search once again matches the empty string, giving [{3,0},{3,0}].

      • At offset 1 with [anchored, notempty_atstart] - This gives no result of length > 0 and we are at the last position, so the global search is -complete.

      The result of the call is:

      {match,[[{0,0},{0,0}],[{1,0},{1,0}],[{1,2},{1,2}],[{3,0},{3,0}]]}
    • notempty - An empty string is not considered to be a valid match if this +complete.

    The result of the call is:

    {match,[[{0,0},{0,0}],[{1,0},{1,0}],[{1,2},{1,2}],[{3,0},{3,0}]]}
  • notempty - An empty string is not considered to be a valid match if this option is specified. If alternatives in the pattern exist, they are tried. If all the alternatives match the empty string, the entire match fails.

    Example:

    If the following pattern is applied to a string not beginning with "a" or "b", it would normally match the empty string at the start of the subject:

    a?b?

    With option notempty, this match is invalid, so run/3 searches @@ -2316,12 +2316,12 @@ instead of the stack, the amount of heap memory that can be used.

  • The Erlang VM uses a PCRE library where heap memory is used when regular expression match recursion occurs. This therefore limits the use of machine heap, not C stack.

    Specifying a lower value can result in matches with deep recursion failing, -when they should have matched:

    1> re:run("aaaaaaaaaaaaaz","(a+)*z").
    -{match,[{0,14},{0,13}]}
    -2> re:run("aaaaaaaaaaaaaz","(a+)*z",[{match_limit_recursion,5}]).
    +when they should have matched:

    1> re:run("aaaaaaaaaaaaaz","(a+)*z").
    +{match,[{0,14},{0,13}]}
    +2> re:run("aaaaaaaaaaaaaz","(a+)*z",[{match_limit_recursion,5}]).
     nomatch
    -3> re:run("aaaaaaaaaaaaaz","(a+)*z",[{match_limit_recursion,5},report_errors]).
    -{error,match_limit_recursion}

    This option and option match_limit are only to be used in rare cases. +3> re:run("aaaaaaaaaaaaaz","(a+)*z",[{match_limit_recursion,5},report_errors]). +{error,match_limit_recursion}

    This option and option match_limit are only to be used in rare cases. Understanding of the PCRE library internals is recommended before tampering with these limits.

  • {offset, integer() >= 0} - Start matching at the offset (position) specified in the subject string. The offset is zero-based, so that the default @@ -2343,9 +2343,9 @@ capturing).

    As an example of the default behavior, the following call returns, as first and only captured string, the matching part of the subject ("abcd" in the middle) as an index pair {3,4}, where character positions are zero-based, -just as in offsets:

    re:run("ABCabcdABC","abcd",[]).

    The return value of this call is:

    {match,[{3,4}]}

    Another (and quite common) case is where the regular expression matches all of -the subject:

    re:run("ABCabcdABC",".*abcd.*",[]).

    Here the return value correspondingly points out all of the string, beginning -at index 0, and it is 10 characters long:

    {match,[{0,10}]}

    If the regular expression contains capturing subpatterns, like in:

    re:run("ABCabcdABC",".*(abcd).*",[]).

    all of the matched subject is captured, as well as the captured substrings:

    {match,[{0,10},{3,4}]}

    The complete matching pattern always gives the first return value in the list +just as in offsets:

    re:run("ABCabcdABC","abcd",[]).

    The return value of this call is:

    {match,[{3,4}]}

    Another (and quite common) case is where the regular expression matches all of +the subject:

    re:run("ABCabcdABC",".*abcd.*",[]).

    Here the return value correspondingly points out all of the string, beginning +at index 0, and it is 10 characters long:

    {match,[{0,10}]}

    If the regular expression contains capturing subpatterns, like in:

    re:run("ABCabcdABC",".*(abcd).*",[]).

    all of the matched subject is captured, as well as the captured substrings:

    {match,[{0,10},{3,4}]}

    The complete matching pattern always gives the first return value in the list and the remaining subpatterns are added in the order they occurred in the regular expression.

    The capture tuple is built up as follows:

    • ValueSpec - Specifies which captured (sub)patterns are to be returned. ValueSpec can either be an atom describing a predefined set of return @@ -2370,12 +2370,12 @@ subpatterns (see below) in the regular expression, one can use atom/0s or string/0s to specify the subpatterns to be returned. For example, consider the regular expression:

      ".*(abcd).*"

      matched against string "ABCabcdABC", capturing only the "abcd" part (the -first explicit subpattern):

      re:run("ABCabcdABC",".*(abcd).*",[{capture,[1]}]).

      The call gives the following result, as the first explicitly captured +first explicit subpattern):

      re:run("ABCabcdABC",".*(abcd).*",[{capture,[1]}]).

      The call gives the following result, as the first explicitly captured subpattern is "(abcd)", matching "abcd" in the subject, at (zero-based) -position 3, of length 4:

      {match,[{3,4}]}

      Consider the same regular expression, but with the subpattern explicitly +position 3, of length 4:

      {match,[{3,4}]}

      Consider the same regular expression, but with the subpattern explicitly named 'FOO':

      ".*(?<FOO>abcd).*"

      With this expression, we could still give the index of the subpattern with -the following call:

      re:run("ABCabcdABC",".*(?<FOO>abcd).*",[{capture,[1]}]).

      giving the same result as before. But, as the subpattern is named, we can -also specify its name in the value list:

      re:run("ABCabcdABC",".*(?<FOO>abcd).*",[{capture,['FOO']}]).

      This would give the same result as the earlier examples, namely:

      {match,[{3,4}]}

      The values list can specify indexes or names not present in the regular +the following call:

      re:run("ABCabcdABC",".*(?<FOO>abcd).*",[{capture,[1]}]).

      giving the same result as before. But, as the subpattern is named, we can +also specify its name in the value list:

      re:run("ABCabcdABC",".*(?<FOO>abcd).*",[{capture,['FOO']}]).

      This would give the same result as the earlier examples, namely:

      {match,[{3,4}]}

      The values list can specify indexes or names not present in the regular expression, in which case the return values vary depending on the type. If the type is index, the tuple {-1,0} is returned for values with no corresponding subpattern in the regular expression, but for the other types @@ -2410,12 +2410,12 @@ string:

      "ABCabcdABC"

      the subpattern at index 2 does not match, as "abdd" is not present in the string, but the complete pattern matches (because of the alternative a(..d)). The subpattern at index 2 is therefore unassigned and the default -return value is:

      {match,[{0,10},{3,4},{-1,0},{4,3}]}

      Setting the capture Type to binary gives:

      {match,[<<"ABCabcdABC">>,<<"abcd">>,<<>>,<<"bcd">>]}

      Here the empty binary (<<>>) represents the unassigned subpattern. In the +return value is:

      {match,[{0,10},{3,4},{-1,0},{4,3}]}

      Setting the capture Type to binary gives:

      {match,[<<"ABCabcdABC">>,<<"abcd">>,<<>>,<<"bcd">>]}

      Here the empty binary (<<>>) represents the unassigned subpattern. In the binary case, some information about the matching is therefore lost, as <<>> can also be an empty string captured.

      If differentiation between empty matches and non-existing subpatterns is necessary, use the type index and do the conversion to the final type in Erlang code.

      When option global is speciified, the capture specification affects each -match separately, so that:

      re:run("cacb","c(a|b)",[global,{capture,[1],list}]).

      gives

      {match,[["a"],["b"]]}

    For a descriptions of options only affecting the compilation step, see +match separately, so that:

    re:run("cacb","c(a|b)",[global,{capture,[1],list}]).

    gives

    {match,[["a"],["b"]]}
  • For a descriptions of options only affecting the compilation step, see compile/2.

    @@ -2504,7 +2504,7 @@ compilation option is specified to this function, both the regular expression and Subject are to be specified as valid Unicode charlist()s.

    The result is given as a list of "strings", the preferred data type specified in option return (default iodata).

    If subexpressions are specified in the regular expression, the matching -subexpressions are returned in the resulting list as well. For example:

    re:split("Erlang","[ln]",[{return,list}]).

    gives

    ["Er","a","g"]

    while

    re:split("Erlang","([ln])",[{return,list}]).

    gives

    ["Er","l","a","n","g"]

    The text matching the subexpression (marked by the parentheses in the regular +subexpressions are returned in the resulting list as well. For example:

    re:split("Erlang","[ln]",[{return,list}]).

    gives

    ["Er","a","g"]

    while

    re:split("Erlang","([ln])",[{return,list}]).

    gives

    ["Er","l","a","n","g"]

    The text matching the subexpression (marked by the parentheses in the regular expression) is inserted in the result list where it was found. This means that concatenating the result of a split where the whole regular expression is a single subexpression (as in the last example) always results in the original @@ -2512,21 +2512,21 @@ "g"), nothing is inserted after that. To make the group of strings and the parts matching the subexpressions more obvious, one can use option group, which groups together the part of the subject string with the parts matching the -subexpressions when the string was split:

    re:split("Erlang","([ln])",[{return,list},group]).

    gives

    [["Er","l"],["a","n"],["g"]]

    Here the regular expression first matched the "l", causing "Er" to be the first +subexpressions when the string was split:

    re:split("Erlang","([ln])",[{return,list},group]).

    gives

    [["Er","l"],["a","n"],["g"]]

    Here the regular expression first matched the "l", causing "Er" to be the first part in the result. When the regular expression matched, the (only) subexpression was bound to the "l", so the "l" is inserted in the group together with "Er". The next match is of the "n", making "a" the next part to be returned. As the subexpression is bound to substring "n" in this case, the "n" is inserted into this group. The last group consists of the remaining string, as no more matches are found.

    By default, all parts of the string, including the empty strings, are returned -from the function, for example:

    re:split("Erlang","[lg]",[{return,list}]).

    gives

    ["Er","an",[]]

    as the matching of the "g" in the end of the string leaves an empty rest, which +from the function, for example:

    re:split("Erlang","[lg]",[{return,list}]).

    gives

    ["Er","an",[]]

    as the matching of the "g" in the end of the string leaves an empty rest, which is also returned. This behavior differs from the default behavior of the split function in Perl, where empty strings at the end are by default removed. To get -the "trimming" default behavior of Perl, specify trim as an option:

    re:split("Erlang","[lg]",[{return,list},trim]).

    gives

    ["Er","an"]

    The "trim" option says; "give me as many parts as possible except the empty +the "trimming" default behavior of Perl, specify trim as an option:

    re:split("Erlang","[lg]",[{return,list},trim]).

    gives

    ["Er","an"]

    The "trim" option says; "give me as many parts as possible except the empty ones", which sometimes can be useful. You can also specify how many parts you -want, by specifying {parts,N}:

    re:split("Erlang","[lg]",[{return,list},{parts,2}]).

    gives

    ["Er","ang"]

    Notice that the last part is "ang", not "an", as splitting was specified into /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/sets.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/sets.xhtml 2025-05-10 20:19:24.253327753 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/sets.xhtml 2025-05-10 20:19:24.293328116 +0000 @@ -51,11 +51,11 @@ respect to the aforementioned functions, their overall behavior may differ. As mentioned, this module considers elements as different if and only if they do not match (=:=), while both ordsets and gb_sets consider elements -as different if and only if they do not compare equal (==).

    Example:

    1> sets:is_element(1.0, sets:from_list([1])).
    +as different if and only if they do not compare equal (==).

    Example:

    1> sets:is_element(1.0, sets:from_list([1])).
     false
    -2> ordsets:is_element(1.0, ordsets:from_list([1])).
    +2> ordsets:is_element(1.0, ordsets:from_list([1])).
     true
    -2> gb_sets:is_element(1.0, gb_sets:from_list([1])).
    +2> gb_sets:is_element(1.0, gb_sets:from_list([1])).
     true

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/shell.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/shell.xhtml 2025-05-10 20:19:24.253327753 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/shell.xhtml 2025-05-10 20:19:24.293328116 +0000 @@ -61,7 +61,7 @@ definitions. To facilitate matters, record definitions in modules shell_default and user_default (if loaded) are read each time a new job is started. For example, adding the following line to user_default makes the -definition of file_info readily available in the shell:

    -include_lib("kernel/include/file.hrl").

    The shell runs in two modes:

    Command 1 sets variable Str to string "abcd".

    2> L = length(Str).
    +4

    Command 2 sets L to the length of string Str.

    3> Descriptor = {L, list_to_atom(Str)}.
    +{4,abcd}

    Command 3 builds the tuple Descriptor, evaluating the BIF list_to_atom/1 .

    4> L.
    -4

    Command 4 prints the value of variable L.

    5> b().
    -Descriptor = {4,abcd}
    +4

    Command 4 prints the value of variable L.

    5> b().
    +Descriptor = {4,abcd}
     L = 4
     Str = "abcd"
     ok

    Command 5 evaluates the internal shell command b(), which is an abbreviation of "bindings". This prints the current shell variables and their bindings. ok -at the end is the return value of function b().

    6> f(L).
    +at the end is the return value of function b().

    6> f(L).
     ok

    Command 6 evaluates the internal shell command f(L) (abbreviation of -"forget"). The value of variable L is removed.

    7> b().
    -Descriptor = {4,abcd}
    +"forget"). The value of variable L is removed.

    7> b().
    +Descriptor = {4,abcd}
     Str = "abcd"
    -ok

    Command 7 prints the new bindings.

    8> f(L).
    -ok

    Command 8 has no effect, as L has no value.

    9> {L, _} = Descriptor.
    -{4,abcd}

    Command 9 performs a pattern matching operation on Descriptor, binding a new +ok

    Command 7 prints the new bindings.

    8> f(L).
    +ok

    Command 8 has no effect, as L has no value.

    9> {L, _} = Descriptor.
    +{4,abcd}

    Command 9 performs a pattern matching operation on Descriptor, binding a new value to L.

    10> L.
    -4

    Command 10 prints the current value of L.

    11> {P, Q, R} = Descriptor.
    +4

    Command 10 prints the current value of L.

    11> {P, Q, R} = Descriptor.
     ** exception error: no match of right hand side value {4,abcd}

    Command 11 tries to match {P, Q, R} against Descriptor, which is {4, abc}. The match fails and none of the new variables become bound. The printout starting with "** exception error:" is not the value of the expression (the @@ -161,74 +161,74 @@ other variables (L, Str, and so on) are unchanged.

    12> P.
     * 1:1: variable 'P' is unbound
     13> Descriptor.
    -{4,abcd}

    Commands 12 and 13 show that P is unbound because the previous command failed, -and that Descriptor has not changed.

    14>{P, Q} = Descriptor.
    -{4,abcd}
    +{4,abcd}

    Commands 12 and 13 show that P is unbound because the previous command failed, +and that Descriptor has not changed.

    14>{P, Q} = Descriptor.
    +{4,abcd}
     15> P.
    -4

    Commands 14 and 15 show a correct match where P and Q are bound.

    16> f().
    -ok

    Command 16 clears all bindings.

    The next few commands assume that test1:demo(X) is defined as follows:

    demo(X) ->
    -    put(aa, worked),
    +4

    Commands 14 and 15 show a correct match where P and Q are bound.

    16> f().
    +ok

    Command 16 clears all bindings.

    The next few commands assume that test1:demo(X) is defined as follows:

    demo(X) ->
    +    put(aa, worked),
         X = 1,
    -    X + 10.
    17> put(aa, hello).
    +    X + 10.
    17> put(aa, hello).
     undefined
    -18> get(aa).
    +18> get(aa).
     hello

    Commands 17 and 18 set and inspect the value of item aa in the process -dictionary.

    19> Y = test1:demo(1).
    +dictionary.

    19> Y = test1:demo(1).
     11

    Command 19 evaluates test1:demo(1). The evaluation succeeds and the changes made in the process dictionary become visible to the shell. The new value of -dictionary item aa can be seen in command 20.

    20> get().
    -[{aa,worked}]
    -21> put(aa, hello).
    +dictionary item aa can be seen in command 20.

    20> get().
    +[{aa,worked}]
    +21> put(aa, hello).
     worked
    -22> Z = test1:demo(2).
    +22> Z = test1:demo(2).
     ** exception error: no match of right hand side value 1
          in function  test1:demo/1

    Commands 21 and 22 change the value of dictionary item aa to hello and call test1:demo(2). Evaluation fails and the changes made to the dictionary in test1:demo(2), before the error occurred, are discarded.

    23> Z.
     * 1:1: variable 'Z' is unbound
    -24> get(aa).
    +24> get(aa).
     hello

    Commands 23 and 24 show that Z was not bound and that dictionary item aa has -retained its original value.

    25> erase(), put(aa, hello).
    +retained its original value.

    25> erase(), put(aa, hello).
     undefined
    -26> spawn(test1, demo, [1]).
    +26> spawn(test1, demo, [1]).
     <0.57.0>
    -27> get(aa).
    +27> get(aa).
     hello

    Commands 25, 26, and 27 show the effect of evaluating test1:demo(1) in the background. In this case, the expression is evaluated in a newly spawned process. Any changes made in the process dictionary are local to the newly -spawned process and therefore not visible to the shell.

    28> io:format("hello hello\n").
    +spawned process and therefore not visible to the shell.

    28> io:format("hello hello\n").
     hello hello
     ok
    -29> e(28).
    +29> e(28).
     hello hello
     ok
    -30> v(28).
    +30> v(28).
     ok

    Commands 28, 29 and 30 use the history facilities of the shell. Command 29 re-evaluates command 28. Command 30 uses the value (result) of command 28. In the cases of a pure function (a function with no side effects), the result is the same. For a function with side effects, the result can be different.

    The next few commands show some record manipulation. It is assumed that ex.erl -defines a record as follows:

    -record(rec, {a, b = val()}).

    val() ->
        3.

    31> c(ex).
    -{ok,ex}
    -32> rr(ex).
    -[rec]

    Commands 31 and 32 compile file ex.erl and read the record definitions in +defines a record as follows:

    -record(rec, {a, b = val()}).

    val() ->
        3.

    31> c(ex).
    +{ok,ex}
    +32> rr(ex).
    +[rec]

    Commands 31 and 32 compile file ex.erl and read the record definitions in ex.beam. If the compiler did not output any record definitions on the BEAM -file, rr(ex) tries to read record definitions from the source file instead.

    33> rl(rec).
    --record(rec,{a,b = val()}).
    -ok

    Command 33 prints the definition of the record named rec.

    34> #rec{}.
    +file, rr(ex) tries to read record definitions from the source file instead.

    33> rl(rec).
    +-record(rec,{a,b = val()}).
    +ok

    Command 33 prints the definition of the record named rec.

    34> #rec{}.
     ** exception error: undefined shell command val/0

    Command 34 tries to create a rec record, but fails as function val/0 is -undefined.

    35> #rec{b = 3}.
    -#rec{a = undefined,b = 3}

    Command 35 shows the workaround: explicitly assign values to record fields that -cannot otherwise be initialized.

    36> rp(v(-1)).
    -#rec{a = undefined,b = 3}
    +undefined.

    35> #rec{b = 3}.
    +#rec{a = undefined,b = 3}

    Command 35 shows the workaround: explicitly assign values to record fields that +cannot otherwise be initialized.

    36> rp(v(-1)).
    +#rec{a = undefined,b = 3}
     ok

    Command 36 prints the newly created record using record definitions maintained -by the shell.

    37> rd(rec, {f = orddict:new()}).
    +by the shell.

    37> rd(rec, {f = orddict:new()}).
     rec

    Command 37 defines a record directly in the shell. The definition replaces the -one read from file ex.beam.

    38> #rec{}.
    -#rec{f = []}
    -ok

    Command 38 creates a record using the new definition, and prints the result.

    39> rd(rec, {c}), A.
    +one read from file ex.beam.

    38> #rec{}.
    +#rec{f = []}
    +ok

    Command 38 creates a record using the new definition, and prints the result.

    39> rd(rec, {c}), A.
     * 1:15: variable 'A' is unbound
    -40> #rec{}.
    -#rec{c = undefined}
    +40> #rec{}.
    +#rec{c = undefined}
     ok

    Command 39 and 40 show that record definitions are updated as side effects. The evaluation of the command fails, but the definition of rec has been carried out.

    For the next command, it is assumed that test1:loop(N) is defined as follows:

    loop(N) ->
        io:format("Hello Number: ~w~n", [N]),
        loop(N+1).

    41> test1:loop(0).
    @@ -254,31 +254,31 @@
     JCL mode the user can start and stop jobs.

    In this particular case, command i ("interrupt") terminates the looping program, and command c connects to the shell again. As the process was running in the background before we killed it, more printouts occur before message -"** exception exit: killed" is shown.

    42> E = ets:new(t, []).
    -#Ref<0.1662103692.2407923716.214192>

    Command 42 creates an ETS table.

    43> ets:insert({d,1,2}).
    +"** exception exit: killed" is shown.

    42> E = ets:new(t, []).
    +#Ref<0.1662103692.2407923716.214192>

    Command 42 creates an ETS table.

    43> ets:insert({d,1,2}).
     ** exception error: undefined function ets:insert/1

    Command 43 tries to insert a tuple into the ETS table, but the first argument -(the table) is missing. The exception kills the evaluator process.

    44> ets:insert(E, {d,1,2}).
    +(the table) is missing. The exception kills the evaluator process.

    44> ets:insert(E, {d,1,2}).
     ** exception error: argument is of wrong type
          in function  ets:insert/2
             called as ets:insert(16,{d,1,2})

    Command 44 corrects the mistake, but the ETS table has been destroyed as it was -owned by the killed evaluator process.

    45> f(E).
    +owned by the killed evaluator process.

    45> f(E).
     ok
    -46> catch_exception(true).
    +46> catch_exception(true).
     false

    Command 46 sets the exception handling of the evaluator process to true. The exception handling can also be set when starting Erlang by -erl -stdlib shell_catch_exception true.

    47> E = ets:new(t, []).
    +erl -stdlib shell_catch_exception true.

    47> E = ets:new(t, []).
     #Ref<0.1662103692.2407923716.214197>
    -48> ets:insert({d,1,2}).
    +48> ets:insert({d,1,2}).
     * exception error: undefined function ets:insert/1

    Command 48 makes the same mistake as in command 43, but this time the evaluator process lives on. The single star at the beginning of the printout signals that -the exception has been caught.

    49> ets:insert(E, {d,1,2}).
    -true

    Command 49 successfully inserts the tuple into the ETS table.

    50> ets:insert(#Ref<0.1662103692.2407923716.214197>, {e,3,4}).
    +the exception has been caught.

    49> ets:insert(E, {d,1,2}).
    +true

    Command 49 successfully inserts the tuple into the ETS table.

    50> ets:insert(#Ref<0.1662103692.2407923716.214197>, {e,3,4}).
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/shell_default.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/shell_default.xhtml	2025-05-10 20:19:24.253327753 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/shell_default.xhtml	2025-05-10 20:19:24.293328116 +0000
    @@ -24,10 +24,10 @@
     
           

    Customizing the Erlang environment.

    The functions in this module are called when no module name is specified in a -shell command.

    Consider the following shell dialog:

    1> lists:reverse("abc").
    +shell command.

    Consider the following shell dialog:

    1> lists:reverse("abc").
     "cba"
    -2> c(foo).
    -{ok, foo}

    In command one, module lists is called. In command two, no module name is +2> c(foo). +{ok, foo}

    In command one, module lists is called. In command two, no module name is specified. The shell searches module user_default followed by module shell_default for function c/1.

    shell_default is intended for "system wide" customizations to the shell. user_default is intended for "local" or individual user customizations.

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/slave.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/slave.xhtml 2025-05-10 20:19:24.253327753 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/slave.xhtml 2025-05-10 20:19:24.293328116 +0000 @@ -259,7 +259,7 @@ at a master node. A pseudo server is an intermediary that only has the same registered name as the real server.

    For example, if you have started a slave node N and want to execute pxw graphics code on this node, you can start server pxw_server as a pseudo server -at the slave node. This is illustrated as follows:

    rpc:call(N, slave, pseudo, [node(), [pxw_server]]).
    +at the slave node. This is illustrated as follows:

    rpc:call(N, slave, pseudo, [node(), [pxw_server]]).

    @@ -413,9 +413,9 @@ passed to the new node and can be used for a variety of purposes; see erl(1).

    As an example, suppose that you want to start a slave node at host H with node name Name@H and want the slave node to have the following properties:

    • Directory Dir is to be added to the code path.
    • The Mnesia directory is to be set to M.
    • The Unix DISPLAY environment variable is to be set to the display of the -master node.

    The following code is executed to achieve this:

    E = " -env DISPLAY " ++ net_adm:localhost() ++ ":0 ",
    +master node.

    The following code is executed to achieve this:

    E = " -env DISPLAY " ++ net_adm:localhost() ++ ":0 ",
     Arg = "-mnesia_dir " ++ M ++ " -pa " ++ Dir ++ E,
    -slave:start(H, Name, Arg).

    The function returns {ok, Node}, where Node is the name of the new node, +slave:start(H, Name, Arg).

    The function returns {ok, Node}, where Node is the name of the new node, otherwise {error, Reason}, where Reason can be one of:

    • timeout - The master node failed to get in contact with the slave node. This can occur in a number of circumstances:

      • Erlang/OTP is not installed on the remote host.
      • The file system on the other host has a different structure to the the master.
      • The Erlang nodes have different cookies.
    • no_rsh - No remote shell program was found on the computer. Note that /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/sofs.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/sofs.xhtml 2025-05-10 20:19:24.249327717 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/sofs.xhtml 2025-05-10 20:19:24.293328116 +0000 @@ -157,11 +157,11 @@ selecting, duplicating, or rearranging parts of the elements.

    • Specifying a SetFun as an integer I is equivalent to specifying {external, fun(X) -> element(I, X) end}, but is to be preferred, as it makes it possible to handle this case even more efficiently.

    Examples of SetFuns:

    fun sofs:union/1
    -fun(S) -> sofs:partition(1, S) end
    -{external, fun(A) -> A end}
    -{external, fun({A,_,C}) -> {C,A} end}
    -{external, fun({_,{_,C}}) -> C end}
    -{external, fun({_,{_,{_,E}=C}}) -> {E,{E,C}} end}
    +fun(S) -> sofs:partition(1, S) end
    +{external, fun(A) -> A end}
    +{external, fun({A,_,C}) -> {C,A} end}
    +{external, fun({_,{_,C}}) -> C end}
    +{external, fun({_,{_,{_,E}=C}}) -> {E,{E,C}} end}
     2

    The order in which a SetFun is applied to the elements of an unordered set is not specified, and can change in future versions of this module.

    The execution time of the functions of this module is dominated by the time it takes to sort lists. When no sorting is needed, the execution time is in the @@ -1711,10 +1711,10 @@ belongs to SetOfSets and E belongs to Set.

    If SetOfSets is a partition of a set X and R is the equivalence relation in X induced by SetOfSets, then the returned relation is the canonical map from X onto the equivalence classes with -respect to R.

    1> Ss = sofs:from_term([[a,b],[b,c]]),
    -CR = sofs:canonical_relation(Ss),
    -sofs:to_external(CR).
    -[{a,[a,b]},{b,[a,b]},{b,[b,c]},{c,[b,c]}]
    +respect to R.

    1> Ss = sofs:from_term([[a,b],[b,c]]),
    +CR = sofs:canonical_relation(Ss),
    +sofs:to_external(CR).
    +[{a,[a,b]},{b,[a,b]},{b,[b,c]},{c,[b,c]}]
    @@ -1744,11 +1744,11 @@

    Returns the composite of the functions Function1 and -Function2.

    1> F1 = sofs:a_function([{a,1},{b,2},{c,2}]),
    -F2 = sofs:a_function([{1,x},{2,y},{3,z}]),
    -F = sofs:composite(F1, F2),
    -sofs:to_external(F).
    -[{a,x},{b,y},{c,y}]
    +Function2.

    1> F1 = sofs:a_function([{a,1},{b,2},{c,2}]),
    +F2 = sofs:a_function([{1,x},{2,y},{3,z}]),
    +F = sofs:composite(F1, F2),
    +sofs:to_external(F).
    +[{a,x},{b,y},{c,y}]
    @@ -1778,11 +1778,11 @@

    Creates the function that maps each element of set Set -onto AnySet.

    1> S = sofs:set([a,b]),
    -E = sofs:from_term(1),
    -R = sofs:constant_function(S, E),
    -sofs:to_external(R).
    -[{a,1},{b,1}]
    +onto AnySet.

    1> S = sofs:set([a,b]),
    +E = sofs:from_term(1),
    +R = sofs:constant_function(S, E),
    +sofs:to_external(R).
    +[{a,1},{b,1}]
    @@ -1810,10 +1810,10 @@ -

    Returns the converse of the binary relation BinRel1.

    1> R1 = sofs:relation([{1,a},{2,b},{3,a}]),
    -R2 = sofs:converse(R1),
    -sofs:to_external(R2).
    -[{a,1},{a,3},{b,2}]
    +

    Returns the converse of the binary relation BinRel1.

    1> R1 = sofs:relation([{1,a},{2,b},{3,a}]),
    +R2 = sofs:converse(R1),
    +sofs:to_external(R2).
    +[{a,1},{a,3},{b,2}]
    @@ -1931,10 +1931,10 @@ -

    Returns the domain of the binary relation BinRel.

    1> R = sofs:relation([{1,a},{1,b},{2,b},{2,c}]),
    -S = sofs:domain(R),
    -sofs:to_external(S).
    -[1,2]
    +

    Returns the domain of the binary relation BinRel.

    1> R = sofs:relation([{1,a},{1,b},{2,b},{2,c}]),
    +S = sofs:domain(R),
    +sofs:to_external(S).
    +[1,2]
    @@ -1964,11 +1964,11 @@

    Returns the difference between the binary relation BinRel1 and the -restriction of BinRel1 to Set.

    1> R1 = sofs:relation([{1,a},{2,b},{3,c}]),
    -S = sofs:set([2,4,6]),
    -R2 = sofs:drestriction(R1, S),
    -sofs:to_external(R2).
    -[{1,a},{3,c}]

    drestriction(R, S) is equivalent to +restriction of BinRel1 to Set.

    1> R1 = sofs:relation([{1,a},{2,b},{3,c}]),
    +S = sofs:set([2,4,6]),
    +R2 = sofs:drestriction(R1, S),
    +sofs:to_external(R2).
    +[{1,a},{3,c}]

    drestriction(R, S) is equivalent to difference(R, restriction(R, S)).

    @@ -1999,12 +1999,12 @@

    Returns a subset of Set1 containing those elements that do not give an element -in Set2 as the result of applying SetFun.

    1> SetFun = {external, fun({_A,B,C}) -> {B,C} end},
    -R1 = sofs:relation([{a,aa,1},{b,bb,2},{c,cc,3}]),
    -R2 = sofs:relation([{bb,2},{cc,3},{dd,4}]),
    -R3 = sofs:drestriction(SetFun, R1, R2),
    -sofs:to_external(R3).
    -[{a,aa,1}]

    drestriction(F, S1, S2) is equivalent to +in Set2 as the result of applying SetFun.

    1> SetFun = {external, fun({_A,B,C}) -> {B,C} end},
    +R1 = sofs:relation([{a,aa,1},{b,bb,2},{c,cc,3}]),
    +R2 = sofs:relation([{bb,2},{cc,3},{dd,4}]),
    +R3 = sofs:drestriction(SetFun, R1, R2),
    +sofs:to_external(R3).
    +[{a,aa,1}]

    drestriction(F, S1, S2) is equivalent to difference(S1, restriction(F, S1, S2)).

    @@ -2069,12 +2069,12 @@

    Returns the extension of BinRel1 such that for each element E in Set that does not belong to the domain of -BinRel1, BinRel2 contains the pair (E, AnySet).

    1> S = sofs:set([b,c]),
    -A = sofs:empty_set(),
    -R = sofs:family([{a,[1,2]},{b,[3]}]),
    -X = sofs:extension(R, S, A),
    -sofs:to_external(X).
    -[{a,[1,2]},{b,[3]},{c,[]}]
    +BinRel1, BinRel2 contains the pair (E, AnySet).

    1> S = sofs:set([b,c]),
    +A = sofs:empty_set(),
    +R = sofs:family([{a,[1,2]},{b,[3]}]),
    +X = sofs:extension(R, S, A),
    +sofs:to_external(X).
    +[{a,[1,2]},{b,[3]},{c,[]}]
    @@ -2163,11 +2163,11 @@

    If Family1 and Family2 are families, then Family3 is the family such that the index set is equal to the index set of Family1, and Family3[i] is the difference between Family1[i] and Family2[i] if -Family2 maps i, otherwise Family1[i].

    1> F1 = sofs:family([{a,[1,2]},{b,[3,4]}]),
    -F2 = sofs:family([{b,[4,5]},{c,[6,7]}]),
    -F3 = sofs:family_difference(F1, F2),
    -sofs:to_external(F3).
    -[{a,[1,2]},{b,[3]}]
    +Family2 maps i, otherwise Family1[i].

    1> F1 = sofs:family([{a,[1,2]},{b,[3,4]}]),
    +F2 = sofs:family([{b,[4,5]},{c,[6,7]}]),
    +F3 = sofs:family_difference(F1, F2),
    +sofs:to_external(F3).
    +[{a,[1,2]},{b,[3]}]
    @@ -2198,10 +2198,10 @@

    If Family1 is a family and Family1[i] is a binary relation for every i in the index set of Family1, then Family2 is the family with the same index set as Family1 such that Family2[i] is the -domain of Family1[i].

    1> FR = sofs:from_term([{a,[{1,a},{2,b},{3,c}]},{b,[]},{c,[{4,d},{5,e}]}]),
    -F = sofs:family_domain(FR),
    -sofs:to_external(F).
    -[{a,[1,2,3]},{b,[]},{c,[4,5]}]
    +domain of Family1[i].

    1> FR = sofs:from_term([{a,[{1,a},{2,b},{3,c}]},{b,[]},{c,[{4,d},{5,e}]}]),
    +F = sofs:family_domain(FR),
    +sofs:to_external(F).
    +[{a,[1,2,3]},{b,[]},{c,[4,5]}]
    @@ -2232,10 +2232,10 @@

    If Family1 is a family and Family1[i] is a binary relation for every i in the index set of Family1, then Family2 is the family with the same index set as Family1 such that Family2[i] is the -field of Family1[i].

    1> FR = sofs:from_term([{a,[{1,a},{2,b},{3,c}]},{b,[]},{c,[{4,d},{5,e}]}]),
    -F = sofs:family_field(FR),
    -sofs:to_external(F).
    -[{a,[1,2,3,a,b,c]},{b,[]},{c,[4,5,d,e]}]

    family_field(Family1) is equivalent to +field of Family1[i].

    1> FR = sofs:from_term([{a,[{1,a},{2,b},{3,c}]},{b,[]},{c,[{4,d},{5,e}]}]),
    +F = sofs:family_field(FR),
    +sofs:to_external(F).
    +[{a,[1,2,3,a,b,c]},{b,[]},{c,[4,5,d,e]}]

    family_field(Family1) is equivalent to family_union(family_domain(Family1), family_range(Family1)).

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/stdlib_app.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/stdlib_app.xhtml 2025-05-10 20:19:24.249327717 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/stdlib_app.xhtml 2025-05-10 20:19:24.289328080 +0000 @@ -56,13 +56,13 @@ prompt function takes the main prompt as its only parameter.

  • shell_saved_results = integer() >= 0 - Can be used to determine how many results are saved by the Erlang shell.

  • shell_session_slogan = string() | fun() -> string()) - The slogan printed when starting an Erlang shell. Example:

    $ erl -stdlib shell_session_slogan '"Test slogan"'
    -Erlang/OTP 26 [DEVELOPMENT] [erts-13.0.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]
    +Erlang/OTP 26 [DEVELOPMENT] [erts-13.0.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]
     
     Test slogan
     1>
  • shell_slogan = string() | fun(() -> string()) - The slogan printed when starting the Erlang shell subsystem. Example:

    $ erl -stdlib shell_slogan '"Test slogan"'
     Test slogan
    -Eshell V13.0.2  (abort with ^G)
    +Eshell V13.0.2  (abort with ^G)
     1>

    The default is the return value of erlang:system_info(system_version).

  • shell_strings = boolean() - Can be used to determine how the Erlang shell outputs lists of integers.

  • /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/string.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/string.xhtml 2025-05-10 20:19:24.249327717 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/string.xhtml 2025-05-10 20:19:24.289328080 +0000 @@ -44,14 +44,14 @@ expect UTF-8 binaries but not all functions verify that all binaries are encoded correctly.

    Unless otherwise specified the return value type is the same as the input type. That is, binary input returns binary output, list input returns a list output, -and mixed input can return a mixed output.

    1> string:trim("  sarah  ").
    +and mixed input can return a mixed output.

    1> string:trim("  sarah  ").
     "sarah"
    -2> string:trim(<<"  sarah  ">>).
    +2> string:trim(<<"  sarah  ">>).
     <<"sarah">>
    -3> string:lexemes("foo bar", " ").
    -["foo","bar"]
    -4> string:lexemes(<<"foo bar">>, " ").
    -[<<"foo">>,<<"bar">>]

    This module has been reworked in Erlang/OTP 20 to handle unicode:chardata/0 +3> string:lexemes("foo bar", " "). +["foo","bar"] +4> string:lexemes(<<"foo bar">>, " "). +[<<"foo">>,<<"bar">>]

    This module has been reworked in Erlang/OTP 20 to handle unicode:chardata/0 and operate on grapheme clusters. The old functions that only work on Latin-1 lists as input are still available but should not be used, they will be @@ -951,7 +951,7 @@

    Converts String to a case-agnostic comparable string. Function casefold/1 is preferred over lowercase/1 -when two strings are to be compared for equality. See also equal/4.

    Example:

    1> string:casefold("Ω and ẞ SHARP S").
    +when two strings are to be compared for equality. See also equal/4.

    Example:

    1> string:casefold("Ω and ẞ SHARP S").
     "ω and ss sharp s"
    @@ -983,9 +983,9 @@

    Returns a string where any trailing \n or \r\n have been removed from -String.

    Example:

    182> string:chomp(<<"\nHello\n\n">>).
    +String.

    Example:

    182> string:chomp(<<"\nHello\n\n">>).
     <<"\nHello">>
    -183> string:chomp("\nHello\r\r\n").
    +183> string:chomp("\nHello\r\r\n").
     "\nHello\r"
    @@ -1086,11 +1086,11 @@ nfc, nfd, nfkc, and -nfkd.

    Example:

    1> string:equal("åäö", <<"åäö"/utf8>>).
    +nfkd.

    Example:

    1> string:equal("åäö", <<"åäö"/utf8>>).
     true
    -2> string:equal("åäö", unicode:characters_to_nfd_binary("åäö")).
    +2> string:equal("åäö", unicode:characters_to_nfd_binary("åäö")).
     false
    -3> string:equal("åäö", unicode:characters_to_nfd_binary("ÅÄÖ"), true, nfc).
    +3> string:equal("åäö", unicode:characters_to_nfd_binary("ÅÄÖ"), true, nfc).
     true
    @@ -1156,13 +1156,13 @@

    Removes anything before SearchPattern in String and returns the remainder of the string or nomatch if SearchPattern is not found. Dir, which can be leading or trailing, indicates from which direction characters are to be -searched.

    Example:

    1> string:find("ab..cd..ef", ".").
    +searched.

    Example:

    1> string:find("ab..cd..ef", ".").
     "..cd..ef"
    -2> string:find(<<"ab..cd..ef">>, "..", trailing).
    +2> string:find(<<"ab..cd..ef">>, "..", trailing).
     <<"..ef">>
    -3> string:find(<<"ab..cd..ef">>, "x", leading).
    +3> string:find(<<"ab..cd..ef">>, "x", leading).
     nomatch
    -4> string:find("ab..cd..ef", "x", trailing).
    +4> string:find("ab..cd..ef", "x", trailing).
     nomatch
    @@ -1193,9 +1193,9 @@ -

    Returns true if String is the empty string, otherwise false.

    Example:

    1> string:is_empty("foo").
    +

    Returns true if String is the empty string, otherwise false.

    Example:

    1> string:is_empty("foo").
     false
    -2> string:is_empty(["",<<>>]).
    +2> string:is_empty(["",<<>>]).
     true
    @@ -1233,13 +1233,13 @@

    Returns a float between +0.0 and 1.0 representing the Jaro similarity between the given strings. Strings with a higher similarity will score closer -to 1.0, with +0.0 meaning no similarity and 1.0 meaning an exact match.

    Example:

    1> string:jaro_similarity("ditto", "ditto").
    +to 1.0, with +0.0 meaning no similarity and 1.0 meaning an exact match.

    Example:

    1> string:jaro_similarity("ditto", "ditto").
     1.0
    -2> string:jaro_similarity("foo", "bar").
    +2> string:jaro_similarity("foo", "bar").
     +0.0
    -3> string:jaro_similarity("michelle", "michael").
    +3> string:jaro_similarity("michelle", "michael").
     0.8690476190476191
    -4> string:jaro_similarity(<<"Édouard"/utf8>>, <<"Claude">>).
    +4> string:jaro_similarity(<<"Édouard"/utf8>>, <<"Claude">>).
     0.5317460317460317

    The Jaro distance between two strings can be calculated with JaroDistance = 1.0 - JaroSimilarity.

    @@ -1271,9 +1271,9 @@ -

    Returns the number of grapheme clusters in String.

    Example:

    1> string:length("ß↑e̊").
    +

    Returns the number of grapheme clusters in String.

    Example:

    1> string:length("ß↑e̊").
     3
    -2> string:length(<<195,159,226,134,145,101,204,138>>).
    +2> string:length(<<195,159,226,134,145,101,204,138>>).
     3
    @@ -1308,10 +1308,10 @@

    Returns a list of lexemes in String, separated by the grapheme clusters in SeparatorList.

    Notice that, as shown in this example, two or more adjacent separator graphemes clusters in String are treated as one. That is, there are no empty strings in -the resulting list of lexemes. See also split/3 which returns empty strings.

    Notice that [$\r,$\n] is one grapheme cluster.

    Example:

    1> string:lexemes("abc de̊fxxghix jkl\r\nfoo", "x e" ++ [[$\r,$\n]]).
    -["abc","de̊f","ghi","jkl","foo"]
    -2> string:lexemes(<<"abc de̊fxxghix jkl\r\nfoo"/utf8>>, "x e" ++ [$\r,$\n]).
    -[<<"abc">>,<<"de̊f"/utf8>>,<<"ghi">>,<<"jkl\r\nfoo">>]
    +the resulting list of lexemes. See also split/3 which returns empty strings.

    Notice that [$\r,$\n] is one grapheme cluster.

    Example:

    1> string:lexemes("abc de̊fxxghix jkl\r\nfoo", "x e" ++ [[$\r,$\n]]).
    +["abc","de̊f","ghi","jkl","foo"]
    +2> string:lexemes(<<"abc de̊fxxghix jkl\r\nfoo"/utf8>>, "x e" ++ [$\r,$\n]).
    +[<<"abc">>,<<"de̊f"/utf8>>,<<"ghi">>,<<"jkl\r\nfoo">>]
    @@ -1342,7 +1342,7 @@

    Converts String to lowercase.

    Notice that function casefold/1 should be used when converting a string to be -tested for equality.

    Example:

    2> string:lowercase(string:uppercase("Michał")).
    +tested for equality.

    Example:

    2> string:lowercase(string:uppercase("Michał")).
     "michał"
    @@ -1376,8 +1376,8 @@

    Returns the first codepoint in String and the rest of String in the tail. Returns an empty list if String is empty or an {error, String} tuple if the -next byte is invalid.

    Example:

    1> string:next_codepoint(unicode:characters_to_binary("e̊fg")).
    -[101|<<"̊fg"/utf8>>]
    +next byte is invalid.

    Example:

    1> string:next_codepoint(unicode:characters_to_binary("e̊fg")).
    +[101|<<"̊fg"/utf8>>]
    @@ -1411,8 +1411,8 @@

    Returns the first grapheme cluster in String and the rest of String in the tail. Returns an empty list if String is empty or an {error, String} tuple -if the next byte is invalid.

    Example:

    1> string:next_grapheme(unicode:characters_to_binary("e̊fg")).
    -["e̊"|<<"fg">>]
    +if the next byte is invalid.

    Example:

    1> string:next_grapheme(unicode:characters_to_binary("e̊fg")).
    +["e̊"|<<"fg">>]
    @@ -1447,7 +1447,7 @@

    Returns lexeme number N in String, where lexemes are separated by the -grapheme clusters in SeparatorList.

    Example:

    1> string:nth_lexeme("abc.de̊f.ghiejkl", 3, ".e").
    +grapheme clusters in SeparatorList.

    Example:

    1> string:nth_lexeme("abc.de̊f.ghiejkl", 3, ".e").
     "ghi"
    @@ -1545,11 +1545,11 @@

    Pads String to Length with grapheme cluster Char. Dir, which can be -leading, trailing, or both, indicates where the padding should be added.

    Example:

    1> string:pad(<<"He̊llö"/utf8>>, 8).
    -[<<72,101,204,138,108,108,195,182>>,32,32,32]
    -2> io:format("'~ts'~n",[string:pad("He̊llö", 8, leading)]).
    +leading, trailing, or both, indicates where the padding should be added.

    Example:

    1> string:pad(<<"He̊llö"/utf8>>, 8).
    +[<<72,101,204,138,108,108,195,182>>,32,32,32]
    +2> io:format("'~ts'~n",[string:pad("He̊llö", 8, leading)]).
     '   He̊llö'
    -3> io:format("'~ts'~n",[string:pad("He̊llö", 8, both)]).
    +3> io:format("'~ts'~n",[string:pad("He̊llö", 8, both)]).
     ' He̊llö  '
    @@ -1581,9 +1581,9 @@

    If Prefix is the prefix of String, removes it and returns the remainder of -String, otherwise returns nomatch.

    Example:

    1> string:prefix(<<"prefix of string">>, "pre").
    +String, otherwise returns nomatch.

    Example:

    1> string:prefix(<<"prefix of string">>, "pre").
     <<"fix of string">>
    -2> string:prefix("pre", "prefix").
    +2> string:prefix("pre", "prefix").
     nomatch
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/supervisor.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/supervisor.xhtml 2025-05-10 20:19:24.249327717 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/supervisor.xhtml 2025-05-10 20:19:24.289328080 +0000 @@ -53,10 +53,10 @@ Supervisor flags

    The supervisor properties are defined by the supervisor flags. The type -definition for the supervisor flags is as follows:

    sup_flags() = #{strategy => strategy(),           % optional
    -                intensity => non_neg_integer(),   % optional
    -                period => pos_integer(),          % optional
    -                auto_shutdown => auto_shutdown()} % optional

    Restart Strategies

    A supervisor can have one of the following restart strategies specified with +definition for the supervisor flags is as follows:

    sup_flags() = #{strategy => strategy(),           % optional
    +                intensity => non_neg_integer(),   % optional
    +                period => pos_integer(),          % optional
    +                auto_shutdown => auto_shutdown()} % optional

    Restart Strategies

    A supervisor can have one of the following restart strategies specified with the strategy key in the above map:

    • one_for_one - If one child process terminates and is to be restarted, only that child process is affected. This is the default restart strategy.

    • one_for_all - If one child process terminates and is to be restarted, all other child processes are terminated and then all child processes are @@ -100,13 +100,13 @@ Child specification -

      The type definition of a child specification is as follows:

      child_spec() = #{id => child_id(),             % mandatory
      -                 start => mfargs(),            % mandatory
      -                 restart => restart(),         % optional
      -                 significant => significant(), % optional
      -                 shutdown => shutdown(),       % optional
      -                 type => worker(),             % optional
      -                 modules => modules()}         % optional

      The old tuple format is kept for backwards compatibility, see child_spec/0, +

      The type definition of a child specification is as follows:

      child_spec() = #{id => child_id(),             % mandatory
      +                 start => mfargs(),            % mandatory
      +                 restart => restart(),         % optional
      +                 significant => significant(), % optional
      +                 shutdown => shutdown(),       % optional
      +                 type => worker(),             % optional
      +                 modules => modules()}         % optional

      The old tuple format is kept for backwards compatibility, see child_spec/0, but the map is preferred.

      • id is used to identify the child specification internally by the supervisor.

        The id key is mandatory.

        Notice that this identifier on occations has been called "name". As far as possible, the terms "identifier" or "id" are now used but to keep backward compatibility, some occurences of "name" can still be found, for example in /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/timer.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/timer.xhtml 2025-05-10 20:19:24.249327717 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/timer.xhtml 2025-05-10 20:19:24.289328080 +0000 @@ -41,15 +41,15 @@ Examples -

        Example 1

        The following example shows how to print "Hello World!" in 5 seconds:

        1> timer:apply_after(5000, io, format, ["~nHello World!~n", []]).
        -{ok,TRef}
        +

        Example 1

        The following example shows how to print "Hello World!" in 5 seconds:

        1> timer:apply_after(5000, io, format, ["~nHello World!~n", []]).
        +{ok,TRef}
         Hello World!

        Example 2

        The following example shows a process performing a certain action, and if this -action is not completed within a certain limit, the process is killed:

        Pid = spawn(mod, fun, [foo, bar]),
        +action is not completed within a certain limit, the process is killed:

        Pid = spawn(mod, fun, [foo, bar]),
         %% If pid is not finished in 10 seconds, kill him
        -{ok, R} = timer:kill_after(timer:seconds(10), Pid),
        +{ok, R} = timer:kill_after(timer:seconds(10), Pid),
         ...
         %% We change our mind...
        -timer:cancel(R),
        +timer:cancel(R),
         ...

        @@ -76,20 +76,20 @@ process which set the timer about its completion, by sending it a done message.

        Using self/0 inside the timed function, the code below does not work as intended. The task gets done, but the done message gets sent to the wrong -process and is lost.

        1> timer:apply_after(1000, fun() -> do_something(), self() ! done end).
        -{ok,TRef}
        +process and is lost.

        1> timer:apply_after(1000, fun() -> do_something(), self() ! done end).
        +{ok,TRef}
         2> receive done -> done after 5000 -> timeout end.
         %% ... 5s pass...
         timeout

        The code below calls self/0 in the process which sets the timer and assigns it to a variable, which is then used in the function to send the done message to, -and so works as intended.

        1> Target = self()
        +and so works as intended.

        1> Target = self()
         <0.82.0>
        -2> timer:apply_after(1000, fun() -> do_something(), Target ! done end).
        -{ok,TRef}
        +2> timer:apply_after(1000, fun() -> do_something(), Target ! done end).
        +{ok,TRef}
         3> receive done -> done after 5000 -> timeout end.
         %% ... 1s passes...
        -done

        Another option is to pass the message target as a parameter to the function.

        1> timer:apply_after(1000, fun(Target) -> do_something(), Target ! done end, [self()]).
        -{ok,TRef}
        +done

        Another option is to pass the message target as a parameter to the function.

        1> timer:apply_after(1000, fun(Target) -> do_something(), Target ! done end, [self()]).
        +{ok,TRef}
         2> receive done -> done after 5000 -> timeout end.
         %% ... 1s passes...
         done
        /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/unicode.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/unicode.xhtml 2025-05-10 20:19:24.245327681 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/unicode.xhtml 2025-05-10 20:19:24.289328080 +0000 @@ -950,13 +950,13 @@ the first part of a (so far) valid UTF character.

        If one UTF character is split over two consecutive binaries in the Data, the conversion succeeds. This means that a character can be decoded from a range of binaries as long as the whole range is specified as input without errors -occurring.

        Example:

        decode_data(Data) ->
        -   case unicode:characters_to_list(Data,unicode) of
        -      {incomplete,Encoded, Rest} ->
        -            More = get_some_more_data(),
        -            Encoded ++ decode_data([Rest, More]);
        -      {error,Encoded,Rest} ->
        -            handle_error(Encoded,Rest);
        +occurring.

        Example:

        decode_data(Data) ->
        +   case unicode:characters_to_list(Data,unicode) of
        +      {incomplete,Encoded, Rest} ->
        +            More = get_some_more_data(),
        +            Encoded ++ decode_data([Rest, More]);
        +      {error,Encoded,Rest} ->
        +            handle_error(Encoded,Rest);
               List ->
                     List
            end.

        However, bit strings that are not whole bytes are not allowed, so a UTF @@ -991,7 +991,7 @@

        Converts a possibly deep list of characters and binaries into a Normalized Form -of canonical equivalent Composed characters according to the Unicode standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is an utf8 encoded binary.

        4> unicode:characters_to_nfc_binary([<<"abc..a">>,[778],$a,[776],$o,[776]]).
        +of canonical equivalent Composed characters according to the Unicode standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is an utf8 encoded binary.

        4> unicode:characters_to_nfc_binary([<<"abc..a">>,[778],$a,[776],$o,[776]]).
         <<"abc..åäö"/utf8>>
        @@ -1023,7 +1023,7 @@

        Converts a possibly deep list of characters and binaries into a Normalized Form -of canonical equivalent Composed characters according to the Unicode standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is a list of characters.

        3> unicode:characters_to_nfc_list([<<"abc..a">>,[778],$a,[776],$o,[776]]).
        +of canonical equivalent Composed characters according to the Unicode standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is a list of characters.

        3> unicode:characters_to_nfc_list([<<"abc..a">>,[778],$a,[776],$o,[776]]).
         "abc..åäö"
        @@ -1055,7 +1055,7 @@

        Converts a possibly deep list of characters and binaries into a Normalized Form -of canonical equivalent Decomposed characters according to the Unicode standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is an utf8 encoded binary.

        2> unicode:characters_to_nfd_binary("abc..åäö").
        +of canonical equivalent Decomposed characters according to the Unicode standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is an utf8 encoded binary.

        2> unicode:characters_to_nfd_binary("abc..åäö").
         <<97,98,99,46,46,97,204,138,97,204,136,111,204,136>>
        @@ -1087,8 +1087,8 @@

        Converts a possibly deep list of characters and binaries into a Normalized Form -of canonical equivalent Decomposed characters according to the Unicode standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is a list of characters.

        1> unicode:characters_to_nfd_list("abc..åäö").
        -[97,98,99,46,46,97,778,97,776,111,776]
        +of canonical equivalent Decomposed characters according to the Unicode standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is a list of characters.

        1> unicode:characters_to_nfd_list("abc..åäö").
        +[97,98,99,46,46,97,778,97,776,111,776]
        @@ -1119,7 +1119,7 @@

        Converts a possibly deep list of characters and binaries into a Normalized Form -of compatibly equivalent Composed characters according to the Unicode standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is an utf8 encoded binary.

        4> unicode:characters_to_nfkc_binary([<<"abc..a">>,[778],$a,[776],$o,[776],[65299,65298]]).
        +of compatibly equivalent Composed characters according to the Unicode standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is an utf8 encoded binary.

        4> unicode:characters_to_nfkc_binary([<<"abc..a">>,[778],$a,[776],$o,[776],[65299,65298]]).
         <<"abc..åäö32"/utf8>>
        @@ -1151,7 +1151,7 @@

        Converts a possibly deep list of characters and binaries into a Normalized Form -of compatibly equivalent Composed characters according to the Unicode standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is a list of characters.

        3> unicode:characters_to_nfkc_list([<<"abc..a">>,[778],$a,[776],$o,[776],[65299,65298]]).
        +of compatibly equivalent Composed characters according to the Unicode standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is a list of characters.

        3> unicode:characters_to_nfkc_list([<<"abc..a">>,[778],$a,[776],$o,[776],[65299,65298]]).
         "abc..åäö32"
        @@ -1184,7 +1184,7 @@

        Converts a possibly deep list of characters and binaries into a Normalized Form of compatibly equivalent Decomposed characters according to the Unicode -standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is an utf8 encoded binary.

        2> unicode:characters_to_nfkd_binary(["abc..åäö",[65299,65298]]).
        +standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is an utf8 encoded binary.

        2> unicode:characters_to_nfkd_binary(["abc..åäö",[65299,65298]]).
         <<97,98,99,46,46,97,204,138,97,204,136,111,204,136,51,50>>
        @@ -1217,8 +1217,8 @@

        Converts a possibly deep list of characters and binaries into a Normalized Form of compatibly equivalent Decomposed characters according to the Unicode -standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is a list of characters.

        1> unicode:characters_to_nfkd_list(["abc..åäö",[65299,65298]]).
        -[97,98,99,46,46,97,778,97,776,111,776,51,50]
        +standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is a list of characters.

        1> unicode:characters_to_nfkd_list(["abc..åäö",[65299,65298]]).
        +[97,98,99,46,46,97,778,97,776,111,776,51,50]
        /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/unicode_usage.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/unicode_usage.xhtml 2025-05-10 20:19:24.245327681 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/unicode_usage.xhtml 2025-05-10 20:19:24.289328080 +0000 @@ -234,20 +234,20 @@ iolists, where binaries and lists can be combined to represent a sequence of bytes. In the same way, the Unicode-aware modules often allow for combinations of binaries and lists, where the binaries have characters encoded in UTF-8 and -the lists contain such binaries or numbers representing Unicode code points:

        unicode_binary() = binary() with characters encoded in UTF-8 coding standard
        +the lists contain such binaries or numbers representing Unicode code points:

        unicode_binary() = binary() with characters encoded in UTF-8 coding standard
         
        -chardata() = charlist() | unicode_binary()
        +chardata() = charlist() | unicode_binary()
         
        -charlist() = maybe_improper_list(char() | unicode_binary() | charlist(),
        -  unicode_binary() | nil())

        The module unicode even supports similar mixes with binaries containing +charlist() = maybe_improper_list(char() | unicode_binary() | charlist(), + unicode_binary() | nil())

        The module unicode even supports similar mixes with binaries containing other encodings than UTF-8, but that is a special case to allow for conversions -to and from external data:

        external_unicode_binary() = binary() with characters coded in a user-specified
        -  Unicode encoding other than UTF-8 (UTF-16 or UTF-32)
        +to and from external data:

        external_unicode_binary() = binary() with characters coded in a user-specified
        +  Unicode encoding other than UTF-8 (UTF-16 or UTF-32)
         
        -external_chardata() = external_charlist() | external_unicode_binary()
        +external_chardata() = external_charlist() | external_unicode_binary()
         
        -external_charlist() = maybe_improper_list(char() | external_unicode_binary() |
        -  external_charlist(), external_unicode_binary() | nil())

        +external_charlist() = maybe_improper_list(char() | external_unicode_binary() | + external_charlist(), external_unicode_binary() | nil())

        @@ -295,7 +295,7 @@

        In certain output functions and in the output of return values in the shell, Erlang tries to detect string data in lists and binaries heuristically. -Typically you will see heuristic detection in a situation like this:

        1> [97,98,99].
        +Typically you will see heuristic detection in a situation like this:

        1> [97,98,99].
         "abc"
         2> <<97,98,99>>.
         <<"abc">>
        @@ -315,27 +315,27 @@
         controls how heuristic string detection is done. More ranges are expected to be
         added in the future, enabling tailoring of the heuristics to the language and
         region relevant to the user.

        The following examples show the two startup options:

        $ erl +pc latin1
        -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
        +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
         
        -Eshell V5.10.1  (abort with ^G)
        -1> [1024].
        -[1024]
        -2> [1070,1085,1080,1082,1086,1076].
        -[1070,1085,1080,1082,1086,1076]
        -3> [229,228,246].
        +Eshell V5.10.1  (abort with ^G)
        +1> [1024].
        +[1024]
        +2> [1070,1085,1080,1082,1086,1076].
        +[1070,1085,1080,1082,1086,1076]
        +3> [229,228,246].
         "åäö"
         4> <<208,174,208,189,208,184,208,186,208,190,208,180>>.
         <<208,174,208,189,208,184,208,186,208,190,208,180>>
         5> <<229/utf8,228/utf8,246/utf8>>.
         <<"åäö"/utf8>>
        $ erl +pc unicode
        -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
        +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
         
        -Eshell V5.10.1  (abort with ^G)
        -1> [1024].
        +Eshell V5.10.1  (abort with ^G)
        +1> [1024].
         "Ѐ"
        -2> [1070,1085,1080,1082,1086,1076].
        +2> [1070,1085,1080,1082,1086,1076].
         "Юникод"
        -3> [229,228,246].
        +3> [229,228,246].
         "åäö"
         4> <<208,174,208,189,208,184,208,186,208,190,208,180>>.
         <<"Юникод"/utf8>>
        @@ -348,17 +348,17 @@
         outputs anything containing printable Unicode data (in binaries, either UTF-8 or
         bytewise encoded) as string data.

        These heuristics are also used by io:format/2, io_lib:format/2, and friends when modifier t is used with ~p or ~P:

        $ erl +pc latin1
        -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
        +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
         
        -Eshell V5.10.1  (abort with ^G)
        -1> io:format("~tp~n",[{<<"åäö">>, <<"åäö"/utf8>>, <<208,174,208,189,208,184,208,186,208,190,208,180>>}]).
        -{<<"åäö">>,<<"åäö"/utf8>>,<<208,174,208,189,208,184,208,186,208,190,208,180>>}
        +Eshell V5.10.1  (abort with ^G)
        +1> io:format("~tp~n",[{<<"åäö">>, <<"åäö"/utf8>>, <<208,174,208,189,208,184,208,186,208,190,208,180>>}]).
        +{<<"åäö">>,<<"åäö"/utf8>>,<<208,174,208,189,208,184,208,186,208,190,208,180>>}
         ok
        $ erl +pc unicode
        -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
        +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
         
        -Eshell V5.10.1  (abort with ^G)
        -1> io:format("~tp~n",[{<<"åäö">>, <<"åäö"/utf8>>, <<208,174,208,189,208,184,208,186,208,190,208,180>>}]).
        -{<<"åäö">>,<<"åäö"/utf8>>,<<"Юникод"/utf8>>}
        +Eshell V5.10.1  (abort with ^G)
        +1> io:format("~tp~n",[{<<"åäö">>, <<"åäö"/utf8>>, <<208,174,208,189,208,184,208,186,208,190,208,180>>}]).
        +{<<"åäö">>,<<"åäö"/utf8>>,<<"Юникод"/utf8>>}
         ok

        Notice that this only affects heuristic interpretation of lists and binaries on output. For example, the ~ts format sequence always outputs a valid list of characters, regardless of the +pc setting, as the programmer has explicitly @@ -381,19 +381,19 @@ capable of. There is no portable way for Erlang to ask the terminal about its UTF-8 capacity, we have to rely on the language and character type settings.

        To investigate what Erlang thinks about the terminal, the call io:getopts() can be used when the shell is started:

        $ LC_CTYPE=en_US.ISO-8859-1 erl
        -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
        +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
         
        -Eshell V5.10.1  (abort with ^G)
        -1> lists:keyfind(encoding, 1, io:getopts()).
        -{encoding,latin1}
        -2> q().
        +Eshell V5.10.1  (abort with ^G)
        +1> lists:keyfind(encoding, 1, io:getopts()).
        +{encoding,latin1}
        +2> q().
         ok
         $ LC_CTYPE=en_US.UTF-8 erl
        -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
        +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
         
        -Eshell V5.10.1  (abort with ^G)
        -1> lists:keyfind(encoding, 1, io:getopts()).
        -{encoding,unicode}
        +Eshell V5.10.1  (abort with ^G)
        +1> lists:keyfind(encoding, 1, io:getopts()).
        +{encoding,unicode}
         2>

        When (finally?) everything is in order with the locale settings, fonts. and the terminal emulator, you have probably found a way to input characters in the script you desire. For testing, the simplest way is to add some keyboard @@ -406,14 +406,14 @@ easily if you are not used to this. For example, entering commands using a Cyrillic character set is not easily done in the Erlang shell.

        Now you are set up for some Unicode input and output. The simplest thing to do is to enter a string in the shell:

        $ erl
        -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
        +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
         
        -Eshell V5.10.1  (abort with ^G)
        -1> lists:keyfind(encoding, 1, io:getopts()).
        -{encoding,unicode}
        +Eshell V5.10.1  (abort with ^G)
        +1> lists:keyfind(encoding, 1, io:getopts()).
        +{encoding,unicode}
         2> "Юникод".
         "Юникод"
        -3> io:format("~ts~n", [v(2)]).
        +3> io:format("~ts~n", [v(2)]).
         Юникод
         ok
         4>

        While strings can be input as Unicode characters, the language elements are @@ -446,10 +446,10 @@ charlist() represented by it.

        #!/usr/bin/env escript
         %%! -kernel standard_io_encoding latin1
         
        -main(_) ->
        -  {ok, Char} = file:read_line(standard_io),
        -  ok = file:write(standard_io, string:trim(Char)),
        -  ok = file:write(standard_io, io_lib:format(": ~w~n",[string:trim(Char)])),
        +main(_) ->
        +  {ok, Char} = file:read_line(standard_io),
        +  ok = file:write(standard_io, string:trim(Char)),
        +  ok = file:write(standard_io, io_lib:format(": ~w~n",[string:trim(Char)])),
           ok.
        $ escript test.es
         ξ
         ξ: [206,190]

        ξ would normally be represented as the integer 958, but since we are using @@ -685,13 +685,13 @@ example {encoding,utf8}).

      Functions reading Erlang syntax from files recognize the coding: comment and can therefore handle Unicode data on input. When writing Erlang terms to a file, you are advised to insert such comments when applicable:

      $ erl +fna +pc unicode
      -Erlang R16B (erts-5.10.1) [source]  [async-threads:0] [hipe] [kernel-poll:false]
      +Erlang R16B (erts-5.10.1) [source]  [async-threads:0] [hipe] [kernel-poll:false]
       
      -Eshell V5.10.1  (abort with ^G)
      -1> file:write_file("test.term",<<"%% coding: utf-8\n[{\"Юникод\",4711}].\n"/utf8>>).
      +Eshell V5.10.1  (abort with ^G)
      +1> file:write_file("test.term",<<"%% coding: utf-8\n[{\"Юникод\",4711}].\n"/utf8>>).
       ok
      -2> file:consult("test.term").
      -{ok,[[{"Юникод",4711}]]}

      +2> file:consult("test.term"). +{ok,[[{"Юникод",4711}]]}

    @@ -770,21 +770,21 @@ same way as the remaining file. If such a file is to be read, the first few bytes (depending on encoding) are not part of the text. This code outlines how to open a file that is believed to have a BOM, and sets the files encoding and -position for further sequential reading (preferably using the io module).

    Notice that error handling is omitted from the code:

    open_bom_file_for_reading(File) ->
    -    {ok,F} = file:open(File,[read,binary]),
    -    {ok,Bin} = file:read(F,4),
    -    {Type,Bytes} = unicode:bom_to_encoding(Bin),
    -    file:position(F,Bytes),
    -    io:setopts(F,[{encoding,Type}]),
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/uri_string.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/uri_string.xhtml	2025-05-10 20:19:24.245327681 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/uri_string.xhtml	2025-05-10 20:19:24.285328043 +0000
    @@ -480,10 +480,10 @@
     

    Composes a form-urlencoded QueryString based on a QueryList, a list of non-percent-encoded key-value pairs.

    Form-urlencoding is defined in section 4.10.21.6 of the HTML 5.2 specification and in section 4.10.22.6 of the HTML 5.0 -specification for non-UTF-8 encodings.

    See also the opposite operation dissect_query/1.

    Example:

    1> uri_string:compose_query([{"foo bar","1"},{"city","örebro"}]).
    +specification for non-UTF-8 encodings.

    See also the opposite operation dissect_query/1.

    Example:

    1> uri_string:compose_query([{"foo bar","1"},{"city","örebro"}]).
     "foo+bar=1&city=%C3%B6rebro"
    -2> uri_string:compose_query([{<<"foo bar">>,<<"1">>},
    -2> {<<"city">>,<<"örebro"/utf8>>}]).
    +2> uri_string:compose_query([{<<"foo bar">>,<<"1">>},
    +2> {<<"city">>,<<"örebro"/utf8>>}]).
     <<"foo+bar=1&city=%C3%B6rebro">>
    @@ -527,11 +527,11 @@ ";" (U+003B) character.

    Bytes that are out of the range 0x2A, 0x2D, 0x2E, 0x30 to 0x39, 0x41 to 0x5A, 0x5F, 0x61 to 0x7A, are percent-encoded (U+0025 PERCENT SIGN character (%) followed by uppercase ASCII hex digits representing the hexadecimal value of the -byte).

    See also the opposite operation dissect_query/1.

    Example:

    1> uri_string:compose_query([{"foo bar","1"},{"city","örebro"}],
    -1> [{encoding, latin1}]).
    +byte).

    See also the opposite operation dissect_query/1.

    Example:

    1> uri_string:compose_query([{"foo bar","1"},{"city","örebro"}],
    +1> [{encoding, latin1}]).
     "foo+bar=1&city=%F6rebro"
    -2> uri_string:compose_query([{<<"foo bar">>,<<"1">>},
    -2> {<<"city">>,<<"東京"/utf8>>}], [{encoding, latin1}]).
    +2> uri_string:compose_query([{<<"foo bar">>,<<"1">>},
    +2> {<<"city">>,<<"東京"/utf8>>}], [{encoding, latin1}]).
     <<"foo+bar=1&city=%26%2326481%3B%26%2320140%3B">>
    @@ -568,11 +568,11 @@

    Dissects an urlencoded QueryString and returns a QueryList, a list of non-percent-encoded key-value pairs.

    Form-urlencoding is defined in section 4.10.21.6 of the HTML 5.2 specification and in section 4.10.22.6 of the HTML 5.0 -specification for non-UTF-8 encodings.

    See also the opposite operation compose_query/1.

    Example:

    1> uri_string:dissect_query("foo+bar=1&city=%C3%B6rebro").
    -[{"foo bar","1"},{"city","örebro"}]
    -2> uri_string:dissect_query(<<"foo+bar=1&city=%26%2326481%3B%26%2320140%3B">>).
    -[{<<"foo bar">>,<<"1">>},
    - {<<"city">>,<<230,157,177,228,186,172>>}]
    +specification for non-UTF-8 encodings.

    See also the opposite operation compose_query/1.

    Example:

    1> uri_string:dissect_query("foo+bar=1&city=%C3%B6rebro").
    +[{"foo bar","1"},{"city","örebro"}]
    +2> uri_string:dissect_query(<<"foo+bar=1&city=%26%2326481%3B%26%2320140%3B">>).
    +[{<<"foo bar">>,<<"1">>},
    + {<<"city">>,<<230,157,177,228,186,172>>}]
    @@ -606,14 +606,14 @@

    Transforms an URI into a normalized form using Syntax-Based Normalization as defined by RFC 3986.

    This function implements case normalization, percent-encoding normalization, path segment normalization and scheme based normalization for HTTP(S) with basic -support for FTP, SSH, SFTP and TFTP.

    Example:

    1> uri_string:normalize("/a/b/c/./../../g").
    +support for FTP, SSH, SFTP and TFTP.

    Example:

    1> uri_string:normalize("/a/b/c/./../../g").
     "/a/g"
    -2> uri_string:normalize(<<"mid/content=5/../6">>).
    +2> uri_string:normalize(<<"mid/content=5/../6">>).
     <<"mid/6">>
    -3> uri_string:normalize("http://localhost:80").
    +3> uri_string:normalize("http://localhost:80").
     "http://localhost/"
    -4> uri_string:normalize(#{scheme => "http",port => 80,path => "/a/b/c/./../../g",
    -4> host => "localhost-örebro"}).
    +4> uri_string:normalize(#{scheme => "http",port => 80,path => "/a/b/c/./../../g",
    +4> host => "localhost-örebro"}).
     "http://localhost-%C3%B6rebro/a/g"
    @@ -650,15 +650,15 @@

    Same as normalize/1 but with an additional Options parameter, that controls whether the normalized URI shall be returned as an -uri_map().

    There is one supported option: return_map.

    Example:

    1> uri_string:normalize("/a/b/c/./../../g", [return_map]).
    -#{path => "/a/g"}
    -2> uri_string:normalize(<<"mid/content=5/../6">>, [return_map]).
    -#{path => <<"mid/6">>}
    -3> uri_string:normalize("http://localhost:80", [return_map]).
    -#{scheme => "http",path => "/",host => "localhost"}
    -4> uri_string:normalize(#{scheme => "http",port => 80,path => "/a/b/c/./../../g",
    -4> host => "localhost-örebro"}, [return_map]).
    -#{scheme => "http",path => "/a/g",host => "localhost-örebro"}
    +uri_map().

    There is one supported option: return_map.

    Example:

    1> uri_string:normalize("/a/b/c/./../../g", [return_map]).
    +#{path => "/a/g"}
    +2> uri_string:normalize(<<"mid/content=5/../6">>, [return_map]).
    +#{path => <<"mid/6">>}
    +3> uri_string:normalize("http://localhost:80", [return_map]).
    +#{scheme => "http",path => "/",host => "localhost"}
    +4> uri_string:normalize(#{scheme => "http",port => 80,path => "/a/b/c/./../../g",
    +4> host => "localhost-örebro"}, [return_map]).
    +#{scheme => "http",path => "/a/g",host => "localhost-örebro"}
    @@ -690,14 +690,14 @@

    Parses an RFC 3986 compliant uri_string/0 into a uri_map/0, that holds the parsed components of the -URI. If parsing fails, an error tuple is returned.

    See also the opposite operation recompose/1.

    Example:

    1> uri_string:parse("foo://user@example.com:8042/over/there?name=ferret#nose").
    -#{fragment => "nose",host => "example.com",
    +URI. If parsing fails, an error tuple is returned.

    See also the opposite operation recompose/1.

    Example:

    1> uri_string:parse("foo://user@example.com:8042/over/there?name=ferret#nose").
    +#{fragment => "nose",host => "example.com",
       path => "/over/there",port => 8042,query => "name=ferret",
    -  scheme => foo,userinfo => "user"}
    -2> uri_string:parse(<<"foo://user@example.com:8042/over/there?name=ferret">>).
    -#{host => <<"example.com">>,path => <<"/over/there">>,
    +  scheme => foo,userinfo => "user"}
    +2> uri_string:parse(<<"foo://user@example.com:8042/over/there?name=ferret">>).
    +#{host => <<"example.com">>,path => <<"/over/there">>,
       port => 8042,query => <<"name=ferret">>,scheme => <<"foo">>,
    -  userinfo => <<"user">>}
    +
    userinfo => <<"user">>}
    @@ -737,15 +737,15 @@

    Decodes all percent-encoded triplets in the input that can be both a uri_string/0 and a uri_map/0.

    Note, that this function performs raw decoding and it shall be used on already parsed URI components. Applying this function directly on a standard URI can -effectively change it.

    If the input encoding is not UTF-8, an error tuple is returned.

    Example:

    1> uri_string:percent_decode(#{host => "localhost-%C3%B6rebro",path => [],
    -1> scheme => "http"}).
    -#{host => "localhost-örebro",path => [],scheme => "http"}
    -2> uri_string:percent_decode(<<"%C3%B6rebro">>).
    +effectively change it.

    If the input encoding is not UTF-8, an error tuple is returned.

    Example:

    1> uri_string:percent_decode(#{host => "localhost-%C3%B6rebro",path => [],
    +1> scheme => "http"}).
    +#{host => "localhost-örebro",path => [],scheme => "http"}
    +2> uri_string:percent_decode(<<"%C3%B6rebro">>).
     <<"örebro"/utf8>>

    Warning

    Using uri_string:percent_decode/1 directly on a URI is not safe. This example shows, that after each consecutive application of the function the -resulting URI will be changed. None of these URIs refer to the same resource.

    3> uri_string:percent_decode(<<"http://local%252Fhost/path">>).
    +resulting URI will be changed. None of these URIs refer to the same resource.

    3> uri_string:percent_decode(<<"http://local%252Fhost/path">>).
     <<"http://local%2Fhost/path">>
    -4> uri_string:percent_decode(<<"http://local%2Fhost/path">>).
    +4> uri_string:percent_decode(<<"http://local%2Fhost/path">>).
     <<"http://local/host/path">>
    @@ -778,9 +778,9 @@

    Replaces characters out of unreserved set with their percent encoded equivalents.

    Unreserved characters defined in -RFC 3986 are not quoted.

    Example:

    1> uri_string:quote("SomeId/04").
    +RFC 3986 are not quoted.

    Example:

    1> uri_string:quote("SomeId/04").
     "SomeId%2F04"
    -2> uri_string:quote(<<"SomeId/04">>).
    +2> uri_string:quote(<<"SomeId/04">>).
     <<"SomeId%2F04">>

    Warning

    Function is not aware about any URI component context and should not be used on whole URI. If applied more than once on the same data, might produce unexpected results.

    @@ -815,9 +815,9 @@

    Same as quote/1, but Safe allows user to provide a list of -characters to be protected from encoding.

    Example:

    1> uri_string:quote("SomeId/04", "/").
    +characters to be protected from encoding.

    Example:

    1> uri_string:quote("SomeId/04", "/").
     "SomeId/04"
    -2> uri_string:quote(<<"SomeId/04">>, "/").
    +2> uri_string:quote(<<"SomeId/04">>, "/").
     <<"SomeId/04">>

    Warning

    Function is not aware about any URI component context and should not be used on whole URI. If applied more than once on the same data, might produce unexpected results.

    @@ -852,13 +852,13 @@

    Creates an RFC 3986 compliant URIString (percent-encoded), based on the components of URIMap. If the -URIMap is invalid, an error tuple is returned.

    See also the opposite operation parse/1.

    Example:

    1> URIMap = #{fragment => "nose", host => "example.com", path => "/over/there",
    -1> port => 8042, query => "name=ferret", scheme => "foo", userinfo => "user"}.
    -#{fragment => "nose",host => "example.com",
    +URIMap is invalid, an error tuple is returned.

    See also the opposite operation parse/1.

    Example:

    1> URIMap = #{fragment => "nose", host => "example.com", path => "/over/there",
    +1> port => 8042, query => "name=ferret", scheme => "foo", userinfo => "user"}.
    +#{fragment => "nose",host => "example.com",
       path => "/over/there",port => 8042,query => "name=ferret",
    -  scheme => "foo",userinfo => "user"}
    +  scheme => "foo",userinfo => "user"}
     
    -2> uri_string:recompose(URIMap).
    +2> uri_string:recompose(URIMap).
     "foo://example.com:8042/over/there?name=ferret#nose"
    @@ -895,13 +895,13 @@

    Convert a RefURI reference that might be relative to a given base URI into the parsed components of the reference's target, which can then be recomposed to -form the target URI.

    Example:

    1> uri_string:resolve("/abs/ol/ute", "http://localhost/a/b/c?q").
    +form the target URI.

    Example:

    1> uri_string:resolve("/abs/ol/ute", "http://localhost/a/b/c?q").
     "http://localhost/abs/ol/ute"
    -2> uri_string:resolve("../relative", "http://localhost/a/b/c?q").
    +2> uri_string:resolve("../relative", "http://localhost/a/b/c?q").
     "http://localhost/a/relative"
    -3> uri_string:resolve("http://localhost/full", "http://localhost/a/b/c?q").
    +3> uri_string:resolve("http://localhost/full", "http://localhost/a/b/c?q").
     "http://localhost/full"
    -4> uri_string:resolve(#{path => "path", query => "xyz"}, "http://localhost/a/b/c?q").
    +4> uri_string:resolve(#{path => "path", query => "xyz"}, "http://localhost/a/b/c?q").
     "http://localhost/a/b/path?xyz"
    @@ -939,11 +939,11 @@ /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/uri_string_usage.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/uri_string_usage.xhtml 2025-05-10 20:19:24.245327681 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/uri_string_usage.xhtml 2025-05-10 20:19:24.285328043 +0000 @@ -89,19 +89,19 @@ to explain this by an example.

    Let's say that we would like to create the following URI and send it over the network: http://cities/örebro?foo bar. This is not a valid URI as it contains characters that are not allowed in a URI such as "ö" and the space. We can -verify this by parsing the URI:

      1> uri_string:parse("http://cities/örebro?foo bar").
    -  {error,invalid_uri,":"}

    The URI parser tries all possible combinations to interpret the input and fails +verify this by parsing the URI:

      1> uri_string:parse("http://cities/örebro?foo bar").
    +  {error,invalid_uri,":"}

    The URI parser tries all possible combinations to interpret the input and fails at the last attempt when it encounters the colon character ":". Note, that the inital fault occurs when the parser attempts to interpret the character "ö" and after a failure back-tracks to the point where it has another possible parsing alternative.

    The proper way to solve this problem is to use uri_string:recompose/1 with a -uri_map() as input:

      2> uri_string:recompose(#{scheme => "http", host => "cities", path => "/örebro",
    -  query => "foo bar"}).
    +uri_map() as input:

      2> uri_string:recompose(#{scheme => "http", host => "cities", path => "/örebro",
    +  query => "foo bar"}).
       "http://cities/%C3%B6rebro?foo%20bar"

    The result is a valid URI where all the special characters are encoded as defined by the standard. Applying uri_string:parse/1 and -uri_string:percent_decode/1 on the URI returns the original input:

      3> uri_string:percent_decode(uri_string:parse("http://cities/%C3%B6rebro?foo%20bar")).
    -  #{host => "cities",path => "/örebro",query => "foo bar",
    -  scheme => "http"}

    This symmetric property is heavily used in our property test suite.

    +uri_string:percent_decode/1 on the URI returns the original input:

      3> uri_string:percent_decode(uri_string:parse("http://cities/%C3%B6rebro?foo%20bar")).
    +  #{host => "cities",path => "/örebro",query => "foo bar",
    +  scheme => "http"}

    This symmetric property is heavily used in our property test suite.

    @@ -124,27 +124,27 @@ question the library provides a utility function, uri_string:allowed_characters/0, that lists the allowed set of characters in each major URI component, and also in the -most important standard character sets.

        1> uri_string:allowed_characters().
    -    [{scheme,
    -     "+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"},
    -    {userinfo,
    -     "!$%&'()*+,-.0123456789:;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {host,
    -     "!$&'()*+,-.0123456789:;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {ipv4,".0123456789"},
    -    {ipv6,".0123456789:ABCDEFabcdef"},
    -    {regname,
    -     "!$%&'()*+,-.0123456789;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {path,
    -     "!$%&'()*+,-./0123456789:;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {query,
    -     "!$%&'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {fragment,
    -     "!$%&'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {reserved,"!#$&'()*+,/:;=?@[]"},
    -    {unreserved,
    -     "-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"}]

    If a URI component has a character that is not allowed, it will be -percent-encoded when the URI is produced:

        2> uri_string:recompose(#{scheme => "https", host => "local#host", path => ""}).
    +most important standard character sets.

        1> uri_string:allowed_characters().
    +    [{scheme,
    +     "+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"},
    +    {userinfo,
    +     "!$%&'()*+,-.0123456789:;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {host,
    +     "!$&'()*+,-.0123456789:;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {ipv4,".0123456789"},
    +    {ipv6,".0123456789:ABCDEFabcdef"},
    +    {regname,
    +     "!$%&'()*+,-.0123456789;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {path,
    +     "!$%&'()*+,-./0123456789:;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {query,
    +     "!$%&'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {fragment,
    +     "!$%&'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {reserved,"!#$&'()*+,/:;=?@[]"},
    +    {unreserved,
    +     "-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"}]

    If a URI component has a character that is not allowed, it will be +percent-encoded when the URI is produced:

        2> uri_string:recompose(#{scheme => "https", host => "local#host", path => ""}).
         "https://local%23host"

    Consuming a URI containing percent-encoded triplets can take many steps. The following example shows how to handle an input URI that is not normalized and contains multiple percent-encoded triplets. First, the input @@ -156,32 +156,32 @@ You can try to normalize the input with uri_string:normalize/1. The normalize operation decodes those percent-encoded triplets that correspond to a character in the unreserved set. Normalization is a safe, idempotent operation that -converts a URI into its canonical form:

        4> uri_string:normalize("http://%6C%6Fcal%23host/%F6re%26bro%20").
    +converts a URI into its canonical form:

        4> uri_string:normalize("http://%6C%6Fcal%23host/%F6re%26bro%20").
         "http://local%23host/%F6re%26bro%20"
    -    5> uri_string:normalize("http://%6C%6Fcal%23host/%F6re%26bro%20", [return_map]).
    -    #{host => "local%23host",path => "/%F6re%26bro%20",
    -      scheme => "http"}

    There are still a few percent-encoded triplets left in the output. At this + 5> uri_string:normalize("http://%6C%6Fcal%23host/%F6re%26bro%20", [return_map]). + #{host => "local%23host",path => "/%F6re%26bro%20", + scheme => "http"}

    There are still a few percent-encoded triplets left in the output. At this point, when the URI is already parsed, it is safe to apply application specific decoding on the remaining character triplets. Erlang/OTP provides a function, uri_string:percent_decode/1 for raw percent decoding that you can use on the -host and path components, or on the whole map:

        6> uri_string:percent_decode("local%23host").
    +host and path components, or on the whole map:

        6> uri_string:percent_decode("local%23host").
         "local#host"
    -    7> uri_string:percent_decode("/%F6re%26bro%20").
    -    {error,invalid_utf8,<<"/öre&bro ">>}
    -    8> uri_string:percent_decode(#{host => "local%23host",path => "/%F6re%26bro%20",
    -    scheme => "http"}).
    -    {error,{invalid,{path,{invalid_utf8,<<"/öre&bro ">>}}}}

    The host was successfully decoded but the path contains at least one character + 7> uri_string:percent_decode("/%F6re%26bro%20"). + {error,invalid_utf8,<<"/öre&bro ">>} + 8> uri_string:percent_decode(#{host => "local%23host",path => "/%F6re%26bro%20", + scheme => "http"}). + {error,{invalid,{path,{invalid_utf8,<<"/öre&bro ">>}}}}

    The host was successfully decoded but the path contains at least one character with non-UTF-8 encoding. In order to be able to decode this, you have to make assumptions about the encoding used in these triplets. The most obvious choice is latin-1, so you can try uri_string:transcode/2, to transcode the path to -UTF-8 and run the percent-decode operation on the transcoded string:

        9> uri_string:transcode("/%F6re%26bro%20", [{in_encoding, latin1}]).
    +UTF-8 and run the percent-decode operation on the transcoded string:

        9> uri_string:transcode("/%F6re%26bro%20", [{in_encoding, latin1}]).
         "/%C3%B6re%26bro%20"
    -    10> uri_string:percent_decode("/%C3%B6re%26bro%20").
    +    10> uri_string:percent_decode("/%C3%B6re%26bro%20").
         "/öre&bro "

    It is important to emphasize that it is not safe to apply -uri_string:percent_decode/1 directly on an input URI:

        11> uri_string:percent_decode("http://%6C%6Fcal%23host/%C3%B6re%26bro%20").
    +uri_string:percent_decode/1 directly on an input URI:

        11> uri_string:percent_decode("http://%6C%6Fcal%23host/%C3%B6re%26bro%20").
         "http://local#host/öre&bro "
    -    12> uri_string:parse("http://local#host/öre&bro ").
    -    {error,invalid_uri,":"}

    Note

    Percent-encoding is implemented in uri_string:recompose/1 and it happens + 12> uri_string:parse("http://local#host/öre&bro "). + {error,invalid_uri,":"}

    Note

    Percent-encoding is implemented in uri_string:recompose/1 and it happens when converting a uri_map() into a uri_string(). Applying any percent-encoding directly on an input URI would not be safe just as in the case of /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/zip.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/zip.xhtml 2025-05-10 20:19:24.245327681 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib.epub/OEBPS/zip.xhtml 2025-05-10 20:19:24.285328043 +0000 @@ -928,28 +928,28 @@ archive. The iteration can be ended prematurely in a controlled manner by throwing an exception.

    Example:

    > Name = "dummy.zip".
     "dummy.zip"
    -> {ok, {Name, Bin}} = zip:create(Name, [{"foo", <<"FOO">>}, {"bar", <<"BAR">>}], [memory]).
    -{ok,{"dummy.zip",
    +> {ok, {Name, Bin}} = zip:create(Name, [{"foo", <<"FOO">>}, {"bar", <<"BAR">>}], [memory]).
    +{ok,{"dummy.zip",
          <<80,75,3,4,20,0,0,0,0,0,74,152,97,60,171,39,212,26,3,0,
    -       0,0,3,0,0,...>>}}
    -> {ok, FileSpec} = zip:foldl(fun(N, I, B, Acc) -> [{N, B(), I()} | Acc] end, [], {Name, Bin}).
    -{ok,[{"bar",<<"BAR">>,
    -      {file_info,3,regular,read_write,
    -                 {{2010,3,1},{19,2,10}},
    -                 {{2010,3,1},{19,2,10}},
    -                 {{2010,3,1},{19,2,10}},
    -                 54,1,0,0,0,0,0}},
    -     {"foo",<<"FOO">>,
    -      {file_info,3,regular,read_write,
    -                 {{2010,3,1},{19,2,10}},
    -                 {{2010,3,1},{19,2,10}},
    -                 {{2010,3,1},{19,2,10}},
    -                 54,1,0,0,0,0,0}}]}
    -> {ok, {Name, Bin}} = zip:create(Name, lists:reverse(FileSpec), [memory]).
    -{ok,{"dummy.zip",
    +       0,0,3,0,0,...>>}}
    +> {ok, FileSpec} = zip:foldl(fun(N, I, B, Acc) -> [{N, B(), I()} | Acc] end, [], {Name, Bin}).
    +{ok,[{"bar",<<"BAR">>,
    +      {file_info,3,regular,read_write,
    +                 {{2010,3,1},{19,2,10}},
    +                 {{2010,3,1},{19,2,10}},
    +                 {{2010,3,1},{19,2,10}},
    +                 54,1,0,0,0,0,0}},
    +     {"foo",<<"FOO">>,
    +      {file_info,3,regular,read_write,
    +                 {{2010,3,1},{19,2,10}},
    +                 {{2010,3,1},{19,2,10}},
    +                 {{2010,3,1},{19,2,10}},
    +                 54,1,0,0,0,0,0}}]}
    +> {ok, {Name, Bin}} = zip:create(Name, lists:reverse(FileSpec), [memory]).
    +{ok,{"dummy.zip",
          <<80,75,3,4,20,0,0,0,0,0,74,152,97,60,171,39,212,26,3,0,
    -       0,0,3,0,0,...>>}}
    -> catch zip:foldl(fun("foo", _, B, _) -> throw(B()); (_,_,_,Acc) -> Acc end, [], {Name, Bin}).
    +       0,0,3,0,0,...>>}}
    +> catch zip:foldl(fun("foo", _, B, _) -> throw(B()); (_,_,_,Acc) -> Acc end, [], {Name, Bin}).
     <<"FOO">>
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib_app.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib_app.html 2025-05-10 20:19:25.093335369 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/stdlib_app.html 2025-05-10 20:19:25.097335404 +0000 @@ -160,13 +160,13 @@ prompt function takes the main prompt as its only parameter.

  • shell_saved_results = integer() >= 0 - Can be used to determine how many results are saved by the Erlang shell.

  • shell_session_slogan = string() | fun() -> string()) - The slogan printed when starting an Erlang shell. Example:

    $ erl -stdlib shell_session_slogan '"Test slogan"'
    -Erlang/OTP 26 [DEVELOPMENT] [erts-13.0.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]
    +Erlang/OTP 26 [DEVELOPMENT] [erts-13.0.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]
     
     Test slogan
     1>
  • shell_slogan = string() | fun(() -> string()) - The slogan printed when starting the Erlang shell subsystem. Example:

    $ erl -stdlib shell_slogan '"Test slogan"'
     Test slogan
    -Eshell V13.0.2  (abort with ^G)
    +Eshell V13.0.2  (abort with ^G)
     1>

    The default is the return value of erlang:system_info(system_version).

  • shell_strings = boolean() - Can be used to determine how the Erlang shell outputs lists of integers.

  • @@ -226,7 +226,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/string.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/string.html 2025-05-10 20:19:25.149335876 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/string.html 2025-05-10 20:19:25.177336130 +0000 @@ -149,14 +149,14 @@ expect UTF-8 binaries but not all functions verify that all binaries are encoded correctly.

    Unless otherwise specified the return value type is the same as the input type. That is, binary input returns binary output, list input returns a list output, -and mixed input can return a mixed output.

    1> string:trim("  sarah  ").
    +and mixed input can return a mixed output.

    1> string:trim("  sarah  ").
     "sarah"
    -2> string:trim(<<"  sarah  ">>).
    +2> string:trim(<<"  sarah  ">>).
     <<"sarah">>
    -3> string:lexemes("foo bar", " ").
    -["foo","bar"]
    -4> string:lexemes(<<"foo bar">>, " ").
    -[<<"foo">>,<<"bar">>]

    This module has been reworked in Erlang/OTP 20 to handle unicode:chardata/0 +3> string:lexemes("foo bar", " "). +["foo","bar"] +4> string:lexemes(<<"foo bar">>, " "). +[<<"foo">>,<<"bar">>]

    This module has been reworked in Erlang/OTP 20 to handle unicode:chardata/0 and operate on grapheme clusters. The old functions that only work on Latin-1 lists as input are still available but should not be used, they will be @@ -1068,7 +1068,7 @@

    Converts String to a case-agnostic comparable string. Function casefold/1 is preferred over lowercase/1 -when two strings are to be compared for equality. See also equal/4.

    Example:

    1> string:casefold("Ω and ẞ SHARP S").
    +when two strings are to be compared for equality. See also equal/4.

    Example:

    1> string:casefold("Ω and ẞ SHARP S").
     "ω and ss sharp s"
    @@ -1100,9 +1100,9 @@

    Returns a string where any trailing \n or \r\n have been removed from -String.

    Example:

    182> string:chomp(<<"\nHello\n\n">>).
    +String.

    Example:

    182> string:chomp(<<"\nHello\n\n">>).
     <<"\nHello">>
    -183> string:chomp("\nHello\r\r\n").
    +183> string:chomp("\nHello\r\r\n").
     "\nHello\r"
    @@ -1203,11 +1203,11 @@ nfc, nfd, nfkc, and -nfkd.

    Example:

    1> string:equal("åäö", <<"åäö"/utf8>>).
    +nfkd.

    Example:

    1> string:equal("åäö", <<"åäö"/utf8>>).
     true
    -2> string:equal("åäö", unicode:characters_to_nfd_binary("åäö")).
    +2> string:equal("åäö", unicode:characters_to_nfd_binary("åäö")).
     false
    -3> string:equal("åäö", unicode:characters_to_nfd_binary("ÅÄÖ"), true, nfc).
    +3> string:equal("åäö", unicode:characters_to_nfd_binary("ÅÄÖ"), true, nfc).
     true
    @@ -1273,13 +1273,13 @@

    Removes anything before SearchPattern in String and returns the remainder of the string or nomatch if SearchPattern is not found. Dir, which can be leading or trailing, indicates from which direction characters are to be -searched.

    Example:

    1> string:find("ab..cd..ef", ".").
    +searched.

    Example:

    1> string:find("ab..cd..ef", ".").
     "..cd..ef"
    -2> string:find(<<"ab..cd..ef">>, "..", trailing).
    +2> string:find(<<"ab..cd..ef">>, "..", trailing).
     <<"..ef">>
    -3> string:find(<<"ab..cd..ef">>, "x", leading).
    +3> string:find(<<"ab..cd..ef">>, "x", leading).
     nomatch
    -4> string:find("ab..cd..ef", "x", trailing).
    +4> string:find("ab..cd..ef", "x", trailing).
     nomatch
    @@ -1310,9 +1310,9 @@ -

    Returns true if String is the empty string, otherwise false.

    Example:

    1> string:is_empty("foo").
    +

    Returns true if String is the empty string, otherwise false.

    Example:

    1> string:is_empty("foo").
     false
    -2> string:is_empty(["",<<>>]).
    +2> string:is_empty(["",<<>>]).
     true
    @@ -1350,13 +1350,13 @@

    Returns a float between +0.0 and 1.0 representing the Jaro similarity between the given strings. Strings with a higher similarity will score closer -to 1.0, with +0.0 meaning no similarity and 1.0 meaning an exact match.

    Example:

    1> string:jaro_similarity("ditto", "ditto").
    +to 1.0, with +0.0 meaning no similarity and 1.0 meaning an exact match.

    Example:

    1> string:jaro_similarity("ditto", "ditto").
     1.0
    -2> string:jaro_similarity("foo", "bar").
    +2> string:jaro_similarity("foo", "bar").
     +0.0
    -3> string:jaro_similarity("michelle", "michael").
    +3> string:jaro_similarity("michelle", "michael").
     0.8690476190476191
    -4> string:jaro_similarity(<<"Édouard"/utf8>>, <<"Claude">>).
    +4> string:jaro_similarity(<<"Édouard"/utf8>>, <<"Claude">>).
     0.5317460317460317

    The Jaro distance between two strings can be calculated with JaroDistance = 1.0 - JaroSimilarity.

    @@ -1388,9 +1388,9 @@ -

    Returns the number of grapheme clusters in String.

    Example:

    1> string:length("ß↑e̊").
    +

    Returns the number of grapheme clusters in String.

    Example:

    1> string:length("ß↑e̊").
     3
    -2> string:length(<<195,159,226,134,145,101,204,138>>).
    +2> string:length(<<195,159,226,134,145,101,204,138>>).
     3
    @@ -1425,10 +1425,10 @@

    Returns a list of lexemes in String, separated by the grapheme clusters in SeparatorList.

    Notice that, as shown in this example, two or more adjacent separator graphemes clusters in String are treated as one. That is, there are no empty strings in -the resulting list of lexemes. See also split/3 which returns empty strings.

    Notice that [$\r,$\n] is one grapheme cluster.

    Example:

    1> string:lexemes("abc de̊fxxghix jkl\r\nfoo", "x e" ++ [[$\r,$\n]]).
    -["abc","de̊f","ghi","jkl","foo"]
    -2> string:lexemes(<<"abc de̊fxxghix jkl\r\nfoo"/utf8>>, "x e" ++ [$\r,$\n]).
    -[<<"abc">>,<<"de̊f"/utf8>>,<<"ghi">>,<<"jkl\r\nfoo">>]
    +the resulting list of lexemes. See also split/3 which returns empty strings.

    Notice that [$\r,$\n] is one grapheme cluster.

    Example:

    1> string:lexemes("abc de̊fxxghix jkl\r\nfoo", "x e" ++ [[$\r,$\n]]).
    +["abc","de̊f","ghi","jkl","foo"]
    +2> string:lexemes(<<"abc de̊fxxghix jkl\r\nfoo"/utf8>>, "x e" ++ [$\r,$\n]).
    +[<<"abc">>,<<"de̊f"/utf8>>,<<"ghi">>,<<"jkl\r\nfoo">>]
    @@ -1459,7 +1459,7 @@

    Converts String to lowercase.

    Notice that function casefold/1 should be used when converting a string to be -tested for equality.

    Example:

    2> string:lowercase(string:uppercase("Michał")).
    +tested for equality.

    Example:

    2> string:lowercase(string:uppercase("Michał")).
     "michał"
    @@ -1493,8 +1493,8 @@

    Returns the first codepoint in String and the rest of String in the tail. Returns an empty list if String is empty or an {error, String} tuple if the -next byte is invalid.

    Example:

    1> string:next_codepoint(unicode:characters_to_binary("e̊fg")).
    -[101|<<"̊fg"/utf8>>]
    +next byte is invalid.

    Example:

    1> string:next_codepoint(unicode:characters_to_binary("e̊fg")).
    +[101|<<"̊fg"/utf8>>]
    @@ -1528,8 +1528,8 @@

    Returns the first grapheme cluster in String and the rest of String in the tail. Returns an empty list if String is empty or an {error, String} tuple -if the next byte is invalid.

    Example:

    1> string:next_grapheme(unicode:characters_to_binary("e̊fg")).
    -["e̊"|<<"fg">>]
    +if the next byte is invalid.

    Example:

    1> string:next_grapheme(unicode:characters_to_binary("e̊fg")).
    +["e̊"|<<"fg">>]
    @@ -1564,7 +1564,7 @@

    Returns lexeme number N in String, where lexemes are separated by the -grapheme clusters in SeparatorList.

    Example:

    1> string:nth_lexeme("abc.de̊f.ghiejkl", 3, ".e").
    +grapheme clusters in SeparatorList.

    Example:

    1> string:nth_lexeme("abc.de̊f.ghiejkl", 3, ".e").
     "ghi"
    @@ -1662,11 +1662,11 @@

    Pads String to Length with grapheme cluster Char. Dir, which can be -leading, trailing, or both, indicates where the padding should be added.

    Example:

    1> string:pad(<<"He̊llö"/utf8>>, 8).
    -[<<72,101,204,138,108,108,195,182>>,32,32,32]
    -2> io:format("'~ts'~n",[string:pad("He̊llö", 8, leading)]).
    +leading, trailing, or both, indicates where the padding should be added.

    Example:

    1> string:pad(<<"He̊llö"/utf8>>, 8).
    +[<<72,101,204,138,108,108,195,182>>,32,32,32]
    +2> io:format("'~ts'~n",[string:pad("He̊llö", 8, leading)]).
     '   He̊llö'
    -3> io:format("'~ts'~n",[string:pad("He̊llö", 8, both)]).
    +3> io:format("'~ts'~n",[string:pad("He̊llö", 8, both)]).
     ' He̊llö  '
    @@ -1698,9 +1698,9 @@

    If Prefix is the prefix of String, removes it and returns the remainder of -String, otherwise returns nomatch.

    Example:

    1> string:prefix(<<"prefix of string">>, "pre").
    +String, otherwise returns nomatch.

    Example:

    1> string:prefix(<<"prefix of string">>, "pre").
     <<"fix of string">>
    -2> string:prefix("pre", "prefix").
    +2> string:prefix("pre", "prefix").
     nomatch
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/supervisor.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/supervisor.html 2025-05-10 20:19:25.217336493 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/supervisor.html 2025-05-10 20:19:25.233336638 +0000 @@ -158,10 +158,10 @@ Supervisor flags

    The supervisor properties are defined by the supervisor flags. The type -definition for the supervisor flags is as follows:

    sup_flags() = #{strategy => strategy(),           % optional
    -                intensity => non_neg_integer(),   % optional
    -                period => pos_integer(),          % optional
    -                auto_shutdown => auto_shutdown()} % optional

    Restart Strategies

    A supervisor can have one of the following restart strategies specified with +definition for the supervisor flags is as follows:

    sup_flags() = #{strategy => strategy(),           % optional
    +                intensity => non_neg_integer(),   % optional
    +                period => pos_integer(),          % optional
    +                auto_shutdown => auto_shutdown()} % optional

    Restart Strategies

    A supervisor can have one of the following restart strategies specified with the strategy key in the above map:

    • one_for_one - If one child process terminates and is to be restarted, only that child process is affected. This is the default restart strategy.

    • one_for_all - If one child process terminates and is to be restarted, all other child processes are terminated and then all child processes are @@ -205,13 +205,13 @@ Child specification

    -

    The type definition of a child specification is as follows:

    child_spec() = #{id => child_id(),             % mandatory
    -                 start => mfargs(),            % mandatory
    -                 restart => restart(),         % optional
    -                 significant => significant(), % optional
    -                 shutdown => shutdown(),       % optional
    -                 type => worker(),             % optional
    -                 modules => modules()}         % optional

    The old tuple format is kept for backwards compatibility, see child_spec/0, +

    The type definition of a child specification is as follows:

    child_spec() = #{id => child_id(),             % mandatory
    +                 start => mfargs(),            % mandatory
    +                 restart => restart(),         % optional
    +                 significant => significant(), % optional
    +                 shutdown => shutdown(),       % optional
    +                 type => worker(),             % optional
    +                 modules => modules()}         % optional

    The old tuple format is kept for backwards compatibility, see child_spec/0, but the map is preferred.

    • id is used to identify the child specification internally by the supervisor.

      The id key is mandatory.

      Notice that this identifier on occations has been called "name". As far as possible, the terms "identifier" or "id" are now used but to keep backward compatibility, some occurences of "name" can still be found, for example in @@ -1806,7 +1806,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/supervisor_bridge.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/supervisor_bridge.html 2025-05-10 20:19:25.253336819 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/supervisor_bridge.html 2025-05-10 20:19:25.257336856 +0000 @@ -419,7 +419,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/sys.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/sys.html 2025-05-10 20:19:25.297337218 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/sys.html 2025-05-10 20:19:25.317337400 +0000 @@ -2323,7 +2323,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/timer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/timer.html 2025-05-10 20:19:25.353337725 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/timer.html 2025-05-10 20:19:25.365337835 +0000 @@ -146,15 +146,15 @@ Examples

    -

    Example 1

    The following example shows how to print "Hello World!" in 5 seconds:

    1> timer:apply_after(5000, io, format, ["~nHello World!~n", []]).
    -{ok,TRef}
    +

    Example 1

    The following example shows how to print "Hello World!" in 5 seconds:

    1> timer:apply_after(5000, io, format, ["~nHello World!~n", []]).
    +{ok,TRef}
     Hello World!

    Example 2

    The following example shows a process performing a certain action, and if this -action is not completed within a certain limit, the process is killed:

    Pid = spawn(mod, fun, [foo, bar]),
    +action is not completed within a certain limit, the process is killed:

    Pid = spawn(mod, fun, [foo, bar]),
     %% If pid is not finished in 10 seconds, kill him
    -{ok, R} = timer:kill_after(timer:seconds(10), Pid),
    +{ok, R} = timer:kill_after(timer:seconds(10), Pid),
     ...
     %% We change our mind...
    -timer:cancel(R),
    +timer:cancel(R),
     ...

    @@ -181,20 +181,20 @@ process which set the timer about its completion, by sending it a done message.

    Using self/0 inside the timed function, the code below does not work as intended. The task gets done, but the done message gets sent to the wrong -process and is lost.

    1> timer:apply_after(1000, fun() -> do_something(), self() ! done end).
    -{ok,TRef}
    +process and is lost.

    1> timer:apply_after(1000, fun() -> do_something(), self() ! done end).
    +{ok,TRef}
     2> receive done -> done after 5000 -> timeout end.
     %% ... 5s pass...
     timeout

    The code below calls self/0 in the process which sets the timer and assigns it to a variable, which is then used in the function to send the done message to, -and so works as intended.

    1> Target = self()
    +and so works as intended.

    1> Target = self()
     <0.82.0>
    -2> timer:apply_after(1000, fun() -> do_something(), Target ! done end).
    -{ok,TRef}
    +2> timer:apply_after(1000, fun() -> do_something(), Target ! done end).
    +{ok,TRef}
     3> receive done -> done after 5000 -> timeout end.
     %% ... 1s passes...
    -done

    Another option is to pass the message target as a parameter to the function.

    1> timer:apply_after(1000, fun(Target) -> do_something(), Target ! done end, [self()]).
    -{ok,TRef}
    +done

    Another option is to pass the message target as a parameter to the function.

    1> timer:apply_after(1000, fun(Target) -> do_something(), Target ! done end, [self()]).
    +{ok,TRef}
     2> receive done -> done after 5000 -> timeout end.
     %% ... 1s passes...
     done
    @@ -1643,7 +1643,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/unicode.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/unicode.html 2025-05-10 20:19:25.397338125 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/unicode.html 2025-05-10 20:19:25.409338233 +0000 @@ -1071,13 +1071,13 @@ the first part of a (so far) valid UTF character.

    If one UTF character is split over two consecutive binaries in the Data, the conversion succeeds. This means that a character can be decoded from a range of binaries as long as the whole range is specified as input without errors -occurring.

    Example:

    decode_data(Data) ->
    -   case unicode:characters_to_list(Data,unicode) of
    -      {incomplete,Encoded, Rest} ->
    -            More = get_some_more_data(),
    -            Encoded ++ decode_data([Rest, More]);
    -      {error,Encoded,Rest} ->
    -            handle_error(Encoded,Rest);
    +occurring.

    Example:

    decode_data(Data) ->
    +   case unicode:characters_to_list(Data,unicode) of
    +      {incomplete,Encoded, Rest} ->
    +            More = get_some_more_data(),
    +            Encoded ++ decode_data([Rest, More]);
    +      {error,Encoded,Rest} ->
    +            handle_error(Encoded,Rest);
           List ->
                 List
        end.

    However, bit strings that are not whole bytes are not allowed, so a UTF @@ -1112,7 +1112,7 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form -of canonical equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    4> unicode:characters_to_nfc_binary([<<"abc..a">>,[778],$a,[776],$o,[776]]).
    +of canonical equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    4> unicode:characters_to_nfc_binary([<<"abc..a">>,[778],$a,[776],$o,[776]]).
     <<"abc..åäö"/utf8>>
    @@ -1144,7 +1144,7 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form -of canonical equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    3> unicode:characters_to_nfc_list([<<"abc..a">>,[778],$a,[776],$o,[776]]).
    +of canonical equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    3> unicode:characters_to_nfc_list([<<"abc..a">>,[778],$a,[776],$o,[776]]).
     "abc..åäö"
    @@ -1176,7 +1176,7 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form -of canonical equivalent Decomposed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    2> unicode:characters_to_nfd_binary("abc..åäö").
    +of canonical equivalent Decomposed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    2> unicode:characters_to_nfd_binary("abc..åäö").
     <<97,98,99,46,46,97,204,138,97,204,136,111,204,136>>
    @@ -1208,8 +1208,8 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form -of canonical equivalent Decomposed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    1> unicode:characters_to_nfd_list("abc..åäö").
    -[97,98,99,46,46,97,778,97,776,111,776]
    +of canonical equivalent Decomposed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    1> unicode:characters_to_nfd_list("abc..åäö").
    +[97,98,99,46,46,97,778,97,776,111,776]
    @@ -1240,7 +1240,7 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form -of compatibly equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    4> unicode:characters_to_nfkc_binary([<<"abc..a">>,[778],$a,[776],$o,[776],[65299,65298]]).
    +of compatibly equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    4> unicode:characters_to_nfkc_binary([<<"abc..a">>,[778],$a,[776],$o,[776],[65299,65298]]).
     <<"abc..åäö32"/utf8>>
    @@ -1272,7 +1272,7 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form -of compatibly equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    3> unicode:characters_to_nfkc_list([<<"abc..a">>,[778],$a,[776],$o,[776],[65299,65298]]).
    +of compatibly equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    3> unicode:characters_to_nfkc_list([<<"abc..a">>,[778],$a,[776],$o,[776],[65299,65298]]).
     "abc..åäö32"
    @@ -1305,7 +1305,7 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form of compatibly equivalent Decomposed characters according to the Unicode -standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    2> unicode:characters_to_nfkd_binary(["abc..åäö",[65299,65298]]).
    +standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    2> unicode:characters_to_nfkd_binary(["abc..åäö",[65299,65298]]).
     <<97,98,99,46,46,97,204,138,97,204,136,111,204,136,51,50>>
    @@ -1338,8 +1338,8 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form of compatibly equivalent Decomposed characters according to the Unicode -standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    1> unicode:characters_to_nfkd_list(["abc..åäö",[65299,65298]]).
    -[97,98,99,46,46,97,778,97,776,111,776,51,50]
    +standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    1> unicode:characters_to_nfkd_list(["abc..åäö",[65299,65298]]).
    +[97,98,99,46,46,97,778,97,776,111,776,51,50]
    @@ -1400,7 +1400,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/unicode_usage.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/unicode_usage.html 2025-05-10 20:19:25.449338596 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/unicode_usage.html 2025-05-10 20:19:25.469338778 +0000 @@ -329,20 +329,20 @@ iolists, where binaries and lists can be combined to represent a sequence of bytes. In the same way, the Unicode-aware modules often allow for combinations of binaries and lists, where the binaries have characters encoded in UTF-8 and -the lists contain such binaries or numbers representing Unicode code points:

    unicode_binary() = binary() with characters encoded in UTF-8 coding standard
    +the lists contain such binaries or numbers representing Unicode code points:

    unicode_binary() = binary() with characters encoded in UTF-8 coding standard
     
    -chardata() = charlist() | unicode_binary()
    +chardata() = charlist() | unicode_binary()
     
    -charlist() = maybe_improper_list(char() | unicode_binary() | charlist(),
    -  unicode_binary() | nil())

    The module unicode even supports similar mixes with binaries containing +charlist() = maybe_improper_list(char() | unicode_binary() | charlist(), + unicode_binary() | nil())

    The module unicode even supports similar mixes with binaries containing other encodings than UTF-8, but that is a special case to allow for conversions -to and from external data:

    external_unicode_binary() = binary() with characters coded in a user-specified
    -  Unicode encoding other than UTF-8 (UTF-16 or UTF-32)
    +to and from external data:

    external_unicode_binary() = binary() with characters coded in a user-specified
    +  Unicode encoding other than UTF-8 (UTF-16 or UTF-32)
     
    -external_chardata() = external_charlist() | external_unicode_binary()
    +external_chardata() = external_charlist() | external_unicode_binary()
     
    -external_charlist() = maybe_improper_list(char() | external_unicode_binary() |
    -  external_charlist(), external_unicode_binary() | nil())

    +external_charlist() = maybe_improper_list(char() | external_unicode_binary() | + external_charlist(), external_unicode_binary() | nil())

    @@ -390,7 +390,7 @@

    In certain output functions and in the output of return values in the shell, Erlang tries to detect string data in lists and binaries heuristically. -Typically you will see heuristic detection in a situation like this:

    1> [97,98,99].
    +Typically you will see heuristic detection in a situation like this:

    1> [97,98,99].
     "abc"
     2> <<97,98,99>>.
     <<"abc">>
    @@ -410,27 +410,27 @@
     controls how heuristic string detection is done. More ranges are expected to be
     added in the future, enabling tailoring of the heuristics to the language and
     region relevant to the user.

    The following examples show the two startup options:

    $ erl +pc latin1
    -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
    +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
     
    -Eshell V5.10.1  (abort with ^G)
    -1> [1024].
    -[1024]
    -2> [1070,1085,1080,1082,1086,1076].
    -[1070,1085,1080,1082,1086,1076]
    -3> [229,228,246].
    +Eshell V5.10.1  (abort with ^G)
    +1> [1024].
    +[1024]
    +2> [1070,1085,1080,1082,1086,1076].
    +[1070,1085,1080,1082,1086,1076]
    +3> [229,228,246].
     "åäö"
     4> <<208,174,208,189,208,184,208,186,208,190,208,180>>.
     <<208,174,208,189,208,184,208,186,208,190,208,180>>
     5> <<229/utf8,228/utf8,246/utf8>>.
     <<"åäö"/utf8>>
    $ erl +pc unicode
    -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
    +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
     
    -Eshell V5.10.1  (abort with ^G)
    -1> [1024].
    +Eshell V5.10.1  (abort with ^G)
    +1> [1024].
     "Ѐ"
    -2> [1070,1085,1080,1082,1086,1076].
    +2> [1070,1085,1080,1082,1086,1076].
     "Юникод"
    -3> [229,228,246].
    +3> [229,228,246].
     "åäö"
     4> <<208,174,208,189,208,184,208,186,208,190,208,180>>.
     <<"Юникод"/utf8>>
    @@ -443,17 +443,17 @@
     outputs anything containing printable Unicode data (in binaries, either UTF-8 or
     bytewise encoded) as string data.

    These heuristics are also used by io:format/2, io_lib:format/2, and friends when modifier t is used with ~p or ~P:

    $ erl +pc latin1
    -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
    +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
     
    -Eshell V5.10.1  (abort with ^G)
    -1> io:format("~tp~n",[{<<"åäö">>, <<"åäö"/utf8>>, <<208,174,208,189,208,184,208,186,208,190,208,180>>}]).
    -{<<"åäö">>,<<"åäö"/utf8>>,<<208,174,208,189,208,184,208,186,208,190,208,180>>}
    +Eshell V5.10.1  (abort with ^G)
    +1> io:format("~tp~n",[{<<"åäö">>, <<"åäö"/utf8>>, <<208,174,208,189,208,184,208,186,208,190,208,180>>}]).
    +{<<"åäö">>,<<"åäö"/utf8>>,<<208,174,208,189,208,184,208,186,208,190,208,180>>}
     ok
    $ erl +pc unicode
    -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
    +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
     
    -Eshell V5.10.1  (abort with ^G)
    -1> io:format("~tp~n",[{<<"åäö">>, <<"åäö"/utf8>>, <<208,174,208,189,208,184,208,186,208,190,208,180>>}]).
    -{<<"åäö">>,<<"åäö"/utf8>>,<<"Юникод"/utf8>>}
    +Eshell V5.10.1  (abort with ^G)
    +1> io:format("~tp~n",[{<<"åäö">>, <<"åäö"/utf8>>, <<208,174,208,189,208,184,208,186,208,190,208,180>>}]).
    +{<<"åäö">>,<<"åäö"/utf8>>,<<"Юникод"/utf8>>}
     ok

    Notice that this only affects heuristic interpretation of lists and binaries on output. For example, the ~ts format sequence always outputs a valid list of characters, regardless of the +pc setting, as the programmer has explicitly @@ -476,19 +476,19 @@ capable of. There is no portable way for Erlang to ask the terminal about its UTF-8 capacity, we have to rely on the language and character type settings.

    To investigate what Erlang thinks about the terminal, the call io:getopts() can be used when the shell is started:

    $ LC_CTYPE=en_US.ISO-8859-1 erl
    -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
    +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
     
    -Eshell V5.10.1  (abort with ^G)
    -1> lists:keyfind(encoding, 1, io:getopts()).
    -{encoding,latin1}
    -2> q().
    +Eshell V5.10.1  (abort with ^G)
    +1> lists:keyfind(encoding, 1, io:getopts()).
    +{encoding,latin1}
    +2> q().
     ok
     $ LC_CTYPE=en_US.UTF-8 erl
    -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
    +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
     
    -Eshell V5.10.1  (abort with ^G)
    -1> lists:keyfind(encoding, 1, io:getopts()).
    -{encoding,unicode}
    +Eshell V5.10.1  (abort with ^G)
    +1> lists:keyfind(encoding, 1, io:getopts()).
    +{encoding,unicode}
     2>

    When (finally?) everything is in order with the locale settings, fonts. and the terminal emulator, you have probably found a way to input characters in the script you desire. For testing, the simplest way is to add some keyboard @@ -501,14 +501,14 @@ easily if you are not used to this. For example, entering commands using a Cyrillic character set is not easily done in the Erlang shell.

    Now you are set up for some Unicode input and output. The simplest thing to do is to enter a string in the shell:

    $ erl
    -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
    +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
     
    -Eshell V5.10.1  (abort with ^G)
    -1> lists:keyfind(encoding, 1, io:getopts()).
    -{encoding,unicode}
    +Eshell V5.10.1  (abort with ^G)
    +1> lists:keyfind(encoding, 1, io:getopts()).
    +{encoding,unicode}
     2> "Юникод".
     "Юникод"
    -3> io:format("~ts~n", [v(2)]).
    +3> io:format("~ts~n", [v(2)]).
     Юникод
     ok
     4>

    While strings can be input as Unicode characters, the language elements are @@ -541,10 +541,10 @@ charlist() represented by it.

    #!/usr/bin/env escript
     %%! -kernel standard_io_encoding latin1
     
    -main(_) ->
    -  {ok, Char} = file:read_line(standard_io),
    -  ok = file:write(standard_io, string:trim(Char)),
    -  ok = file:write(standard_io, io_lib:format(": ~w~n",[string:trim(Char)])),
    +main(_) ->
    +  {ok, Char} = file:read_line(standard_io),
    +  ok = file:write(standard_io, string:trim(Char)),
    +  ok = file:write(standard_io, io_lib:format(": ~w~n",[string:trim(Char)])),
       ok.
    $ escript test.es
     ξ
     ξ: [206,190]

    ξ would normally be represented as the integer 958, but since we are using @@ -780,13 +780,13 @@ example {encoding,utf8}).

    Functions reading Erlang syntax from files recognize the coding: comment and can therefore handle Unicode data on input. When writing Erlang terms to a file, you are advised to insert such comments when applicable:

    $ erl +fna +pc unicode
    -Erlang R16B (erts-5.10.1) [source]  [async-threads:0] [hipe] [kernel-poll:false]
    +Erlang R16B (erts-5.10.1) [source]  [async-threads:0] [hipe] [kernel-poll:false]
     
    -Eshell V5.10.1  (abort with ^G)
    -1> file:write_file("test.term",<<"%% coding: utf-8\n[{\"Юникод\",4711}].\n"/utf8>>).
    +Eshell V5.10.1  (abort with ^G)
    +1> file:write_file("test.term",<<"%% coding: utf-8\n[{\"Юникод\",4711}].\n"/utf8>>).
     ok
    -2> file:consult("test.term").
    -{ok,[[{"Юникод",4711}]]}

    +2> file:consult("test.term"). +{ok,[[{"Юникод",4711}]]}

    @@ -865,21 +865,21 @@ same way as the remaining file. If such a file is to be read, the first few bytes (depending on encoding) are not part of the text. This code outlines how to open a file that is believed to have a BOM, and sets the files encoding and -position for further sequential reading (preferably using the io module).

    Notice that error handling is omitted from the code:

    open_bom_file_for_reading(File) ->
    -    {ok,F} = file:open(File,[read,binary]),
    -    {ok,Bin} = file:read(F,4),
    -    {Type,Bytes} = unicode:bom_to_encoding(Bin),
    -    file:position(F,Bytes),
    -    io:setopts(F,[{encoding,Type}]),
    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/uri_string.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/uri_string.html	2025-05-10 20:19:25.505339104 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/uri_string.html	2025-05-10 20:19:25.517339213 +0000
    @@ -586,10 +586,10 @@
     

    Composes a form-urlencoded QueryString based on a QueryList, a list of non-percent-encoded key-value pairs.

    Form-urlencoding is defined in section 4.10.21.6 of the HTML 5.2 specification and in section 4.10.22.6 of the HTML 5.0 -specification for non-UTF-8 encodings.

    See also the opposite operation dissect_query/1.

    Example:

    1> uri_string:compose_query([{"foo bar","1"},{"city","örebro"}]).
    +specification for non-UTF-8 encodings.

    See also the opposite operation dissect_query/1.

    Example:

    1> uri_string:compose_query([{"foo bar","1"},{"city","örebro"}]).
     "foo+bar=1&city=%C3%B6rebro"
    -2> uri_string:compose_query([{<<"foo bar">>,<<"1">>},
    -2> {<<"city">>,<<"örebro"/utf8>>}]).
    +2> uri_string:compose_query([{<<"foo bar">>,<<"1">>},
    +2> {<<"city">>,<<"örebro"/utf8>>}]).
     <<"foo+bar=1&city=%C3%B6rebro">>

    @@ -633,11 +633,11 @@ ";" (U+003B) character.

    Bytes that are out of the range 0x2A, 0x2D, 0x2E, 0x30 to 0x39, 0x41 to 0x5A, 0x5F, 0x61 to 0x7A, are percent-encoded (U+0025 PERCENT SIGN character (%) followed by uppercase ASCII hex digits representing the hexadecimal value of the -byte).

    See also the opposite operation dissect_query/1.

    Example:

    1> uri_string:compose_query([{"foo bar","1"},{"city","örebro"}],
    -1> [{encoding, latin1}]).
    +byte).

    See also the opposite operation dissect_query/1.

    Example:

    1> uri_string:compose_query([{"foo bar","1"},{"city","örebro"}],
    +1> [{encoding, latin1}]).
     "foo+bar=1&city=%F6rebro"
    -2> uri_string:compose_query([{<<"foo bar">>,<<"1">>},
    -2> {<<"city">>,<<"東京"/utf8>>}], [{encoding, latin1}]).
    +2> uri_string:compose_query([{<<"foo bar">>,<<"1">>},
    +2> {<<"city">>,<<"東京"/utf8>>}], [{encoding, latin1}]).
     <<"foo+bar=1&city=%26%2326481%3B%26%2320140%3B">>
    @@ -674,11 +674,11 @@

    Dissects an urlencoded QueryString and returns a QueryList, a list of non-percent-encoded key-value pairs.

    Form-urlencoding is defined in section 4.10.21.6 of the HTML 5.2 specification and in section 4.10.22.6 of the HTML 5.0 -specification for non-UTF-8 encodings.

    See also the opposite operation compose_query/1.

    Example:

    1> uri_string:dissect_query("foo+bar=1&city=%C3%B6rebro").
    -[{"foo bar","1"},{"city","örebro"}]
    -2> uri_string:dissect_query(<<"foo+bar=1&city=%26%2326481%3B%26%2320140%3B">>).
    -[{<<"foo bar">>,<<"1">>},
    - {<<"city">>,<<230,157,177,228,186,172>>}]
    +specification for non-UTF-8 encodings.

    See also the opposite operation compose_query/1.

    Example:

    1> uri_string:dissect_query("foo+bar=1&city=%C3%B6rebro").
    +[{"foo bar","1"},{"city","örebro"}]
    +2> uri_string:dissect_query(<<"foo+bar=1&city=%26%2326481%3B%26%2320140%3B">>).
    +[{<<"foo bar">>,<<"1">>},
    + {<<"city">>,<<230,157,177,228,186,172>>}]
    @@ -712,14 +712,14 @@

    Transforms an URI into a normalized form using Syntax-Based Normalization as defined by RFC 3986.

    This function implements case normalization, percent-encoding normalization, path segment normalization and scheme based normalization for HTTP(S) with basic -support for FTP, SSH, SFTP and TFTP.

    Example:

    1> uri_string:normalize("/a/b/c/./../../g").
    +support for FTP, SSH, SFTP and TFTP.

    Example:

    1> uri_string:normalize("/a/b/c/./../../g").
     "/a/g"
    -2> uri_string:normalize(<<"mid/content=5/../6">>).
    +2> uri_string:normalize(<<"mid/content=5/../6">>).
     <<"mid/6">>
    -3> uri_string:normalize("http://localhost:80").
    +3> uri_string:normalize("http://localhost:80").
     "http://localhost/"
    -4> uri_string:normalize(#href_anchor"ss">scheme => "http",port => 80,path => "/a/b/c/./../../g",
    -4> host => "localhost-örebro"}).
    +4> uri_string:normalize(#href_anchor"ss">scheme => "http",port => 80,path => "/a/b/c/./../../g",
    +4> host => "localhost-örebro"}).
     "http://localhost-%C3%B6rebro/a/g"
    @@ -756,15 +756,15 @@

    Same as normalize/1 but with an additional Options parameter, that controls whether the normalized URI shall be returned as an -uri_map().

    There is one supported option: return_map.

    Example:

    1> uri_string:normalize("/a/b/c/./../../g", [return_map]).
    -#{path => "/a/g"}
    -2> uri_string:normalize(<<"mid/content=5/../6">>, [return_map]).
    -#{path => <<"mid/6">>}
    -3> uri_string:normalize("http://localhost:80", [return_map]).
    -#{scheme => "http",path => "/",host => "localhost"}
    -4> uri_string:normalize(#{scheme => "http",port => 80,path => "/a/b/c/./../../g",
    -4> host => "localhost-örebro"}, [return_map]).
    -#{scheme => "http",path => "/a/g",host => "localhost-örebro"}
    +uri_map().

    There is one supported option: return_map.

    Example:

    1> uri_string:normalize("/a/b/c/./../../g", [return_map]).
    +#{path => "/a/g"}
    +2> uri_string:normalize(<<"mid/content=5/../6">>, [return_map]).
    +#{path => <<"mid/6">>}
    +3> uri_string:normalize("http://localhost:80", [return_map]).
    +#{scheme => "http",path => "/",host => "localhost"}
    +4> uri_string:normalize(#{scheme => "http",port => 80,path => "/a/b/c/./../../g",
    +4> host => "localhost-örebro"}, [return_map]).
    +#{scheme => "http",path => "/a/g",host => "localhost-örebro"}
    @@ -796,14 +796,14 @@

    Parses an RFC 3986 compliant uri_string/0 into a uri_map/0, that holds the parsed components of the -URI. If parsing fails, an error tuple is returned.

    See also the opposite operation recompose/1.

    Example:

    1> uri_string:parse("foo://user@example.com:8042/over/there?name=ferret#nose").
    -#{fragment => "nose",host => "example.com",
    +URI. If parsing fails, an error tuple is returned.

    See also the opposite operation recompose/1.

    Example:

    1> uri_string:parse("foo://user@example.com:8042/over/there?name=ferret#nose").
    +#{fragment => "nose",host => "example.com",
       path => "/over/there",port => 8042,query => "name=ferret",
    -  scheme => foo,userinfo => "user"}
    -2> uri_string:parse(<<"foo://user@example.com:8042/over/there?name=ferret">>).
    -#{host => <<"example.com">>,path => <<"/over/there">>,
    +  scheme => foo,userinfo => "user"}
    +2> uri_string:parse(<<"foo://user@example.com:8042/over/there?name=ferret">>).
    +#{host => <<"example.com">>,path => <<"/over/there">>,
       port => 8042,query => <<"name=ferret">>,scheme => <<"foo">>,
    -  userinfo => <<"user">>}
    +
    userinfo => <<"user">>}
    @@ -843,15 +843,15 @@

    Decodes all percent-encoded triplets in the input that can be both a uri_string/0 and a uri_map/0.

    Note, that this function performs raw decoding and it shall be used on already parsed URI components. Applying this function directly on a standard URI can -effectively change it.

    If the input encoding is not UTF-8, an error tuple is returned.

    Example:

    1> uri_string:percent_decode(#{host => "localhost-%C3%B6rebro",path => [],
    -1> scheme => "http"}).
    -#{host => "localhost-örebro",path => [],scheme => "http"}
    -2> uri_string:percent_decode(<<"%C3%B6rebro">>).
    +effectively change it.

    If the input encoding is not UTF-8, an error tuple is returned.

    Example:

    1> uri_string:percent_decode(#{host => "localhost-%C3%B6rebro",path => [],
    +1> scheme => "http"}).
    +#{host => "localhost-örebro",path => [],scheme => "http"}
    +2> uri_string:percent_decode(<<"%C3%B6rebro">>).
     <<"örebro"/utf8>>

    Warning

    Using uri_string:percent_decode/1 directly on a URI is not safe. This example shows, that after each consecutive application of the function the -resulting URI will be changed. None of these URIs refer to the same resource.

    3> uri_string:percent_decode(<<"http://local%252Fhost/path">>).
    +resulting URI will be changed. None of these URIs refer to the same resource.

    3> uri_string:percent_decode(<<"http://local%252Fhost/path">>).
     <<"http://local%2Fhost/path">>
    -4> uri_string:percent_decode(<<"http://local%2Fhost/path">>).
    +4> uri_string:percent_decode(<<"http://local%2Fhost/path">>).
     <<"http://local/host/path">>
    @@ -884,9 +884,9 @@

    Replaces characters out of unreserved set with their percent encoded equivalents.

    Unreserved characters defined in -RFC 3986 are not quoted.

    Example:

    1> uri_string:quote("SomeId/04").
    +RFC 3986 are not quoted.

    Example:

    1> uri_string:quote("SomeId/04").
     "SomeId%2F04"
    -2> uri_string:quote(<<"SomeId/04">>).
    +2> uri_string:quote(<<"SomeId/04">>).
     <<"SomeId%2F04">>

    Warning

    Function is not aware about any URI component context and should not be used on whole URI. If applied more than once on the same data, might produce unexpected results.

    @@ -921,9 +921,9 @@

    Same as quote/1, but Safe allows user to provide a list of -characters to be protected from encoding.

    Example:

    1> uri_string:quote("SomeId/04", "/").
    +characters to be protected from encoding.

    Example:

    1> uri_string:quote("SomeId/04", "/").
     "SomeId/04"
    -2> uri_string:quote(<<"SomeId/04">>, "/").
    +2> uri_string:quote(<<"SomeId/04">>, "/").
     <<"SomeId/04">>

    Warning

    Function is not aware about any URI component context and should not be used on whole URI. If applied more than once on the same data, might produce unexpected results.

    @@ -958,13 +958,13 @@

    Creates an RFC 3986 compliant URIString (percent-encoded), based on the components of URIMap. If the -URIMap is invalid, an error tuple is returned.

    See also the opposite operation parse/1.

    Example:

    1> URIMap = #{fragment => "nose", host => "example.com", path => "/over/there",
    -1> port => 8042, query => "name=ferret", scheme => "foo", userinfo => "user"}.
    -#{fragment => "nose",host => "example.com",
    +URIMap is invalid, an error tuple is returned.

    See also the opposite operation parse/1.

    Example:

    1> URIMap = #{fragment => "nose", host => "example.com", path => "/over/there",
    +1> port => 8042, query => "name=ferret", scheme => "foo", userinfo => "user"}.
    +#{fragment => "nose",host => "example.com",
       path => "/over/there",port => 8042,query => "name=ferret",
    -  scheme => "foo",userinfo => "user"}
    +  scheme => "foo",userinfo => "user"}
     
    -2> uri_string:recompose(URIMap).
    +2> uri_string:recompose(URIMap).
     "foo://example.com:8042/over/there?name=ferret#nose"
    @@ -1001,13 +1001,13 @@

    Convert a RefURI reference that might be relative to a given base URI into the parsed components of the reference's target, which can then be recomposed to -form the target URI.

    Example:

    1> uri_string:resolve("/abs/ol/ute", "http://localhost/a/b/c?q").
    +form the target URI.

    Example:

    1> uri_string:resolve("/abs/ol/ute", "http://localhost/a/b/c?q").
     "http://localhost/abs/ol/ute"
    -2> uri_string:resolve("../relative", "http://localhost/a/b/c?q").
    +2> uri_string:resolve("../relative", "http://localhost/a/b/c?q").
     "http://localhost/a/relative"
    -3> uri_string:resolve("http://localhost/full", "http://localhost/a/b/c?q").
    +3> uri_string:resolve("http://localhost/full", "http://localhost/a/b/c?q").
     "http://localhost/full"
    -4> uri_string:resolve(#{path => "path", query => "xyz"}, "http://localhost/a/b/c?q").
    +4> uri_string:resolve(#{path => "path", query => "xyz"}, "http://localhost/a/b/c?q").
     "http://localhost/a/b/path?xyz"
    @@ -1045,11 +1045,11 @@ /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/uri_string_usage.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/uri_string_usage.html 2025-05-10 20:19:25.541339430 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/uri_string_usage.html 2025-05-10 20:19:25.549339503 +0000 @@ -180,19 +180,19 @@ to explain this by an example.

    Let's say that we would like to create the following URI and send it over the network: http://cities/örebro?foo bar. This is not a valid URI as it contains characters that are not allowed in a URI such as "ö" and the space. We can -verify this by parsing the URI:

      1> uri_string:parse("http://cities/örebro?foo bar").
    -  {error,invalid_uri,":"}

    The URI parser tries all possible combinations to interpret the input and fails +verify this by parsing the URI:

      1> uri_string:parse("http://cities/örebro?foo bar").
    +  {error,invalid_uri,":"}

    The URI parser tries all possible combinations to interpret the input and fails at the last attempt when it encounters the colon character ":". Note, that the inital fault occurs when the parser attempts to interpret the character "ö" and after a failure back-tracks to the point where it has another possible parsing alternative.

    The proper way to solve this problem is to use uri_string:recompose/1 with a -uri_map() as input:

      2> uri_string:recompose(#{scheme => "http", host => "cities", path => "/örebro",
    -  query => "foo bar"}).
    +uri_map() as input:

      2> uri_string:recompose(#{scheme => "http", host => "cities", path => "/örebro",
    +  query => "foo bar"}).
       "http://cities/%C3%B6rebro?foo%20bar"

    The result is a valid URI where all the special characters are encoded as defined by the standard. Applying uri_string:parse/1 and -uri_string:percent_decode/1 on the URI returns the original input:

      3> uri_string:percent_decode(uri_string:parse("http://cities/%C3%B6rebro?foo%20bar")).
    -  #{host => "cities",path => "/örebro",query => "foo bar",
    -  scheme => "http"}

    This symmetric property is heavily used in our property test suite.

    +uri_string:percent_decode/1 on the URI returns the original input:

      3> uri_string:percent_decode(uri_string:parse("http://cities/%C3%B6rebro?foo%20bar")).
    +  #{host => "cities",path => "/örebro",query => "foo bar",
    +  scheme => "http"}

    This symmetric property is heavily used in our property test suite.

    @@ -215,27 +215,27 @@ question the library provides a utility function, uri_string:allowed_characters/0, that lists the allowed set of characters in each major URI component, and also in the -most important standard character sets.

        1> uri_string:allowed_characters().
    -    [{scheme,
    -     "+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"},
    -    {userinfo,
    -     "!$%&'()*+,-.0123456789:;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {host,
    -     "!$&'()*+,-.0123456789:;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {ipv4,".0123456789"},
    -    {ipv6,".0123456789:ABCDEFabcdef"},
    -    {regname,
    -     "!$%&'()*+,-.0123456789;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {path,
    -     "!$%&'()*+,-./0123456789:;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {query,
    -     "!$%&'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {fragment,
    -     "!$%&'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {reserved,"!#$&'()*+,/:;=?@[]"},
    -    {unreserved,
    -     "-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"}]

    If a URI component has a character that is not allowed, it will be -percent-encoded when the URI is produced:

        2> uri_string:recompose(#{scheme => "https", host => "local#host", path => ""}).
    +most important standard character sets.

        1> uri_string:allowed_characters().
    +    [{scheme,
    +     "+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"},
    +    {userinfo,
    +     "!$%&'()*+,-.0123456789:;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {host,
    +     "!$&'()*+,-.0123456789:;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {ipv4,".0123456789"},
    +    {ipv6,".0123456789:ABCDEFabcdef"},
    +    {regname,
    +     "!$%&'()*+,-.0123456789;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {path,
    +     "!$%&'()*+,-./0123456789:;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {query,
    +     "!$%&'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {fragment,
    +     "!$%&'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {reserved,"!#$&'()*+,/:;=?@[]"},
    +    {unreserved,
    +     "-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"}]

    If a URI component has a character that is not allowed, it will be +percent-encoded when the URI is produced:

        2> uri_string:recompose(#{scheme => "https", host => "local#host", path => ""}).
         "https://local%23host"

    Consuming a URI containing percent-encoded triplets can take many steps. The following example shows how to handle an input URI that is not normalized and contains multiple percent-encoded triplets. First, the input @@ -247,32 +247,32 @@ You can try to normalize the input with uri_string:normalize/1. The normalize operation decodes those percent-encoded triplets that correspond to a character in the unreserved set. Normalization is a safe, idempotent operation that -converts a URI into its canonical form:

        4> uri_string:normalize("http://%6C%6Fcal%23host/%F6re%26bro%20").
    +converts a URI into its canonical form:

        4> uri_string:normalize("http://%6C%6Fcal%23host/%F6re%26bro%20").
         "http://local%23host/%F6re%26bro%20"
    -    5> uri_string:normalize("http://%6C%6Fcal%23host/%F6re%26bro%20", [return_map]).
    -    #{host => "local%23host",path => "/%F6re%26bro%20",
    -      scheme => "http"}

    There are still a few percent-encoded triplets left in the output. At this + 5> uri_string:normalize("http://%6C%6Fcal%23host/%F6re%26bro%20", [return_map]). + #{host => "local%23host",path => "/%F6re%26bro%20", + scheme => "http"}

    There are still a few percent-encoded triplets left in the output. At this point, when the URI is already parsed, it is safe to apply application specific decoding on the remaining character triplets. Erlang/OTP provides a function, uri_string:percent_decode/1 for raw percent decoding that you can use on the -host and path components, or on the whole map:

        6> uri_string:percent_decode("local%23host").
    +host and path components, or on the whole map:

        6> uri_string:percent_decode("local%23host").
         "local#host"
    -    7> uri_string:percent_decode("/%F6re%26bro%20").
    -    {error,invalid_utf8,<<"/öre&bro ">>}
    -    8> uri_string:percent_decode(#{host => "local%23host",path => "/%F6re%26bro%20",
    -    scheme => "http"}).
    -    {error,{invalid,{path,{invalid_utf8,<<"/öre&bro ">>}}}}

    The host was successfully decoded but the path contains at least one character + 7> uri_string:percent_decode("/%F6re%26bro%20"). + {error,invalid_utf8,<<"/öre&bro ">>} + 8> uri_string:percent_decode(#{host => "local%23host",path => "/%F6re%26bro%20", + scheme => "http"}). + {error,{invalid,{path,{invalid_utf8,<<"/öre&bro ">>}}}}

    The host was successfully decoded but the path contains at least one character with non-UTF-8 encoding. In order to be able to decode this, you have to make assumptions about the encoding used in these triplets. The most obvious choice is latin-1, so you can try uri_string:transcode/2, to transcode the path to -UTF-8 and run the percent-decode operation on the transcoded string:

        9> uri_string:transcode("/%F6re%26bro%20", [{in_encoding, latin1}]).
    +UTF-8 and run the percent-decode operation on the transcoded string:

        9> uri_string:transcode("/%F6re%26bro%20", [{in_encoding, latin1}]).
         "/%C3%B6re%26bro%20"
    -    10> uri_string:percent_decode("/%C3%B6re%26bro%20").
    +    10> uri_string:percent_decode("/%C3%B6re%26bro%20").
         "/öre&bro "

    It is important to emphasize that it is not safe to apply -uri_string:percent_decode/1 directly on an input URI:

        11> uri_string:percent_decode("http://%6C%6Fcal%23host/%C3%B6re%26bro%20").
    +uri_string:percent_decode/1 directly on an input URI:

        11> uri_string:percent_decode("http://%6C%6Fcal%23host/%C3%B6re%26bro%20").
         "http://local#host/öre&bro "
    -    12> uri_string:parse("http://local#host/öre&bro ").
    -    {error,invalid_uri,":"}

    Note

    Percent-encoding is implemented in uri_string:recompose/1 and it happens + 12> uri_string:parse("http://local#host/öre&bro "). + {error,invalid_uri,":"}

    Note

    Percent-encoding is implemented in uri_string:recompose/1 and it happens when converting a uri_map() into a uri_string(). Applying any percent-encoding directly on an input URI would not be safe just as in the case of @@ -368,7 +368,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/win32reg.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/win32reg.html 2025-05-10 20:19:25.573339720 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/win32reg.html 2025-05-10 20:19:25.577339757 +0000 @@ -918,7 +918,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/zip.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/zip.html 2025-05-10 20:19:25.613340083 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2.2/doc/html/zip.html 2025-05-10 20:19:25.629340228 +0000 @@ -1054,28 +1054,28 @@ archive. The iteration can be ended prematurely in a controlled manner by throwing an exception.

    Example:

    > Name = "dummy.zip".
     "dummy.zip"
    -> {ok, {Name, Bin}} = zip:create(Name, [{"foo", <<"FOO">>}, {"bar", <<"BAR">>}], [memory]).
    -{ok,{"dummy.zip",
    +> {ok, {Name, Bin}} = zip:create(Name, [{"foo", <<"FOO">>}, {"bar", <<"BAR">>}], [memory]).
    +{ok,{"dummy.zip",
          <<80,75,3,4,20,0,0,0,0,0,74,152,97,60,171,39,212,26,3,0,
    -       0,0,3,0,0,...>>}}
    -> {ok, FileSpec} = zip:foldl(fun(N, I, B, Acc) -> [{N, B(), I()} | Acc] end, [], {Name, Bin}).
    -{ok,[{"bar",<<"BAR">>,
    -      {file_info,3,regular,read_write,
    -                 {{2010,3,1},{19,2,10}},
    -                 {{2010,3,1},{19,2,10}},
    -                 {{2010,3,1},{19,2,10}},
    -                 54,1,0,0,0,0,0}},
    -     {"foo",<<"FOO">>,
    -      {file_info,3,regular,read_write,
    -                 {{2010,3,1},{19,2,10}},
    -                 {{2010,3,1},{19,2,10}},
    -                 {{2010,3,1},{19,2,10}},
    -                 54,1,0,0,0,0,0}}]}
    -> {ok, {Name, Bin}} = zip:create(Name, lists:reverse(FileSpec), [memory]).
    -{ok,{"dummy.zip",
    +       0,0,3,0,0,...>>}}
    +> {ok, FileSpec} = zip:foldl(fun(N, I, B, Acc) -> [{N, B(), I()} | Acc] end, [], {Name, Bin}).
    +{ok,[{"bar",<<"BAR">>,
    +      {file_info,3,regular,read_write,
    +                 {{2010,3,1},{19,2,10}},
    +                 {{2010,3,1},{19,2,10}},
    +                 {{2010,3,1},{19,2,10}},
    +                 54,1,0,0,0,0,0}},
    +     {"foo",<<"FOO">>,
    +      {file_info,3,regular,read_write,
    +                 {{2010,3,1},{19,2,10}},
    +                 {{2010,3,1},{19,2,10}},
    +                 {{2010,3,1},{19,2,10}},
    +                 54,1,0,0,0,0,0}}]}
    +> {ok, {Name, Bin}} = zip:create(Name, lists:reverse(FileSpec), [memory]).
    +{ok,{"dummy.zip",
          <<80,75,3,4,20,0,0,0,0,0,74,152,97,60,171,39,212,26,3,0,
    -       0,0,3,0,0,...>>}}
    -> catch zip:foldl(fun("foo", _, B, _) -> throw(B()); (_,_,_,Acc) -> Acc end, [], {Name, Bin}).
    +       0,0,3,0,0,...>>}}
    +> catch zip:foldl(fun("foo", _, B, _) -> throw(B()); (_,_,_,Acc) -> Acc end, [], {Name, Bin}).
     <<"FOO">>
    @@ -1683,7 +1683,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/404.html 2025-05-10 20:19:25.649340410 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/404.html 2025-05-10 20:19:25.649340410 +0000 @@ -143,7 +143,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/api-reference.html 2025-05-10 20:19:25.669340591 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/api-reference.html 2025-05-10 20:19:25.669340591 +0000 @@ -253,7 +253,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/chapter.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/chapter.html 2025-05-10 20:19:25.689340772 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/chapter.html 2025-05-10 20:19:25.693340808 +0000 @@ -181,7 +181,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/epp_dodger.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/epp_dodger.html 2025-05-10 20:19:25.717341026 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/epp_dodger.html 2025-05-10 20:19:25.725341098 +0000 @@ -891,7 +891,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/erl_comment_scan.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/erl_comment_scan.html 2025-05-10 20:19:25.745341280 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/erl_comment_scan.html 2025-05-10 20:19:25.749341316 +0000 @@ -449,7 +449,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/erl_prettypr.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/erl_prettypr.html 2025-05-10 20:19:25.773341534 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/erl_prettypr.html 2025-05-10 20:19:25.781341606 +0000 @@ -1013,7 +1013,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/erl_recomment.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/erl_recomment.html 2025-05-10 20:19:25.801341788 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/erl_recomment.html 2025-05-10 20:19:25.805341824 +0000 @@ -391,7 +391,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/erl_syntax.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/erl_syntax.html 2025-05-10 20:19:25.929342948 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/erl_syntax.html 2025-05-10 20:19:25.985343456 +0000 @@ -6854,10 +6854,10 @@

    Returns the associated post-comments of a node.

    This is a possibly empty list of abstract comments, in top-down textual order. When the code is formatted, post-comments are typically -displayed to the right of and/or below the node. For example:

    {foo, X, Y}     % Post-comment of tuple

    If possible, the comment should be moved past any following separator characters +displayed to the right of and/or below the node. For example:

    {foo, X, Y}     % Post-comment of tuple

    If possible, the comment should be moved past any following separator characters on the same line, rather than placing the separators on the following line. -For example:

    foo([X | Xs], Y) ->
    -    foo(Xs, bar(X));     % Post-comment of 'bar(X)' node
    +For example:

    foo([X | Xs], Y) ->
    +    foo(Xs, bar(X));     % Post-comment of 'bar(X)' node
      ...

    (where the comment is moved past the rightmost ")" and the ";").

    See also: comment/2, get_attrs/1, get_precomments/1, set_postcomments/2.

    @@ -6890,10 +6890,10 @@

    Returns the associated pre-comments of a node.

    This is a possibly empty list of abstract comments, in top-down textual order. When the code is formatted, pre-comments are typically displayed directly above the node. For example:

    % Pre-comment of function
    -foo(X) -> {bar, X}.

    If possible, the comment should be moved before any preceding separator -characters on the same line. For example:

    foo([X | Xs]) ->
    +foo(X) -> {bar, X}.

    If possible, the comment should be moved before any preceding separator +characters on the same line. For example:

    foo([X | Xs]) ->
         % Pre-comment of 'bar(X)' node
    -    [bar(X) | foo(Xs)];
    +    [bar(X) | foo(Xs)];
     ...

    (where the comment is moved before the "[").

    See also: comment/2, get_attrs/1, get_postcomments/1, set_precomments/2.

    @@ -12151,7 +12151,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/erl_syntax_lib.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/erl_syntax_lib.html 2025-05-10 20:19:26.053344072 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/erl_syntax_lib.html 2025-05-10 20:19:26.053344072 +0000 @@ -2502,7 +2502,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/merl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/merl.html 2025-05-10 20:19:26.101344508 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/merl.html 2025-05-10 20:19:26.101344508 +0000 @@ -138,30 +138,30 @@ Quick start

    To enable the full power of Merl, your module needs to include the Merl header -file:

    -include_lib("syntax_tools/include/merl.hrl").

    Then, you can use the ?Q(Text) macros in your code to create ASTs or match on -existing ASTs. For example:

    Tuple = ?Q("{foo, 42}"),
    -?Q("{foo, _@Number}") = Tuple,
    -Call = ?Q("foo:bar(_@Number)")

    Calling merl:print(Call) will then print the following code:

    foo:bar(42)

    The ?Q macros turn the quoted code fragments into ASTs, and lifts +file:

    -include_lib("syntax_tools/include/merl.hrl").

    Then, you can use the ?Q(Text) macros in your code to create ASTs or match on +existing ASTs. For example:

    Tuple = ?Q("{foo, 42}"),
    +?Q("{foo, _@Number}") = Tuple,
    +Call = ?Q("foo:bar(_@Number)")

    Calling merl:print(Call) will then print the following code:

    foo:bar(42)

    The ?Q macros turn the quoted code fragments into ASTs, and lifts metavariables such as _@Tuple and _@Number to the level of your Erlang code, so you can use the corresponding Erlang variables Tuple and Number directly. This is the most straightforward way to use Merl, and in many cases it's all you need.

    You can even write case switches using ?Q macros as patterns. For example:

    case AST of
    -    ?Q("{foo, _@Foo}") -> handle(Foo);
    -    ?Q("{bar, _@Bar}") when erl_syntax:is_integer(Bar) -> handle(Bar);
    -    _ -> handle_default()
    +    ?Q("{foo, _@Foo}") -> handle(Foo);
    +    ?Q("{bar, _@Bar}") when erl_syntax:is_integer(Bar) -> handle(Bar);
    +    _ -> handle_default()
     end

    These case switches only allow ?Q(...) or _ as clause patterns, and the guards may contain any expressions, not just Erlang guard expressions.

    If the macro MERL_NO_TRANSFORM is defined before the merl.hrl header file is included, the parse transform used by Merl will be disabled, and in that case, the match expressions ?Q(...) = ..., case switches using ?Q(...) patterns, and automatic metavariables like _@Tuple cannot be used in your code, but the Merl macros and functions still work. To do metavariable substitution, you need -to use the ?Q(Text, Map) macro. For example:

    Tuple = ?Q("{foo, _@bar, _@baz}", [{bar, Bar}, {baz,Baz}])

    The text given to a ?Q(Text) macro can be either a single string or a list of +to use the ?Q(Text, Map) macro. For example:

    Tuple = ?Q("{foo, _@bar, _@baz}", [{bar, Bar}, {baz,Baz}])

    The text given to a ?Q(Text) macro can be either a single string or a list of strings. The latter is useful when you need to split a long expression over -multiple lines. For example:

    ?Q(["case _@Expr of",
    +multiple lines. For example:

    ?Q(["case _@Expr of",
         "  {foo, X} -> f(X);",
         "  {bar, X} -> g(X)",
         "  _ -> h(X)"
    -"end"])

    If there is a syntax error somewhere in the text (like the missing semicolon in +"end"])

    If there is a syntax error somewhere in the text (like the missing semicolon in the second clause above) this allows Merl to generate an error message pointing to the exact line in your source code. (Just remember to comma-separate the strings in the list, otherwise Erlang will concatenate the string fragments as @@ -184,23 +184,23 @@ uppercase character, as in _@Foo or _@_@Foo, it will become a variable on the Erlang level, and can be used to easily deconstruct and construct syntax trees:

    case Input of
    -    ?Q("{foo, _@Number}") -> ?Q("foo:bar(_@Number)");
    +    ?Q("{foo, _@Number}") -> ?Q("foo:bar(_@Number)");
         ...

    We refer to these as "automatic metavariables". If in addition the name ends with @, as in _@Foo@, the value of the variable as an Erlang term will be automatically converted to the corresponding abstract syntax tree when used to -construct a larger tree. For example, in:

    Bar = {bar, 42},
    -Foo = ?Q("{foo, _@Bar@}")

    (where Bar is just some term, not a syntax tree) the result Foo will be a +construct a larger tree. For example, in:

    Bar = {bar, 42},
    +Foo = ?Q("{foo, _@Bar@}")

    (where Bar is just some term, not a syntax tree) the result Foo will be a syntax tree representing {foo, {bar, 42}}. This avoids the need for temporary -variables in order to inject data, as in

    TmpBar = erl_syntax:abstract(Bar),
    -Foo = ?Q("{foo, _@TmpBar}")

    If the context requires an integer rather than a variable, an atom, or a string, +variables in order to inject data, as in

    TmpBar = erl_syntax:abstract(Bar),
    +Foo = ?Q("{foo, _@TmpBar}")

    If the context requires an integer rather than a variable, an atom, or a string, you cannot use the uppercase convention to mark an automatic metavariable. Instead, if the integer (without the 909-prefix and lift/glob markers) ends in a 9, the integer will become an Erlang-level variable prefixed with Q, and if it ends with 99 it will also be automatically abstracted. For example, the following will increment the arity of the exported function f:

    case Form of
    -    ?Q("-export([f/90919]).") ->
    -        Q2 = erl_syntax:concrete(Q1) + 1,
    -        ?Q("-export([f/909299]).");
    +    ?Q("-export([f/90919]).") ->
    +        Q2 = erl_syntax:concrete(Q1) + 1,
    +        ?Q("-export([f/909299]).");
         ...

    @@ -209,40 +209,40 @@

    Merl can only parse a fragment of text if it follows the basic syntactical rules of Erlang. In most places, a normal Erlang variable can be used as metavariable, -for example:

    ?Q("f(_@Arg)") = Expr

    but if you want to match on something like the name of a function, you have to -use an atom as metavariable:

    ?Q("'@Name'() -> _@@_." = Function

    (note the anonymous glob variable _@@_ to ignore the function body).

    In some contexts, only a string or an integer is allowed. For example, the +for example:

    ?Q("f(_@Arg)") = Expr

    but if you want to match on something like the name of a function, you have to +use an atom as metavariable:

    ?Q("'@Name'() -> _@@_." = Function

    (note the anonymous glob variable _@@_ to ignore the function body).

    In some contexts, only a string or an integer is allowed. For example, the directive -file(Name, Line) requires that Name is a string literal and -Line an integer literal:

    ?Q("-file(\"'@File\", 9090).") = ?Q("-file(\"foo.erl\", 42).")).

    This will extract the string literal "foo.erl" into the variable Foo. Note +Line an integer literal:

    ?Q("-file(\"'@File\", 9090).") = ?Q("-file(\"foo.erl\", 42).")).

    This will extract the string literal "foo.erl" into the variable Foo. Note the use of the anonymous variable 9090 to ignore the line number. To match and also bind a metavariable that must be an integer literal, we can use the convention of ending the integer with a 9, turning it into a Q-prefixed variable on the Erlang level (see the previous section).

    Globs

    Whenever you want to match out a number of elements in a sequence (zero or more) -rather than a fixed set of elements, you need to use a glob. For example:

    ?Q("{_@@Elements}") = ?Q({a, b, c})

    will bind Elements to the list of individual syntax trees representing the atoms +rather than a fixed set of elements, you need to use a glob. For example:

    ?Q("{_@@Elements}") = ?Q({a, b, c})

    will bind Elements to the list of individual syntax trees representing the atoms a, b, and c. This can also be used with static prefix and suffix elements -in the sequence. For example:

    ?Q("{a, b, _@@Elements}") = ?Q({a, b, c, d})

    will bind Elements to the list of the c and d subtrees, and

    ?Q("{_@@Elements, c, d}") = ?Q({a, b, c, d})

    will bind Elements to the list of the a and b subtrees. You can even use -plain metavariables in the prefix or suffix:

    ?Q("{_@First, _@@Rest}") = ?Q({a, b, c})

    or

    ?Q("{_@@_, _@Last}") = ?Q({a, b, c})

    (ignoring all but the last element). However, you cannot have two globs as part +in the sequence. For example:

    ?Q("{a, b, _@@Elements}") = ?Q({a, b, c, d})

    will bind Elements to the list of the c and d subtrees, and

    ?Q("{_@@Elements, c, d}") = ?Q({a, b, c, d})

    will bind Elements to the list of the a and b subtrees. You can even use +plain metavariables in the prefix or suffix:

    ?Q("{_@First, _@@Rest}") = ?Q({a, b, c})

    or

    ?Q("{_@@_, _@Last}") = ?Q({a, b, c})

    (ignoring all but the last element). However, you cannot have two globs as part of the same sequence.

    Lifted metavariables

    In some cases, the Erlang syntax rules make it impossible to place a -metavariable directly where you would like it. For example, you cannot write:

    ?Q("-export([_@@Name]).")

    to match out all name/arity pairs in the export list, or to insert a list of +metavariable directly where you would like it. For example, you cannot write:

    ?Q("-export([_@@Name]).")

    to match out all name/arity pairs in the export list, or to insert a list of exports in a declaration, because the Erlang parser only allows elements on the form A/I (where A is an atom and I an integer) in the export list. A variable like the above is not allowed, but neither is a single atom or integer, so '@@Name' or 909919 would not work either.

    What you have to do in such cases is to write your metavariable in a syntactically valid position, and use lifting markers to denote where it should -really apply, as in:

    ?Q("-export(['@_@Name'/0]).")

    This causes the variable to be lifted (after parsing) to the next higher level +really apply, as in:

    ?Q("-export(['@_@Name'/0]).")

    This causes the variable to be lifted (after parsing) to the next higher level in the syntax tree, replacing that entire subtree. In this case, the '@_@Name'/0 will be replaced with '@@Name', and the /0 part was just used as dummy notation and will be discarded.

    You may even need to apply lifting more than once. To match the entire export -list as a single syntax tree, you can write:

    ?Q("-export(['@__Name'/0]).")

    using two underscores, but with no glob marker this time. This will make the +list as a single syntax tree, you can write:

    ?Q("-export(['@__Name'/0]).")

    using two underscores, but with no glob marker this time. This will make the entire ['@__Name'/0] part be replaced with '@Name'.

    Sometimes, the tree structure of a code fragment is not very obvious, and parts of the structure may be invisible when printed as source code. For instance, a -simple function definition like the following:

    zero() -> 0.

    consists of the name (the atom zero), and a list of clauses containing the +simple function definition like the following:

    zero() -> 0.

    consists of the name (the atom zero), and a list of clauses containing the single clause () -> 0. The clause consists of an argument list (empty), a guard (empty), and a body (which is always a list of expressions) containing the single expression 0. This means that to match out the name and the list of clauses of any function, you'll need to use a pattern like ?Q("'@Name'() -> _@_@Body."), using a dummy clause whose body is a glob lifted one level.

    To visualize the structure of a syntax tree, you can use the function -merl:show(T), which prints a summary. For example, entering

    merl:show(merl:quote("inc(X, Y) when Y > 0 -> X + Y."))

    in the Erlang shell will print the following (where the + signs separate +merl:show(T), which prints a summary. For example, entering

    merl:show(merl:quote("inc(X, Y) when Y > 0 -> X + Y."))

    in the Erlang shell will print the following (where the + signs separate groups of subtrees on the same level):

    function: inc(X, Y) when ... -> X + Y.
       atom: inc
       +
    @@ -1776,7 +1776,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/merl_transform.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/merl_transform.html 2025-05-10 20:19:26.125344724 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/merl_transform.html 2025-05-10 20:19:26.125344724 +0000 @@ -156,7 +156,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/notes.html 2025-05-10 20:19:26.149344942 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/notes.html 2025-05-10 20:19:26.157345015 +0000 @@ -922,7 +922,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/prettypr.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/prettypr.html 2025-05-10 20:19:26.185345269 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/prettypr.html 2025-05-10 20:19:26.193345342 +0000 @@ -1170,7 +1170,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/search.html 2025-05-10 20:19:26.209345486 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.2/doc/html/search.html 2025-05-10 20:19:26.213345523 +0000 @@ -141,7 +141,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/404.html 2025-05-10 20:19:26.229345668 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/404.html 2025-05-10 20:19:26.233345704 +0000 @@ -147,7 +147,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/api-reference.html 2025-05-10 20:19:26.253345885 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/api-reference.html 2025-05-10 20:19:26.253345885 +0000 @@ -194,7 +194,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/getting_started.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/getting_started.html 2025-05-10 20:19:26.273346067 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/getting_started.html 2025-05-10 20:19:26.277346103 +0000 @@ -128,9 +128,9 @@

    The start/1 function starts a daemon process listening for UDP packets on a port. When it receives a request for read or write, it spawns a temporary server process handling the transfer.

    This is a simple example of starting the TFTP server and reading the content of -a sample file using the TFTP client.

    Step 1. Create a sample file to be used for the transfer:

          $ echo "Erlang/OTP 21" > file.txt

    Step 2. Start the TFTP server:

          1> {ok, Pid} = tftp:start([{port, 19999}]).
    -      {ok,<0.65.0>}

    Step 3. Start the TFTP client (in another shell):

          1> tftp:read_file("file.txt", binary, [{port, 19999}]).
    -      {ok,<<"Erlang/OTP 21\n">>}
    +a sample file using the TFTP client.

    Step 1. Create a sample file to be used for the transfer:

          $ echo "Erlang/OTP 21" > file.txt

    Step 2. Start the TFTP server:

          1> {ok, Pid} = tftp:start([{port, 19999}]).
    +      {ok,<0.65.0>}

    Step 3. Start the TFTP client (in another shell):

          1> tftp:read_file("file.txt", binary, [{port, 19999}]).
    +      {ok,<<"Erlang/OTP 21\n">>}
    @@ -172,7 +172,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/introduction.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/introduction.html 2025-05-10 20:19:26.297346285 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/introduction.html 2025-05-10 20:19:26.297346285 +0000 @@ -189,7 +189,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/notes.html 2025-05-10 20:19:26.317346466 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/notes.html 2025-05-10 20:19:26.321346502 +0000 @@ -312,7 +312,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/search.html 2025-05-10 20:19:26.341346683 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/search.html 2025-05-10 20:19:26.341346683 +0000 @@ -145,7 +145,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp.epub/OEBPS/content.opf 2025-05-10 20:19:26.361346865 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp.epub/OEBPS/content.opf 2025-05-10 20:19:26.365346901 +0000 @@ -4,10 +4,10 @@ version="3.0"> tftp - 1.2.2 - urn:uuid:e758d4bd-75e9-52c7-f010-70ca6184d25f + urn:uuid:5fb9f7dd-8235-052f-21fd-1145580bbd13 en - 2025-05-10T20:12:11Z + 2041-06-12T09:32:16Z /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp.epub/OEBPS/getting_started.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp.epub/OEBPS/getting_started.xhtml 2025-05-10 20:19:26.361346865 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp.epub/OEBPS/getting_started.xhtml 2025-05-10 20:19:26.365346901 +0000 @@ -23,9 +23,9 @@

    The start/1 function starts a daemon process listening for UDP packets on a port. When it receives a request for read or write, it spawns a temporary server process handling the transfer.

    This is a simple example of starting the TFTP server and reading the content of -a sample file using the TFTP client.

    Step 1. Create a sample file to be used for the transfer:

          $ echo "Erlang/OTP 21" > file.txt

    Step 2. Start the TFTP server:

          1> {ok, Pid} = tftp:start([{port, 19999}]).
    -      {ok,<0.65.0>}

    Step 3. Start the TFTP client (in another shell):

          1> tftp:read_file("file.txt", binary, [{port, 19999}]).
    -      {ok,<<"Erlang/OTP 21\n">>}
    +a sample file using the TFTP client.

    Step 1. Create a sample file to be used for the transfer:

          $ echo "Erlang/OTP 21" > file.txt

    Step 2. Start the TFTP server:

          1> {ok, Pid} = tftp:start([{port, 19999}]).
    +      {ok,<0.65.0>}

    Step 3. Start the TFTP client (in another shell):

          1> tftp:read_file("file.txt", binary, [{port, 19999}]).
    +      {ok,<<"Erlang/OTP 21\n">>}
    /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp.epub/OEBPS/tftp.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp.epub/OEBPS/tftp.xhtml 2025-05-10 20:19:26.361346865 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp.epub/OEBPS/tftp.xhtml 2025-05-10 20:19:26.365346901 +0000 @@ -29,7 +29,7 @@ Overwiew

    -

    This is a complete implementation of the following IETF standards:

    RFC 1350, The TFTP Protocol (revision 2).
    +

    This is a complete implementation of the following IETF standards:

    RFC 1350, The TFTP Protocol (revision 2).
     RFC 2347, TFTP Option Extension.
     RFC 2348, TFTP Blocksize Option.
     RFC 2349, TFTP Timeout Interval and Transfer Size Options.

    The only feature that not is implemented in this release is /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp.html 2025-05-10 20:19:26.421347409 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp.html 2025-05-10 20:19:26.429347481 +0000 @@ -134,7 +134,7 @@ Overwiew -

    This is a complete implementation of the following IETF standards:

    RFC 1350, The TFTP Protocol (revision 2).
    +

    This is a complete implementation of the following IETF standards:

    RFC 1350, The TFTP Protocol (revision 2).
     RFC 2347, TFTP Option Extension.
     RFC 2348, TFTP Blocksize Option.
     RFC 2349, TFTP Timeout Interval and Transfer Size Options.

    The only feature that not is implemented in this release is @@ -964,7 +964,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp_logger.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp_logger.html 2025-05-10 20:19:26.449347662 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp_logger.html 2025-05-10 20:19:26.453347699 +0000 @@ -311,7 +311,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/404.html 2025-05-10 20:19:26.469347844 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/404.html 2025-05-10 20:19:26.469347844 +0000 @@ -147,7 +147,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/api-reference.html 2025-05-10 20:19:26.489348025 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/api-reference.html 2025-05-10 20:19:26.493348061 +0000 @@ -260,7 +260,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cover.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cover.html 2025-05-10 20:19:26.533348424 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cover.html 2025-05-10 20:19:26.545348533 +0000 @@ -1561,7 +1561,7 @@ call is equivalent to analyse('_', coverage, Arg).

    Otherwise Arg is assumed to be a module name, and this call is equivalent to analyse(Arg, coverage, function).

    Note

    To analyze a module whose name overlaps with one the values in analysis() or level(), the module -name has to be in a list. For example, to analyze a module named calls:

    cover:analyse([calls]).
    +name has to be in a list. For example, to analyze a module named calls:

    cover:analyse([calls]).
    @@ -1603,7 +1603,7 @@ analyse(Arg1, Arg2, function).

    If Arg2 is one of the values in level(), Arg1 is assumed to be a module and this call is equivalent to analyse(Arg1, coverage, Arg2).

    Note

    To analyze a module whose name overlaps with one of the values in analysis(), the module name needs to be in a -list. For example, to analyze a module named calls:

    cover:analyse([calls], function).
    +list. For example, to analyze a module named calls:

    cover:analyse([calls], function).
    @@ -1712,7 +1712,7 @@ options, this call is equivalent to analyse_to_file('_', Arg).

    Otherwise Arg is assumed to be a module, and this call is equivalent to analyse_to_file(Arg, []).

    Note

    To analyze a module of the name html (which overlaps with an option in analyse_option()), it is necessary to -use cover:analyse_to_file/2:

    cover:analyse_to_file([html], []).
    +use cover:analyse_to_file/2:

    cover:analyse_to_file([html], []).
    @@ -2705,7 +2705,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cover_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cover_chapter.html 2025-05-10 20:19:26.593348968 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cover_chapter.html 2025-05-10 20:19:26.589348932 +0000 @@ -146,81 +146,81 @@ Example -

    Assume that a test case for the following program should be verified:

    -module(channel).
    --behaviour(gen_server).
    +

    Assume that a test case for the following program should be verified:

    -module(channel).
    +-behaviour(gen_server).
     
    --export([start_link/0,stop/0]).
    --export([alloc/0,free/1]). % client interface
    --export([init/1,handle_call/3,terminate/2]). % callback functions
    +-export([start_link/0,stop/0]).
    +-export([alloc/0,free/1]). % client interface
    +-export([init/1,handle_call/3,terminate/2]). % callback functions
     
    -start_link() ->
    -    gen_server:start_link({local,channel}, channel, [], []).
    +start_link() ->
    +    gen_server:start_link({local,channel}, channel, [], []).
     
    -stop() ->
    -    gen_server:call(channel, stop).
    +stop() ->
    +    gen_server:call(channel, stop).
     
     %%%-Client interface functions-------------------------------------------
     
    -alloc() ->
    -    gen_server:call(channel, alloc).
    +alloc() ->
    +    gen_server:call(channel, alloc).
     
    -free(Channel) ->
    -    gen_server:call(channel, {free,Channel}).
    +free(Channel) ->
    +    gen_server:call(channel, {free,Channel}).
     
     %%%-gen_server callback functions----------------------------------------
     
    -init(_Arg) ->
    -    {ok,channels()}.
    +init(_Arg) ->
    +    {ok,channels()}.
     
    -handle_call(stop, _Client, Channels) ->
    -    {stop,normal,ok,Channels};
    +handle_call(stop, _Client, Channels) ->
    +    {stop,normal,ok,Channels};
     
    -handle_call(alloc, _Client, Channels) ->
    -    {Ch,Channels2} = alloc(Channels),
    -    {reply,{ok,Ch},Channels2};
    +handle_call(alloc, _Client, Channels) ->
    +    {Ch,Channels2} = alloc(Channels),
    +    {reply,{ok,Ch},Channels2};
     
    -handle_call({free,Channel}, _Client, Channels) ->
    -    Channels2 = free(Channel, Channels),
    -    {reply,ok,Channels2}.
    +handle_call({free,Channel}, _Client, Channels) ->
    +    Channels2 = free(Channel, Channels),
    +    {reply,ok,Channels2}.
     
    -terminate(_Reason, _Channels) ->
    +terminate(_Reason, _Channels) ->
         ok.
     
     %%%-Internal functions---------------------------------------------------
     
    -channels() ->
    -    [ch1,ch2,ch3].
    +channels() ->
    +    [ch1,ch2,ch3].
     
    -alloc([Channel|Channels]) ->
    -    {Channel,Channels};
    -alloc([]) ->
    +alloc([Channel|Channels]) ->
    +    {Channel,Channels};
    +alloc([]) ->
         false.
     
    -free(Channel, Channels) ->
    -    [Channel|Channels].

    The test case is implemented as follows:

    -module(test).
    --export([s/0]).
    -
    -s() ->
    -    {ok,Pid} = channel:start_link(),
    -    {ok,Ch1} = channel:alloc(),
    -    ok = channel:free(Ch1),
    -    ok = channel:stop().

    +free(Channel, Channels) -> + [Channel|Channels].

    The test case is implemented as follows:

    -module(test).
    +-export([s/0]).
    +
    +s() ->
    +    {ok,Pid} = channel:start_link(),
    +    {ok,Ch1} = channel:alloc(),
    +    ok = channel:free(Ch1),
    +    ok = channel:stop().

    Preparation

    First of all, Cover must be started. This spawns a process which owns the Cover -database where all coverage data will be stored.

    1> cover:start().
    -{ok,<0.90.0>}

    To include other nodes in the coverage analysis, use +database where all coverage data will be stored.

    1> cover:start().
    +{ok,<0.90.0>}

    To include other nodes in the coverage analysis, use cover:start/1. All cover-compiled modules will then be loaded on all nodes, and data from all nodes will be summed up when analysing. For simplicity this example only involves the current node.

    Before any analysis can take place, the involved modules must be cover-compiled. This means that some extra information is added to the module before beging compiled into a binary and loaded. The source file of the module is -not affected and no .beam file is created.

    2> cover:compile_module(channel).
    -{ok,channel}

    Each time a function in the cover-compiled module channel is called, +not affected and no .beam file is created.

    2> cover:compile_module(channel).
    +{ok,channel}

    Each time a function in the cover-compiled module channel is called, information about the call will be added to the Cover database. Run the test case:

    3> test:s().
     ok

    Cover analysis is performed by examining the contents of the Cover database. The @@ -238,56 +238,56 @@ {Cov,NotCov}, where Cov is the number of executable lines that have been executed at least once and NotCov is the number of executable lines that have not been executed.

    If the analysis is made on module level, the result is given for the entire -module as a tuple {Module,{Cov,NotCov}}:

    4> cover:analyse(channel, coverage, module).
    -{ok,{channel,{14,1}}}

    For channel, the result shows that 14 lines in the module are covered but one +module as a tuple {Module,{Cov,NotCov}}:

    4> cover:analyse(channel, coverage, module).
    +{ok,{channel,{14,1}}}

    For channel, the result shows that 14 lines in the module are covered but one line is not covered.

    If the analysis is made on function level, the result is given as a list of tuples {Function,{Cov,NotCov}}, one for each function in the module. A -function is specified by its module name, function name and arity:

    5> cover:analyse(channel, coverage, function).
    -{ok,[{{channel,start_link,0},{1,0}},
    -     {{channel,stop,0},{1,0}},
    -     {{channel,alloc,0},{1,0}},
    -     {{channel,free,1},{1,0}},
    -     {{channel,init,1},{1,0}},
    -     {{channel,handle_call,3},{5,0}},
    -     {{channel,terminate,2},{1,0}},
    -     {{channel,channels,0},{1,0}},
    -     {{channel,alloc,1},{1,1}},
    -     {{channel,free,2},{1,0}}]}

    For channel, the result shows that the uncovered line is in the function +function is specified by its module name, function name and arity:

    5> cover:analyse(channel, coverage, function).
    +{ok,[{{channel,start_link,0},{1,0}},
    +     {{channel,stop,0},{1,0}},
    +     {{channel,alloc,0},{1,0}},
    +     {{channel,free,1},{1,0}},
    +     {{channel,init,1},{1,0}},
    +     {{channel,handle_call,3},{5,0}},
    +     {{channel,terminate,2},{1,0}},
    +     {{channel,channels,0},{1,0}},
    +     {{channel,alloc,1},{1,1}},
    +     {{channel,free,2},{1,0}}]}

    For channel, the result shows that the uncovered line is in the function channel:alloc/1.

    If the analysis is made on clause level, the result is given as a list of tuples {Clause,{Cov,NotCov}}, one for each function clause in the module. A clause is specified by its module name, function name, arity and position within the -function definition:

    6> cover:analyse(channel, coverage, clause).
    -{ok,[{{channel,start_link,0,1},{1,0}},
    -     {{channel,stop,0,1},{1,0}},
    -     {{channel,alloc,0,1},{1,0}},
    -     {{channel,free,1,1},{1,0}},
    -     {{channel,init,1,1},{1,0}},
    -     {{channel,handle_call,3,1},{1,0}},
    -     {{channel,handle_call,3,2},{2,0}},
    -     {{channel,handle_call,3,3},{2,0}},
    -     {{channel,terminate,2,1},{1,0}},
    -     {{channel,channels,0,1},{1,0}},
    -     {{channel,alloc,1,1},{1,0}},
    -     {{channel,alloc,1,2},{0,1}},
    -     {{channel,free,2,1},{1,0}}]}

    For channel, the result shows that the uncovered line is in the second clause +function definition:

    6> cover:analyse(channel, coverage, clause).
    +{ok,[{{channel,start_link,0,1},{1,0}},
    +     {{channel,stop,0,1},{1,0}},
    +     {{channel,alloc,0,1},{1,0}},
    +     {{channel,free,1,1},{1,0}},
    +     {{channel,init,1,1},{1,0}},
    +     {{channel,handle_call,3,1},{1,0}},
    +     {{channel,handle_call,3,2},{2,0}},
    +     {{channel,handle_call,3,3},{2,0}},
    +     {{channel,terminate,2,1},{1,0}},
    +     {{channel,channels,0,1},{1,0}},
    +     {{channel,alloc,1,1},{1,0}},
    +     {{channel,alloc,1,2},{0,1}},
    +     {{channel,free,2,1},{1,0}}]}

    For channel, the result shows that the uncovered line is in the second clause of channel:alloc/1.

    Finally, if the analysis is made on line level, the result is given as a list of tuples {Line,{Cov,NotCov}}, one for each executable line in the source code. A -line is specified by its module name and line number.

    7> cover:analyse(channel, coverage, line).
    -{ok,[{{channel,9},{1,0}},
    -     {{channel,12},{1,0}},
    -     {{channel,17},{1,0}},
    -     {{channel,20},{1,0}},
    -     {{channel,25},{1,0}},
    -     {{channel,28},{1,0}},
    -     {{channel,31},{1,0}},
    -     {{channel,32},{1,0}},
    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cprof.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cprof.html	2025-05-10 20:19:26.621349222 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cprof.html	2025-05-10 20:19:26.629349294 +0000
    @@ -590,7 +590,7 @@
     
           
     
    -

    Collects and analyses all call counters for module Module.

    This function returns:

    {Module, ModuleCount, FuncAnalysisList}

    where FuncAnalysisList is a list of tuples, one for each function:

    {{Module, FunctionName, Arity}, FuncCallCount}

    If call counters are still running while analyse/0,1,2 is executing, the result +

    Collects and analyses all call counters for module Module.

    This function returns:

    {Module, ModuleCount, FuncAnalysisList}

    where FuncAnalysisList is a list of tuples, one for each function:

    {{Module, FunctionName, Arity}, FuncCallCount}

    If call counters are still running while analyse/0,1,2 is executing, the result could be inconsistent. This happens if the process executing analyse/0,1,2 is scheduled out so some other process can increment the counters that are being analysed. Calling pause() before analysing takes care of @@ -1111,7 +1111,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cprof_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cprof_chapter.html 2025-05-10 20:19:26.657349548 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cprof_chapter.html 2025-05-10 20:19:26.661349584 +0000 @@ -156,36 +156,36 @@ Example: Background work -

    From the Erlang shell:

    1> cprof:start(), cprof:pause(). % Stop counters just after start
    +

    From the Erlang shell:

    1> cprof:start(), cprof:pause(). % Stop counters just after start
     8492
    -2> cprof:analyse().
    -{539,
    - [{shell,155,
    -         [{{shell,prep_check,1},55},
    -          {{shell,used_records,4},45},
    -          {{shell,used_records,1},45},
    -          {{shell,used_record_defs,2},1},
    -          {{shell,record_defs,2},1},
    -          {{shell,record_bindings,2},1},
    -          {{shell,exprs,7},1},
    -          {{shell,expr,4},1},
    -          {{shell,expand_records,2},1},
    -          {{shell,check_command,2},1},
    -          {{shell,apply_fun,3},1},
    -          {{shell,'-exprs/7-lc$^0/1-0-',1},1},
    -          {{shell,'-eval_loop/3-fun-0-',3},1}]},
    +2> cprof:analyse().
    +{539,
    + [{shell,155,
    +         [{{shell,prep_check,1},55},
    +          {{shell,used_records,4},45},
    +          {{shell,used_records,1},45},
    +          {{shell,used_record_defs,2},1},
    +          {{shell,record_defs,2},1},
    +          {{shell,record_bindings,2},1},
    +          {{shell,exprs,7},1},
    +          {{shell,expr,4},1},
    +          {{shell,expand_records,2},1},
    +          {{shell,check_command,2},1},
    +          {{shell,apply_fun,3},1},
    +          {{shell,'-exprs/7-lc$^0/1-0-',1},1},
    +          {{shell,'-eval_loop/3-fun-0-',3},1}]},
       %% Information about many modules omitted.
                          .
                          .
                          .
       %% Here is the last part.
    -  {erts_internal,2,[{{erts_internal,trace_pattern,3},2}]},
    -  {otp_internal,1,[{{otp_internal,obsolete,3},1}]},
    -  {maps,1,[{{maps,from_list,1},1}]},
    -  {erl_internal,1,[{{erl_internal,bif,3},1}]}]}
    -3> cprof:analyse(cprof).
    -{cprof,3,[{{cprof,tr,2},2},{{cprof,pause,0},1}]}
    -4> cprof:stop().
    +  {erts_internal,2,[{{erts_internal,trace_pattern,3},2}]},
    +  {otp_internal,1,[{{otp_internal,obsolete,3},1}]},
    +  {maps,1,[{{maps,from_list,1},1}]},
    +  {erl_internal,1,[{{erl_internal,bif,3},1}]}]}
    +3> cprof:analyse(cprof).
    +{cprof,3,[{{cprof,tr,2},2},{{cprof,pause,0},1}]}
    +4> cprof:stop().
     8586

    The example showed some of the background work that the shell performs just to interpret the first command line.

    What is captured in this example is the part of the work the shell does while interpreting the command line that occurs between the actual calls to @@ -195,20 +195,20 @@ Example: One module -

    From the Erlang shell:

    1> cprof:start(),R=calendar:day_of_the_week(1896,4,27),cprof:pause(),R.
    +

    From the Erlang shell:

    1> cprof:start(),R=calendar:day_of_the_week(1896,4,27),cprof:pause(),R.
     1
    -2> cprof:analyse(calendar).
    -{calendar,9,
    -          [{{calendar,last_day_of_the_month1,2},1},
    -           {{calendar,last_day_of_the_month,2},1},
    -           {{calendar,is_leap_year1,1},1},
    -           {{calendar,is_leap_year,1},1},
    -           {{calendar,dy,1},1},
    -           {{calendar,dm,1},1},
    -           {{calendar,df,2},1},
    -           {{calendar,day_of_the_week,3},1},
    -           {{calendar,date_to_gregorian_days,3},1}]}
    -3> cprof:stop().
    +2> cprof:analyse(calendar).
    +{calendar,9,
    +          [{{calendar,last_day_of_the_month1,2},1},
    +           {{calendar,last_day_of_the_month,2},1},
    +           {{calendar,is_leap_year1,1},1},
    +           {{calendar,is_leap_year,1},1},
    +           {{calendar,dy,1},1},
    +           {{calendar,dm,1},1},
    +           {{calendar,df,2},1},
    +           {{calendar,day_of_the_week,3},1},
    +           {{calendar,date_to_gregorian_days,3},1}]}
    +3> cprof:stop().
     8648

    The example tells us that "Aktiebolaget LM Ericsson & Co" was registered on a Monday (since the return value of the first command is 1), and that the calendar module needed 9 function calls to calculate that.

    Using cprof:analyse() in this example also shows approximately the same @@ -218,60 +218,60 @@ Example: In the code -

    Write a module:

    -module(sort).
    --export([do/1]).
    +

    Write a module:

    -module(sort).
    +-export([do/1]).
     
    -do(N) ->
    -    cprof:stop(),
    -    cprof:start(),
    -    do(N, []).
    -
    -do(0, L) ->
    -    R = lists:sort(L),
    -    cprof:pause(),
    +do(N) ->
    +    cprof:stop(),
    +    cprof:start(),
    +    do(N, []).
    +
    +do(0, L) ->
    +    R = lists:sort(L),
    +    cprof:pause(),
         R;
    -do(N, L) ->
    -    do(N-1, [rand:uniform(256)-1 | L]).

    From the Erlang shell:

    1> c(sort).
    -{ok,sort}
    -2> rand:seed(default, 42), ok.
    +do(N, L) ->
    +    do(N-1, [rand:uniform(256)-1 | L]).

    From the Erlang shell:

    1> c(sort).
    +{ok,sort}
    +2> rand:seed(default, 42), ok.
     ok.
    -3> sort:do(1000).
    -[0,0,0,1,1,1,1,2,2,3,3,4,4,4,4,5,5,5,6,6,6,6,7,7,7,7,7,8,8|...]
    -4> cprof:analyse().
    -{13180,
    - [{lists,6173,
    -         [{{lists,rmerge3_1,6},1045},
    -          {{lists,rmerge3_2,6},977},
    -          {{lists,split_1,5},652},
    -          {{lists,merge3_1,6},579},
    -          {{lists,merge3_2,6},577},
    -          {{lists,rmerge3_12_3,6},511},
    -          {{lists,split_1_1,6},347},
    -          {{lists,merge3_12_3,6},310},
    -          {{lists,rmerge3_21_3,6},282},
    -          {{lists,merge3_21_3,6},221},
    -          {{lists,merge2_1,4},154},
    -          {{lists,merge2_2,5},138},
    -          {{lists,reverse,2},106},
    -          {{lists,rmerge2_2,5},87},
    -          {{lists,rmergel,2},81},
    -          {{lists,rmerge2_1,4},75},
    -          {{lists,mergel,2},28},
    -          {{lists,keyfind,3},2},
    -          {{lists,sort,1},1}]},
    -  {rand,5000,
    -        [{{rand,uniform_s,2},1000},
    -         {{rand,uniform,1},1000},
    -         {{rand,seed_put,1},1000},
    -         {{rand,seed_get,0},1000},
    -         {{rand,exsss_uniform,2},1000}]},
    -  {erlang,1004,
    -          [{{erlang,put,2},1000},
    -           {{erlang,trace_pattern,3},2},
    -           {{erlang,ensure_tracer_module_loaded,2},2}]},
    -  {sort,1001,[{{sort,do,2},1001}]},
    -  {erts_internal,2,[{{erts_internal,trace_pattern,3},2}]}]}
    -5> cprof:stop().
    +3> sort:do(1000).
    +[0,0,0,1,1,1,1,2,2,3,3,4,4,4,4,5,5,5,6,6,6,6,7,7,7,7,7,8,8|...]
    +4> cprof:analyse().
    +{13180,
    + [{lists,6173,
    +         [{{lists,rmerge3_1,6},1045},
    +          {{lists,rmerge3_2,6},977},
    +          {{lists,split_1,5},652},
    +          {{lists,merge3_1,6},579},
    +          {{lists,merge3_2,6},577},
    +          {{lists,rmerge3_12_3,6},511},
    +          {{lists,split_1_1,6},347},
    +          {{lists,merge3_12_3,6},310},
    +          {{lists,rmerge3_21_3,6},282},
    +          {{lists,merge3_21_3,6},221},
    +          {{lists,merge2_1,4},154},
    +          {{lists,merge2_2,5},138},
    +          {{lists,reverse,2},106},
    +          {{lists,rmerge2_2,5},87},
    +          {{lists,rmergel,2},81},
    +          {{lists,rmerge2_1,4},75},
    +          {{lists,mergel,2},28},
    +          {{lists,keyfind,3},2},
    +          {{lists,sort,1},1}]},
    +  {rand,5000,
    +        [{{rand,uniform_s,2},1000},
    +         {{rand,uniform,1},1000},
    +         {{rand,seed_put,1},1000},
    +         {{rand,seed_get,0},1000},
    +         {{rand,exsss_uniform,2},1000}]},
    +  {erlang,1004,
    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/eprof.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/eprof.html	2025-05-10 20:19:26.693349874 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/eprof.html	2025-05-10 20:19:26.701349947 +0000
    @@ -1011,7 +1011,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/erlang-el.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/erlang-el.html 2025-05-10 20:19:26.725350165 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/erlang-el.html 2025-05-10 20:19:26.729350201 +0000 @@ -211,23 +211,23 @@
    • C-c C-a (align-current) - aligns comments, arrows, assignments, and type annotations around the cursor.
    Example:
     
    -sum(L) -> sum(L, 0).
    -sum([H|T], Sum) -> sum(T, Sum + H);  % recurse
    -sum([], Sum) -> Sum.   % base case
    +sum(L) -> sum(L, 0).
    +sum([H|T], Sum) -> sum(T, Sum + H);  % recurse
    +sum([], Sum) -> Sum.   % base case
     
    --record { two :: int(), % hello
    -          three = hello :: string(),    % there
    -          four = 42 :: int() }.
    +-record { two :: int(), % hello
    +          three = hello :: string(),    % there
    +          four = 42 :: int() }.
     
     becomes:
     
    -sum(L) -> sum(L, 0).
    -sum([H|T], Sum) -> sum(T, Sum + H); % recurse
    -sum([], Sum)    -> Sum.             % base case
    +sum(L) -> sum(L, 0).
    +sum([H|T], Sum) -> sum(T, Sum + H); % recurse
    +sum([], Sum)    -> Sum.             % base case
     
    --record { two           :: int(),    % hello
    -          three = hello :: string(), % there
    -          four  = 42    :: int() }.

    +-record { two :: int(), % hello + three = hello :: string(), % there + four = 42 :: int() }.

    @@ -355,7 +355,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/erlang_mode_chapter.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/erlang_mode_chapter.html 2025-05-10 20:19:26.749350382 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/erlang_mode_chapter.html 2025-05-10 20:19:26.753350418 +0000 @@ -331,7 +331,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/fprof.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/fprof.html 2025-05-10 20:19:26.793350781 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/fprof.html 2025-05-10 20:19:26.813350963 +0000 @@ -175,61 +175,61 @@ interested reader to try it out. Note that some flags to analyse/1 will affect the format.

    The following example was run on Erlang/OTP R8 on Solaris 8; all OTP internals in this example are version dependent.

    As an example, we will use the following function, which is a -slightly modified benchmark function from module file:

    -module(foo).
    --export([create_file_slow/2]).
    +slightly modified benchmark function from module file:

    -module(foo).
    +-export([create_file_slow/2]).
     
    -create_file_slow(Name, N) when is_integer(N), N >= 0 ->
    -    {ok, FD} =
    -        file:open(Name, [raw, write, delayed_write, binary]),
    +create_file_slow(Name, N) when is_integer(N), N >= 0 ->
    +    {ok, FD} =
    +        file:open(Name, [raw, write, delayed_write, binary]),
         if N > 256 ->
    -            ok = file:write(FD,
    -                            lists:map(fun (X) -> <<X:32/unsigned>> end,
    -                            lists:seq(0, 255))),
    -            ok = create_file_slow(FD, 256, N);
    +            ok = file:write(FD,
    +                            lists:map(fun (X) -> <<X:32/unsigned>> end,
    +                            lists:seq(0, 255))),
    +            ok = create_file_slow(FD, 256, N);
            true ->
    -            ok = create_file_slow(FD, 0, N)
    +            ok = create_file_slow(FD, 0, N)
         end,
    -    ok = file:close(FD).
    +    ok = file:close(FD).
     
    -create_file_slow(FD, M, M) ->
    +create_file_slow(FD, M, M) ->
         ok;
    -create_file_slow(FD, M, N) ->
    -    ok = file:write(FD, <<M:32/unsigned>>),
    -    create_file_slow(FD, M+1, N).

    Let us have a look at the printout after running:

    1> fprof:apply(foo, create_file_slow, [junk, 1024]).
    -2> fprof:profile().
    -3> fprof:analyse().

    The printout starts with:

    %% Analysis results:
    -{  analysis_options,
    - [{callers, true},
    -  {sort, acc},
    -  {totals, false},
    -  {details, true}]}.
    +create_file_slow(FD, M, N) ->
    +    ok = file:write(FD, <<M:32/unsigned>>),
    +    create_file_slow(FD, M+1, N).

    Let us have a look at the printout after running:

    1> fprof:apply(foo, create_file_slow, [junk, 1024]).
    +2> fprof:profile().
    +3> fprof:analyse().

    The printout starts with:

    %% Analysis results:
    +{  analysis_options,
    + [{callers, true},
    +  {sort, acc},
    +  {totals, false},
    +  {details, true}]}.
     
     %                                       CNT       ACC       OWN
    -[{ totals,                             9627, 1691.119, 1659.074}].  %%%

    The CNT column shows the total number of function calls that was found in the +[{ totals, 9627, 1691.119, 1659.074}]. %%%

    The CNT column shows the total number of function calls that was found in the trace. In the ACC column is the total time of the trace from first timestamp to last. And in the OWN column is the sum of the execution time in functions found in the trace, not including called functions. In this case it is very close to the ACC time since the emulator had practically nothing to do except executing our test program.

    All time values in the printout are in milliseconds.

    The printout continues:

    %                                       CNT       ACC       OWN
    -[{ "<0.28.0>",                         9627,undefined, 1659.074}].   %%

    This is the printout header of one process. The printout contains only this one +[{ "<0.28.0>", 9627,undefined, 1659.074}]. %%

    This is the printout header of one process. The printout contains only this one process since we called fprof:apply/3 that traces only the current process. Therefore the CNT and OWN columns perfectly matches the totals above. The ACC column is undefined since summing the ACC times of all calls in the process makes no sense — one would get something like the ACC value from totals above multiplied by the average depth of the call stack.

    All paragraphs up to the next process header only concerns function calls within -this process.

    Now we come to something more interesting:

    {[{undefined,                             0, 1691.076,    0.030}],
    - { {fprof,apply_start_stop,4},            0, 1691.076,    0.030},     %
    - [{{foo,create_file_slow,2},              1, 1691.046,    0.103},
    -  {suspend,                               1,    0.000,    0.000}]}.
    -
    -{[{{fprof,apply_start_stop,4},            1, 1691.046,    0.103}],
    - { {foo,create_file_slow,2},              1, 1691.046,    0.103},     %
    - [{{file,close,1},                        1, 1398.873,    0.019},
    -  {{foo,create_file_slow,3},              1,  249.678,    0.029},
    -  {{file,open,2},                         1,   20.778,    0.055},
    -  {{lists,map,2},                         1,   16.590,    0.043},
    -  {{lists,seq,2},                         1,    4.708,    0.017},
    -  {{file,write,2},                        1,    0.316,    0.021}]}.

    The printout consists of one paragraph per called function. The function +this process.

    Now we come to something more interesting:

    {[{undefined,                             0, 1691.076,    0.030}],
    + { {fprof,apply_start_stop,4},            0, 1691.076,    0.030},     %
    + [{{foo,create_file_slow,2},              1, 1691.046,    0.103},
    +  {suspend,                               1,    0.000,    0.000}]}.
    +
    +{[{{fprof,apply_start_stop,4},            1, 1691.046,    0.103}],
    + { {foo,create_file_slow,2},              1, 1691.046,    0.103},     %
    + [{{file,close,1},                        1, 1398.873,    0.019},
    +  {{foo,create_file_slow,3},              1,  249.678,    0.029},
    +  {{file,open,2},                         1,   20.778,    0.055},
    +  {{lists,map,2},                         1,   16.590,    0.043},
    +  {{lists,seq,2},                         1,    4.708,    0.017},
    +  {{file,write,2},                        1,    0.316,    0.021}]}.

    The printout consists of one paragraph per called function. The function marked with % is the one the paragraph concerns — foo:create_file_slow/2. Above the marked function are the calling functions — those that has called the marked, and below are those called by the marked function.

    The paragraphs are per default sorted in descending order of the ACC column for @@ -246,12 +246,12 @@ (lists:seq/2 and lists:map/2).

    The function undefined that has called fprof:apply_start_stop/4 is an unknown function because that call was not recorded in the trace. It was only recorded that the execution returned from fprof:apply_start_stop/4 to some -other function above in the call stack, or that the process exited from there.

    Let us continue down the printout to find:

    {[{{foo,create_file_slow,2},              1,  249.678,    0.029},
    -  {{foo,create_file_slow,3},            768,    0.000,   23.294}],
    - { {foo,create_file_slow,3},            769,  249.678,   23.323},     %
    - [{{file,write,2},                      768,  220.314,   14.539},
    -  {suspend,                              57,    6.041,    0.000},
    -  {{foo,create_file_slow,3},            768,    0.000,   23.294}]}.

    If you compare with the code you will see there also that +other function above in the call stack, or that the process exited from there.

    Let us continue down the printout to find:

    {[{{foo,create_file_slow,2},              1,  249.678,    0.029},
    +  {{foo,create_file_slow,3},            768,    0.000,   23.294}],
    + { {foo,create_file_slow,3},            769,  249.678,   23.323},     %
    + [{{file,write,2},                      768,  220.314,   14.539},
    +  {suspend,                              57,    6.041,    0.000},
    +  {{foo,create_file_slow,3},            768,    0.000,   23.294}]}.

    If you compare with the code you will see there also that foo:create_file_slow/3 was called only from foo:create_file_slow/2 and itself, and called only file:write/2, note the number of calls to file:write/2. But here we see that suspend was called a few times. This is a @@ -259,88 +259,88 @@ foo:create_file_slow/3, and since there is no receive or erlang:yield/0 in the code, it must be Erlang scheduling suspensions, or the trace file driver compensating for large file write operations (these are regarded as a schedule -out followed by a schedule in to the same process).

    Let us find the suspend entry:

    {[{{file,write,2},                       53,    6.281,    0.000},
    -  {{foo,create_file_slow,3},             57,    6.041,    0.000},
    -  {{prim_file,drv_command,4},            50,    4.582,    0.000},
    -  {{prim_file,drv_get_response,1},       34,    2.986,    0.000},
    -  {{lists,map,2},                        10,    2.104,    0.000},
    -  {{prim_file,write,2},                  17,    1.852,    0.000},
    -  {{erlang,port_command,2},              15,    1.713,    0.000},
    -  {{prim_file,drv_command,2},            22,    1.482,    0.000},
    -  {{prim_file,translate_response,2},     11,    1.441,    0.000},
    -  {{prim_file,'-drv_command/2-fun-0-',1},  15,    1.340,    0.000},
    -  {{lists,seq,4},                         3,    0.880,    0.000},
    -  {{foo,'-create_file_slow/2-fun-0-',1},   5,    0.523,    0.000},
    -  {{erlang,bump_reductions,1},            4,    0.503,    0.000},
    -  {{prim_file,open_int_setopts,3},        1,    0.165,    0.000},
    -  {{prim_file,i32,4},                     1,    0.109,    0.000},
    -  {{fprof,apply_start_stop,4},            1,    0.000,    0.000}],
    - { suspend,                             299,   32.002,    0.000},     %
    - [ ]}.

    We find no particularly long suspend times, so no function seems to have waited +out followed by a schedule in to the same process).

    Let us find the suspend entry:

    {[{{file,write,2},                       53,    6.281,    0.000},
    +  {{foo,create_file_slow,3},             57,    6.041,    0.000},
    +  {{prim_file,drv_command,4},            50,    4.582,    0.000},
    +  {{prim_file,drv_get_response,1},       34,    2.986,    0.000},
    +  {{lists,map,2},                        10,    2.104,    0.000},
    +  {{prim_file,write,2},                  17,    1.852,    0.000},
    +  {{erlang,port_command,2},              15,    1.713,    0.000},
    +  {{prim_file,drv_command,2},            22,    1.482,    0.000},
    +  {{prim_file,translate_response,2},     11,    1.441,    0.000},
    +  {{prim_file,'-drv_command/2-fun-0-',1},  15,    1.340,    0.000},
    +  {{lists,seq,4},                         3,    0.880,    0.000},
    +  {{foo,'-create_file_slow/2-fun-0-',1},   5,    0.523,    0.000},
    +  {{erlang,bump_reductions,1},            4,    0.503,    0.000},
    +  {{prim_file,open_int_setopts,3},        1,    0.165,    0.000},
    +  {{prim_file,i32,4},                     1,    0.109,    0.000},
    +  {{fprof,apply_start_stop,4},            1,    0.000,    0.000}],
    + { suspend,                             299,   32.002,    0.000},     %
    + [ ]}.

    We find no particularly long suspend times, so no function seems to have waited in a receive statement. Actually, prim_file:drv_command/4 contains a receive statement, but in this test program, the message lies in the process receive buffer when the receive statement is entered. We also see that the total suspend time for the test run is small.

    The suspend pseudo function has an OWN time of zero. This is to prevent the process total OWN time from including time in suspension. Whether suspend -time is really ACC or OWN time is more of a philosophical question.

    Now we look at another interesting pseudo function, garbage_collect:

    {[{{prim_file,drv_command,4},            25,    0.873,    0.873},
    -  {{prim_file,write,2},                  16,    0.692,    0.692},
    -  {{lists,map,2},                         2,    0.195,    0.195}],
    - { garbage_collect,                      43,    1.760,    1.760},     %
    - [ ]}.

    Here we see that no function stands out, which is very normal.

    The garbage_collect pseudo function has not an OWN time of zero like +time is really ACC or OWN time is more of a philosophical question.

    Now we look at another interesting pseudo function, garbage_collect:

    {[{{prim_file,drv_command,4},            25,    0.873,    0.873},
    +  {{prim_file,write,2},                  16,    0.692,    0.692},
    +  {{lists,map,2},                         2,    0.195,    0.195}],
    + { garbage_collect,                      43,    1.760,    1.760},     %
    + [ ]}.

    Here we see that no function stands out, which is very normal.

    The garbage_collect pseudo function has not an OWN time of zero like suspend, instead it is equal to the ACC time.

    Garbage collection often occurs while a process is suspended, but fprof hides this fact by pretending that the suspended function was first unsuspended and then garbage collected. Otherwise the printout would show garbage_collect being called from suspend, but not which function that might have caused the -garbage collection.

    Let us now get back to the test code:

    {[{{foo,create_file_slow,3},            768,  220.314,   14.539},
    -  {{foo,create_file_slow,2},              1,    0.316,    0.021}],
    - { {file,write,2},                      769,  220.630,   14.560},     %
    - [{{prim_file,write,2},                 769,  199.789,   22.573},
    -  {suspend,                              53,    6.281,    0.000}]}.

    Not unexpectedly, we see that file:write/2 was called from +garbage collection.

    Let us now get back to the test code:

    {[{{foo,create_file_slow,3},            768,  220.314,   14.539},
    +  {{foo,create_file_slow,2},              1,    0.316,    0.021}],
    + { {file,write,2},                      769,  220.630,   14.560},     %
    + [{{prim_file,write,2},                 769,  199.789,   22.573},
    +  {suspend,                              53,    6.281,    0.000}]}.

    Not unexpectedly, we see that file:write/2 was called from foo:create_file_slow/3 and foo:create_file_slow/2. The number of calls in each case as well as the used time are also confirms the previous results.

    We see that file:write/2 only calls prim_file:write/2, but let us refrain from digging into the internals of the kernel application.

    If we nevertheless do dig down we find the call to the linked-in driver -that does the file operations towards the host operating system:

    {[{{prim_file,drv_command,4},           772, 1458.356, 1456.643}],
    - { {erlang,port_command,2},             772, 1458.356, 1456.643},     %
    - [{suspend,                              15,    1.713,    0.000}]}.

    This is 86 % of the total run time, and as we saw before it is the close +that does the file operations towards the host operating system:

    {[{{prim_file,drv_command,4},           772, 1458.356, 1456.643}],
    + { {erlang,port_command,2},             772, 1458.356, 1456.643},     %
    + [{suspend,                              15,    1.713,    0.000}]}.

    This is 86 % of the total run time, and as we saw before it is the close operation the absolutely biggest contributor. We find a comparison ratio a -little bit up in the call stack:

    {[{{prim_file,close,1},                   1, 1398.748,    0.024},
    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/fprof_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/fprof_chapter.html	2025-05-10 20:19:26.837351179 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/fprof_chapter.html	2025-05-10 20:19:26.837351179 +0000
    @@ -176,10 +176,10 @@
     
     

    It is also possible to trace immediately into the profiling process that creates the raw profile data, that is to short circuit the tracing and profiling steps -so that the filesystem is not used for tracing.

    Do something like this:

    {ok, Tracer} = fprof:profile(start),
    -fprof:trace([start, {tracer, Tracer}]),
    +so that the filesystem is not used for tracing.

    Do something like this:

    {ok, Tracer} = fprof:profile(start),
    +fprof:trace([start, {tracer, Tracer}]),
     %% Run code to profile
    -fprof:trace(stop);

    This puts less load on the filesystem, but much more load on the Erlang runtime +fprof:trace(stop);

    This puts less load on the filesystem, but much more load on the Erlang runtime system.

    @@ -231,7 +231,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/lcnt.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/lcnt.html 2025-05-10 20:19:26.873351507 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/lcnt.html 2025-05-10 20:19:26.881351579 +0000 @@ -1857,7 +1857,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/lcnt_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/lcnt_chapter.html 2025-05-10 20:19:26.909351833 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/lcnt_chapter.html 2025-05-10 20:19:26.913351869 +0000 @@ -233,20 +233,20 @@ Example with Mnesia Transaction Benchmark -

    From the Erlang shell:

    Erlang/OTP 27 [erts-15.0] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit] [lock-counting]
    +

    From the Erlang shell:

    Erlang/OTP 27 [erts-15.0] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit] [lock-counting]
     
    -Eshell V15.0 (press Ctrl+G to abort, type help(). for help)
    -1> Conf = [{db_nodes, [node()]}, {driver_nodes, [node()]}, {replica_nodes, [node()]},
    -    {n_drivers_per_node, 10}, {n_branches, 1000}, {n_accounts_per_branch, 10},
    -    {replica_type, ram_copies}, {stop_after, 60000}, {reuse_history_id, true}], ok.
    +Eshell V15.0 (press Ctrl+G to abort, type help(). for help)
    +1> Conf = [{db_nodes, [node()]}, {driver_nodes, [node()]}, {replica_nodes, [node()]},
    +    {n_drivers_per_node, 10}, {n_branches, 1000}, {n_accounts_per_branch, 10},
    +    {replica_type, ram_copies}, {stop_after, 60000}, {reuse_history_id, true}], ok.
     ok
    -2> mnesia_tpcb:init([{use_running_mnesia, false}|Conf]).
    +2> mnesia_tpcb:init([{use_running_mnesia, false}|Conf]).
         .
         .
         .
     ignore

    Initial configuring of the benchmark is done. It is time to profile the actual -Mnesia benchmark:

    3> lcnt:apply(fun() -> {ok,{time, Tps,_,_,_,_}} = mnesia_tpcb:run([{use_running_mnesia,
    -    true}|Conf]), Tps/60 end).
    +Mnesia benchmark:

    3> lcnt:apply(fun() -> {ok,{time, Tps,_,_,_,_}} = mnesia_tpcb:run([{use_running_mnesia,
    +    true}|Conf]), Tps/60 end).
           .
           .
           .
    @@ -350,63 +350,63 @@
       
       The Big Bang Benchmark
     
    -
    -module(big).
    --export([bang/1]).
    +
    -module(big).
    +-export([bang/1]).
     
    -pinger([], [], true) ->
    +pinger([], [], true) ->
         receive
    -	{procs, Procs, ReportTo} ->
    -	    pinger(Procs, [], ReportTo)
    +	{procs, Procs, ReportTo} ->
    +	    pinger(Procs, [], ReportTo)
         end;
    -pinger([], [], false) ->
    -    receive {ping, From} -> From ! {pong, self()} end,
    -    pinger([],[],false);
    -pinger([], [], ReportTo) ->
    -    ReportTo ! {done, self()},
    -    pinger([],[],false);
    -pinger([], [Po|Pos] = Pongers, ReportTo) ->
    +pinger([], [], false) ->
    +    receive {ping, From} -> From ! {pong, self()} end,
    +    pinger([],[],false);
    +pinger([], [], ReportTo) ->
    +    ReportTo ! {done, self()},
    +    pinger([],[],false);
    +pinger([], [Po|Pos] = Pongers, ReportTo) ->
         receive
    -	{ping, From} ->
    -	    From ! {pong, self()},
    -	    pinger([], Pongers, ReportTo);
    -	{pong, Po} ->
    -	    pinger([], Pos, ReportTo)
    +	{ping, From} ->
    +	    From ! {pong, self()},
    +	    pinger([], Pongers, ReportTo);
    +	{pong, Po} ->
    +	    pinger([], Pos, ReportTo)
         end;
    -pinger([Pi|Pis], Pongers, ReportTo) ->
    -    receive {ping, From} -> From ! {pong, self()}
    +pinger([Pi|Pis], Pongers, ReportTo) ->
    +    receive {ping, From} -> From ! {pong, self()}
         after 0 -> ok
         end,
    -    Pi ! {ping, self()},
    -    pinger(Pis, [Pi|Pongers], ReportTo).
    +    Pi ! {ping, self()},
    +    pinger(Pis, [Pi|Pongers], ReportTo).
     
    -spawn_procs(N) when N =< 0 ->
    -    [];
    -spawn_procs(N) ->
    -    [spawn_link(fun () -> pinger([],[],true) end) | spawn_procs(N-1)].
    +spawn_procs(N) when N =< 0 ->
    +    [];
    +spawn_procs(N) ->
    +    [spawn_link(fun () -> pinger([],[],true) end) | spawn_procs(N-1)].
     
    -send_procs([], Msg) ->
    +send_procs([], Msg) ->
         Msg;
    -send_procs([P|Ps], Msg) ->
    +send_procs([P|Ps], Msg) ->
         P ! Msg,
    -    send_procs(Ps, Msg).
    +    send_procs(Ps, Msg).
     
    -receive_msgs([]) ->
    +receive_msgs([]) ->
         ok;
    -receive_msgs([M|Ms]) ->
    +receive_msgs([M|Ms]) ->
         receive
     	M ->
    -	    receive_msgs(Ms)
    +	    receive_msgs(Ms)
         end.
     
    -bang(N) when integer(N) ->
    -    Procs = spawn_procs(N),
    -    RMsgs = lists:map(fun (P) -> {done, P} end, Procs),
    -    Start = now(),
    -    send_procs(Procs, {procs, Procs, self()}),
    -    receive_msgs(RMsgs),
    -    Stop = now(),
    -    lists:foreach(fun (P) -> exit(P, normal) end, Procs),
    -    timer:now_diff(Stop, Start).

    +bang(N) when integer(N) -> + Procs = spawn_procs(N), + RMsgs = lists:map(fun (P) -> {done, P} end, Procs), + Start = now(), + send_procs(Procs, {procs, Procs, self()}), + receive_msgs(RMsgs), + Stop = now(), + lists:foreach(fun (P) -> exit(P, normal) end, Procs), + timer:now_diff(Stop, Start).

    @@ -463,7 +463,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/make.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/make.html 2025-05-10 20:19:26.937352087 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/make.html 2025-05-10 20:19:26.941352123 +0000 @@ -142,8 +142,8 @@ the first match is used. For example, the following Emakefile means that file1 should be compiled with the options [debug_info,{i,"../foo"}], while all other files in the current directory should be compiled with only the -debug_info flag.

    {'file1',[debug_info,{i,"../foo"}]}.
    -{'*',[debug_info]}.

    +debug_info flag.

    {'file1',[debug_info,{i,"../foo"}]}.
    +{'*',[debug_info]}.

    @@ -390,7 +390,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/notes.html 2025-05-10 20:19:26.977352449 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/notes.html 2025-05-10 20:19:26.989352558 +0000 @@ -167,25 +167,25 @@ Fixed Bugs and Malfunctions

    -
    • Dialyzer warnings due to type specs added in dbg have been eliminated.

      Own Id: OTP-18860

    • In Erlang/OTP 26, doing a cover analysis on the line level would return multiple entries for lines on which multiple functions were defined.

      For example, consider this module:

      -module(foo).
      --export([bar/0, baz/0]).
      +
      • Dialyzer warnings due to type specs added in dbg have been eliminated.

        Own Id: OTP-18860

      • In Erlang/OTP 26, doing a cover analysis on the line level would return multiple entries for lines on which multiple functions were defined.

        For example, consider this module:

        -module(foo).
        +-export([bar/0, baz/0]).
         
        -bar() -> ok. baz() -> not_ok.

        In Erlang/OTP 26, analysing on the line level would return two entries -for line 4:

        1> cover:compile_module(foo).
        -{ok,foo}
        -2> foo:bar().
        +bar() -> ok. baz() -> not_ok.

        In Erlang/OTP 26, analysing on the line level would return two entries +for line 4:

        1> cover:compile_module(foo).
        +{ok,foo}
        +2> foo:bar().
         ok
        -3> cover:analyse(foo, coverage, line).
        -{ok,[{{foo,4},{1,0}},{{foo,4},{0,1}}]}
        -4> cover:analyse(foo, calls, line).
        -{ok,[{{foo,4},1},{{foo,4},0}]}

        In Erlang/OTP 27, there will only be a single entry for line 4:

        1> cover:compile_module(foo).
        -{ok,foo}
        -2> foo:bar().
        +3> cover:analyse(foo, coverage, line).
        +{ok,[{{foo,4},{1,0}},{{foo,4},{0,1}}]}
        +4> cover:analyse(foo, calls, line).
        +{ok,[{{foo,4},1},{{foo,4},0}]}

        In Erlang/OTP 27, there will only be a single entry for line 4:

        1> cover:compile_module(foo).
        +{ok,foo}
        +2> foo:bar().
         ok
        -3> cover:analyse(foo, coverage, line).
        -{ok,[{{foo,4},{1,0}}]}
        -4> cover:analyse(foo, calls, line).
        -{ok,[{{foo,4},1}]}

        Own Id: OTP-18998 Aux Id: GH-8159, PR-8182

      • Fixed align command in emacs mode.

        Own Id: OTP-19026 Aux Id: PR-8155

      +3> cover:analyse(foo, coverage, line). +{ok,[{{foo,4},{1,0}}]} +4> cover:analyse(foo, calls, line). +{ok,[{{foo,4},1}]}

      Own Id: OTP-18998 Aux Id: GH-8159, PR-8182

    • Fixed align command in emacs mode.

      Own Id: OTP-19026 Aux Id: PR-8155

    @@ -198,12 +198,12 @@ """. "a\nb\nc"

    Adjacent string literals without intervening white space is now a syntax error, to avoid possible confusion with triple-quoted strings. For example:

    1> "abc""xyz".
     "xyz".
    -* 1:6: adjacent string literals without intervening white space

    POTENTIAL INCOMPATIBILITY

    Own Id: OTP-18750 Aux Id: OTP-18746, PR-7313, PR-7451

  • There is a new tool tprof, which combines the functionality of eprof and cprof under one interface and adds heap profiling. It also has functionality to help with profiling process hierarchies.

    Example:

    1> tprof:profile(lists, seq, [1, 16], #href_anchor"ss">type => call_memory}).
    +* 1:6: adjacent string literals without intervening white space

    POTENTIAL INCOMPATIBILITY

    Own Id: OTP-18750 Aux Id: OTP-18746, PR-7313, PR-7451

  • There is a new tool tprof, which combines the functionality of eprof and cprof under one interface and adds heap profiling. It also has functionality to help with profiling process hierarchies.

    Example:

    1> tprof:profile(lists, seq, [1, 16], #href_anchor"ss">type => call_memory}).
     
     ****** Process <0.92.0>  --  100.00% of total *** 
    -FUNCTION          CALLS  WORDS  PER CALL  [     %]
    -lists:seq_loop/3      5     32      6.40  [100.00]
    -                            32            [ 100.0]
    +FUNCTION          CALLS  WORDS  PER CALL  [     %]
    +lists:seq_loop/3      5     32      6.40  [100.00]
    +                            32            [ 100.0]
     ok

    Own Id: OTP-18756 Aux Id: PR-6639

  • Native coverage support has been implemented in the JIT. It will automatically be used by the cover tool to reduce the execution overhead when running cover-compiled code.

    There are also new APIs to support native coverage without using the cover tool.

    To instrument code for native coverage it must be compiled with the line_coverage option.

    To enable native coverage in the runtime system, start it like so:

    $ erl +JPcover true

    There are also the following new functions for supporting native coverage:

    Own Id: OTP-18856 Aux Id: PR-7856

  • The documentation has been migrated to use Markdown and ExDoc.

    Own Id: OTP-18955 Aux Id: PR-8026

  • Improved the align command in emacs mode.

    Own Id: OTP-19080 Aux Id: PR-8288

  • @@ -1532,7 +1532,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/search.html 2025-05-10 20:19:27.009352739 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/search.html 2025-05-10 20:19:27.013352776 +0000 @@ -145,7 +145,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tags.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tags.html 2025-05-10 20:19:27.037352993 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tags.html 2025-05-10 20:19:27.041353030 +0000 @@ -804,7 +804,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/content.opf 2025-05-10 20:19:27.073353320 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/content.opf 2025-05-10 20:19:27.081353392 +0000 @@ -4,10 +4,10 @@ version="3.0"> tools - 4.1.1 - urn:uuid:8fe134d4-3fef-c0da-fe1f-5a1f18aa365a + urn:uuid:eb1689a9-9b14-45a3-0dd6-1864de55bcca en - 2025-05-10T20:10:24Z + 2041-06-12T09:30:33Z /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/cover.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/cover.xhtml 2025-05-10 20:19:27.073353320 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/cover.xhtml 2025-05-10 20:19:27.081353392 +0000 @@ -1440,7 +1440,7 @@ call is equivalent to analyse('_', coverage, Arg).

    Otherwise Arg is assumed to be a module name, and this call is equivalent to analyse(Arg, coverage, function).

    Note

    To analyze a module whose name overlaps with one the values in analysis() or level(), the module -name has to be in a list. For example, to analyze a module named calls:

    cover:analyse([calls]).
    +name has to be in a list. For example, to analyze a module named calls:

    cover:analyse([calls]).

    @@ -1482,7 +1482,7 @@ analyse(Arg1, Arg2, function).

    If Arg2 is one of the values in level(), Arg1 is assumed to be a module and this call is equivalent to analyse(Arg1, coverage, Arg2).

    Note

    To analyze a module whose name overlaps with one of the values in analysis(), the module name needs to be in a -list. For example, to analyze a module named calls:

    cover:analyse([calls], function).
    +list. For example, to analyze a module named calls:

    cover:analyse([calls], function).
    @@ -1591,7 +1591,7 @@ options, this call is equivalent to analyse_to_file('_', Arg).

    Otherwise Arg is assumed to be a module, and this call is equivalent to analyse_to_file(Arg, []).

    Note

    To analyze a module of the name html (which overlaps with an option in analyse_option()), it is necessary to -use cover:analyse_to_file/2:

    cover:analyse_to_file([html], []).
    +use cover:analyse_to_file/2:

    cover:analyse_to_file([html], []).
    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/cover_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/cover_chapter.xhtml 2025-05-10 20:19:27.073353320 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/cover_chapter.xhtml 2025-05-10 20:19:27.081353392 +0000 @@ -41,81 +41,81 @@ Example -

    Assume that a test case for the following program should be verified:

    -module(channel).
    --behaviour(gen_server).
    +

    Assume that a test case for the following program should be verified:

    -module(channel).
    +-behaviour(gen_server).
     
    --export([start_link/0,stop/0]).
    --export([alloc/0,free/1]). % client interface
    --export([init/1,handle_call/3,terminate/2]). % callback functions
    +-export([start_link/0,stop/0]).
    +-export([alloc/0,free/1]). % client interface
    +-export([init/1,handle_call/3,terminate/2]). % callback functions
     
    -start_link() ->
    -    gen_server:start_link({local,channel}, channel, [], []).
    +start_link() ->
    +    gen_server:start_link({local,channel}, channel, [], []).
     
    -stop() ->
    -    gen_server:call(channel, stop).
    +stop() ->
    +    gen_server:call(channel, stop).
     
     %%%-Client interface functions-------------------------------------------
     
    -alloc() ->
    -    gen_server:call(channel, alloc).
    +alloc() ->
    +    gen_server:call(channel, alloc).
     
    -free(Channel) ->
    -    gen_server:call(channel, {free,Channel}).
    +free(Channel) ->
    +    gen_server:call(channel, {free,Channel}).
     
     %%%-gen_server callback functions----------------------------------------
     
    -init(_Arg) ->
    -    {ok,channels()}.
    +init(_Arg) ->
    +    {ok,channels()}.
     
    -handle_call(stop, _Client, Channels) ->
    -    {stop,normal,ok,Channels};
    +handle_call(stop, _Client, Channels) ->
    +    {stop,normal,ok,Channels};
     
    -handle_call(alloc, _Client, Channels) ->
    -    {Ch,Channels2} = alloc(Channels),
    -    {reply,{ok,Ch},Channels2};
    +handle_call(alloc, _Client, Channels) ->
    +    {Ch,Channels2} = alloc(Channels),
    +    {reply,{ok,Ch},Channels2};
     
    -handle_call({free,Channel}, _Client, Channels) ->
    -    Channels2 = free(Channel, Channels),
    -    {reply,ok,Channels2}.
    +handle_call({free,Channel}, _Client, Channels) ->
    +    Channels2 = free(Channel, Channels),
    +    {reply,ok,Channels2}.
     
    -terminate(_Reason, _Channels) ->
    +terminate(_Reason, _Channels) ->
         ok.
     
     %%%-Internal functions---------------------------------------------------
     
    -channels() ->
    -    [ch1,ch2,ch3].
    +channels() ->
    +    [ch1,ch2,ch3].
     
    -alloc([Channel|Channels]) ->
    -    {Channel,Channels};
    -alloc([]) ->
    +alloc([Channel|Channels]) ->
    +    {Channel,Channels};
    +alloc([]) ->
         false.
     
    -free(Channel, Channels) ->
    -    [Channel|Channels].

    The test case is implemented as follows:

    -module(test).
    --export([s/0]).
    -
    -s() ->
    -    {ok,Pid} = channel:start_link(),
    -    {ok,Ch1} = channel:alloc(),
    -    ok = channel:free(Ch1),
    -    ok = channel:stop().

    +free(Channel, Channels) -> + [Channel|Channels].

    The test case is implemented as follows:

    -module(test).
    +-export([s/0]).
    +
    +s() ->
    +    {ok,Pid} = channel:start_link(),
    +    {ok,Ch1} = channel:alloc(),
    +    ok = channel:free(Ch1),
    +    ok = channel:stop().

    Preparation

    First of all, Cover must be started. This spawns a process which owns the Cover -database where all coverage data will be stored.

    1> cover:start().
    -{ok,<0.90.0>}

    To include other nodes in the coverage analysis, use +database where all coverage data will be stored.

    1> cover:start().
    +{ok,<0.90.0>}

    To include other nodes in the coverage analysis, use cover:start/1. All cover-compiled modules will then be loaded on all nodes, and data from all nodes will be summed up when analysing. For simplicity this example only involves the current node.

    Before any analysis can take place, the involved modules must be cover-compiled. This means that some extra information is added to the module before beging compiled into a binary and loaded. The source file of the module is -not affected and no .beam file is created.

    2> cover:compile_module(channel).
    -{ok,channel}

    Each time a function in the cover-compiled module channel is called, +not affected and no .beam file is created.

    2> cover:compile_module(channel).
    +{ok,channel}

    Each time a function in the cover-compiled module channel is called, information about the call will be added to the Cover database. Run the test case:

    3> test:s().
     ok

    Cover analysis is performed by examining the contents of the Cover database. The @@ -133,56 +133,56 @@ {Cov,NotCov}, where Cov is the number of executable lines that have been executed at least once and NotCov is the number of executable lines that have not been executed.

    If the analysis is made on module level, the result is given for the entire -module as a tuple {Module,{Cov,NotCov}}:

    4> cover:analyse(channel, coverage, module).
    -{ok,{channel,{14,1}}}

    For channel, the result shows that 14 lines in the module are covered but one +module as a tuple {Module,{Cov,NotCov}}:

    4> cover:analyse(channel, coverage, module).
    +{ok,{channel,{14,1}}}

    For channel, the result shows that 14 lines in the module are covered but one line is not covered.

    If the analysis is made on function level, the result is given as a list of tuples {Function,{Cov,NotCov}}, one for each function in the module. A -function is specified by its module name, function name and arity:

    5> cover:analyse(channel, coverage, function).
    -{ok,[{{channel,start_link,0},{1,0}},
    -     {{channel,stop,0},{1,0}},
    -     {{channel,alloc,0},{1,0}},
    -     {{channel,free,1},{1,0}},
    -     {{channel,init,1},{1,0}},
    -     {{channel,handle_call,3},{5,0}},
    -     {{channel,terminate,2},{1,0}},
    -     {{channel,channels,0},{1,0}},
    -     {{channel,alloc,1},{1,1}},
    -     {{channel,free,2},{1,0}}]}

    For channel, the result shows that the uncovered line is in the function +function is specified by its module name, function name and arity:

    5> cover:analyse(channel, coverage, function).
    +{ok,[{{channel,start_link,0},{1,0}},
    +     {{channel,stop,0},{1,0}},
    +     {{channel,alloc,0},{1,0}},
    +     {{channel,free,1},{1,0}},
    +     {{channel,init,1},{1,0}},
    +     {{channel,handle_call,3},{5,0}},
    +     {{channel,terminate,2},{1,0}},
    +     {{channel,channels,0},{1,0}},
    +     {{channel,alloc,1},{1,1}},
    +     {{channel,free,2},{1,0}}]}

    For channel, the result shows that the uncovered line is in the function channel:alloc/1.

    If the analysis is made on clause level, the result is given as a list of tuples {Clause,{Cov,NotCov}}, one for each function clause in the module. A clause is specified by its module name, function name, arity and position within the -function definition:

    6> cover:analyse(channel, coverage, clause).
    -{ok,[{{channel,start_link,0,1},{1,0}},
    -     {{channel,stop,0,1},{1,0}},
    -     {{channel,alloc,0,1},{1,0}},
    -     {{channel,free,1,1},{1,0}},
    -     {{channel,init,1,1},{1,0}},
    -     {{channel,handle_call,3,1},{1,0}},
    -     {{channel,handle_call,3,2},{2,0}},
    -     {{channel,handle_call,3,3},{2,0}},
    -     {{channel,terminate,2,1},{1,0}},
    -     {{channel,channels,0,1},{1,0}},
    -     {{channel,alloc,1,1},{1,0}},
    -     {{channel,alloc,1,2},{0,1}},
    -     {{channel,free,2,1},{1,0}}]}

    For channel, the result shows that the uncovered line is in the second clause +function definition:

    6> cover:analyse(channel, coverage, clause).
    +{ok,[{{channel,start_link,0,1},{1,0}},
    +     {{channel,stop,0,1},{1,0}},
    +     {{channel,alloc,0,1},{1,0}},
    +     {{channel,free,1,1},{1,0}},
    +     {{channel,init,1,1},{1,0}},
    +     {{channel,handle_call,3,1},{1,0}},
    +     {{channel,handle_call,3,2},{2,0}},
    +     {{channel,handle_call,3,3},{2,0}},
    +     {{channel,terminate,2,1},{1,0}},
    +     {{channel,channels,0,1},{1,0}},
    +     {{channel,alloc,1,1},{1,0}},
    +     {{channel,alloc,1,2},{0,1}},
    +     {{channel,free,2,1},{1,0}}]}

    For channel, the result shows that the uncovered line is in the second clause of channel:alloc/1.

    Finally, if the analysis is made on line level, the result is given as a list of tuples {Line,{Cov,NotCov}}, one for each executable line in the source code. A -line is specified by its module name and line number.

    7> cover:analyse(channel, coverage, line).
    -{ok,[{{channel,9},{1,0}},
    -     {{channel,12},{1,0}},
    -     {{channel,17},{1,0}},
    -     {{channel,20},{1,0}},
    -     {{channel,25},{1,0}},
    -     {{channel,28},{1,0}},
    -     {{channel,31},{1,0}},
    -     {{channel,32},{1,0}},
    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/cprof.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/cprof.xhtml	2025-05-10 20:19:27.073353320 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/cprof.xhtml	2025-05-10 20:19:27.081353392 +0000
    @@ -469,7 +469,7 @@
     
           
     
    -

    Collects and analyses all call counters for module Module.

    This function returns:

    {Module, ModuleCount, FuncAnalysisList}

    where FuncAnalysisList is a list of tuples, one for each function:

    {{Module, FunctionName, Arity}, FuncCallCount}

    If call counters are still running while analyse/0,1,2 is executing, the result +

    Collects and analyses all call counters for module Module.

    This function returns:

    {Module, ModuleCount, FuncAnalysisList}

    where FuncAnalysisList is a list of tuples, one for each function:

    {{Module, FunctionName, Arity}, FuncCallCount}

    If call counters are still running while analyse/0,1,2 is executing, the result could be inconsistent. This happens if the process executing analyse/0,1,2 is scheduled out so some other process can increment the counters that are being analysed. Calling pause() before analysing takes care of /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/cprof_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/cprof_chapter.xhtml 2025-05-10 20:19:27.073353320 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/cprof_chapter.xhtml 2025-05-10 20:19:27.081353392 +0000 @@ -51,36 +51,36 @@ Example: Background work -

    From the Erlang shell:

    1> cprof:start(), cprof:pause(). % Stop counters just after start
    +

    From the Erlang shell:

    1> cprof:start(), cprof:pause(). % Stop counters just after start
     8492
    -2> cprof:analyse().
    -{539,
    - [{shell,155,
    -         [{{shell,prep_check,1},55},
    -          {{shell,used_records,4},45},
    -          {{shell,used_records,1},45},
    -          {{shell,used_record_defs,2},1},
    -          {{shell,record_defs,2},1},
    -          {{shell,record_bindings,2},1},
    -          {{shell,exprs,7},1},
    -          {{shell,expr,4},1},
    -          {{shell,expand_records,2},1},
    -          {{shell,check_command,2},1},
    -          {{shell,apply_fun,3},1},
    -          {{shell,'-exprs/7-lc$^0/1-0-',1},1},
    -          {{shell,'-eval_loop/3-fun-0-',3},1}]},
    +2> cprof:analyse().
    +{539,
    + [{shell,155,
    +         [{{shell,prep_check,1},55},
    +          {{shell,used_records,4},45},
    +          {{shell,used_records,1},45},
    +          {{shell,used_record_defs,2},1},
    +          {{shell,record_defs,2},1},
    +          {{shell,record_bindings,2},1},
    +          {{shell,exprs,7},1},
    +          {{shell,expr,4},1},
    +          {{shell,expand_records,2},1},
    +          {{shell,check_command,2},1},
    +          {{shell,apply_fun,3},1},
    +          {{shell,'-exprs/7-lc$^0/1-0-',1},1},
    +          {{shell,'-eval_loop/3-fun-0-',3},1}]},
       %% Information about many modules omitted.
                          .
                          .
                          .
       %% Here is the last part.
    -  {erts_internal,2,[{{erts_internal,trace_pattern,3},2}]},
    -  {otp_internal,1,[{{otp_internal,obsolete,3},1}]},
    -  {maps,1,[{{maps,from_list,1},1}]},
    -  {erl_internal,1,[{{erl_internal,bif,3},1}]}]}
    -3> cprof:analyse(cprof).
    -{cprof,3,[{{cprof,tr,2},2},{{cprof,pause,0},1}]}
    -4> cprof:stop().
    +  {erts_internal,2,[{{erts_internal,trace_pattern,3},2}]},
    +  {otp_internal,1,[{{otp_internal,obsolete,3},1}]},
    +  {maps,1,[{{maps,from_list,1},1}]},
    +  {erl_internal,1,[{{erl_internal,bif,3},1}]}]}
    +3> cprof:analyse(cprof).
    +{cprof,3,[{{cprof,tr,2},2},{{cprof,pause,0},1}]}
    +4> cprof:stop().
     8586

    The example showed some of the background work that the shell performs just to interpret the first command line.

    What is captured in this example is the part of the work the shell does while interpreting the command line that occurs between the actual calls to @@ -90,20 +90,20 @@ Example: One module -

    From the Erlang shell:

    1> cprof:start(),R=calendar:day_of_the_week(1896,4,27),cprof:pause(),R.
    +

    From the Erlang shell:

    1> cprof:start(),R=calendar:day_of_the_week(1896,4,27),cprof:pause(),R.
     1
    -2> cprof:analyse(calendar).
    -{calendar,9,
    -          [{{calendar,last_day_of_the_month1,2},1},
    -           {{calendar,last_day_of_the_month,2},1},
    -           {{calendar,is_leap_year1,1},1},
    -           {{calendar,is_leap_year,1},1},
    -           {{calendar,dy,1},1},
    -           {{calendar,dm,1},1},
    -           {{calendar,df,2},1},
    -           {{calendar,day_of_the_week,3},1},
    -           {{calendar,date_to_gregorian_days,3},1}]}
    -3> cprof:stop().
    +2> cprof:analyse(calendar).
    +{calendar,9,
    +          [{{calendar,last_day_of_the_month1,2},1},
    +           {{calendar,last_day_of_the_month,2},1},
    +           {{calendar,is_leap_year1,1},1},
    +           {{calendar,is_leap_year,1},1},
    +           {{calendar,dy,1},1},
    +           {{calendar,dm,1},1},
    +           {{calendar,df,2},1},
    +           {{calendar,day_of_the_week,3},1},
    +           {{calendar,date_to_gregorian_days,3},1}]}
    +3> cprof:stop().
     8648

    The example tells us that "Aktiebolaget LM Ericsson & Co" was registered on a Monday (since the return value of the first command is 1), and that the calendar module needed 9 function calls to calculate that.

    Using cprof:analyse() in this example also shows approximately the same @@ -113,60 +113,60 @@ Example: In the code -

    Write a module:

    -module(sort).
    --export([do/1]).
    +

    Write a module:

    -module(sort).
    +-export([do/1]).
     
    -do(N) ->
    -    cprof:stop(),
    -    cprof:start(),
    -    do(N, []).
    +do(N) ->
    +    cprof:stop(),
    +    cprof:start(),
    +    do(N, []).
     
    -do(0, L) ->
    -    R = lists:sort(L),
    -    cprof:pause(),
    +do(0, L) ->
    +    R = lists:sort(L),
    +    cprof:pause(),
         R;
    -do(N, L) ->
    -    do(N-1, [rand:uniform(256)-1 | L]).

    From the Erlang shell:

    1> c(sort).
    -{ok,sort}
    -2> rand:seed(default, 42), ok.
    +do(N, L) ->
    +    do(N-1, [rand:uniform(256)-1 | L]).

    From the Erlang shell:

    1> c(sort).
    +{ok,sort}
    +2> rand:seed(default, 42), ok.
     ok.
    -3> sort:do(1000).
    -[0,0,0,1,1,1,1,2,2,3,3,4,4,4,4,5,5,5,6,6,6,6,7,7,7,7,7,8,8|...]
    -4> cprof:analyse().
    -{13180,
    - [{lists,6173,
    -         [{{lists,rmerge3_1,6},1045},
    -          {{lists,rmerge3_2,6},977},
    -          {{lists,split_1,5},652},
    -          {{lists,merge3_1,6},579},
    -          {{lists,merge3_2,6},577},
    -          {{lists,rmerge3_12_3,6},511},
    -          {{lists,split_1_1,6},347},
    -          {{lists,merge3_12_3,6},310},
    -          {{lists,rmerge3_21_3,6},282},
    -          {{lists,merge3_21_3,6},221},
    -          {{lists,merge2_1,4},154},
    -          {{lists,merge2_2,5},138},
    -          {{lists,reverse,2},106},
    -          {{lists,rmerge2_2,5},87},
    -          {{lists,rmergel,2},81},
    -          {{lists,rmerge2_1,4},75},
    -          {{lists,mergel,2},28},
    -          {{lists,keyfind,3},2},
    -          {{lists,sort,1},1}]},
    -  {rand,5000,
    -        [{{rand,uniform_s,2},1000},
    -         {{rand,uniform,1},1000},
    -         {{rand,seed_put,1},1000},
    -         {{rand,seed_get,0},1000},
    -         {{rand,exsss_uniform,2},1000}]},
    -  {erlang,1004,
    -          [{{erlang,put,2},1000},
    -           {{erlang,trace_pattern,3},2},
    -           {{erlang,ensure_tracer_module_loaded,2},2}]},
    -  {sort,1001,[{{sort,do,2},1001}]},
    -  {erts_internal,2,[{{erts_internal,trace_pattern,3},2}]}]}
    -5> cprof:stop().
    +3> sort:do(1000).
    +[0,0,0,1,1,1,1,2,2,3,3,4,4,4,4,5,5,5,6,6,6,6,7,7,7,7,7,8,8|...]
    +4> cprof:analyse().
    +{13180,
    + [{lists,6173,
    +         [{{lists,rmerge3_1,6},1045},
    +          {{lists,rmerge3_2,6},977},
    +          {{lists,split_1,5},652},
    +          {{lists,merge3_1,6},579},
    +          {{lists,merge3_2,6},577},
    +          {{lists,rmerge3_12_3,6},511},
    +          {{lists,split_1_1,6},347},
    +          {{lists,merge3_12_3,6},310},
    +          {{lists,rmerge3_21_3,6},282},
    +          {{lists,merge3_21_3,6},221},
    +          {{lists,merge2_1,4},154},
    +          {{lists,merge2_2,5},138},
    +          {{lists,reverse,2},106},
    +          {{lists,rmerge2_2,5},87},
    +          {{lists,rmergel,2},81},
    +          {{lists,rmerge2_1,4},75},
    +          {{lists,mergel,2},28},
    +          {{lists,keyfind,3},2},
    +          {{lists,sort,1},1}]},
    +  {rand,5000,
    +        [{{rand,uniform_s,2},1000},
    +         {{rand,uniform,1},1000},
    +         {{rand,seed_put,1},1000},
    +         {{rand,seed_get,0},1000},
    +         {{rand,exsss_uniform,2},1000}]},
    +  {erlang,1004,
    +          [{{erlang,put,2},1000},
    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/erlang-el.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/erlang-el.xhtml	2025-05-10 20:19:27.073353320 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/erlang-el.xhtml	2025-05-10 20:19:27.081353392 +0000
    @@ -106,23 +106,23 @@
     
    • C-c C-a (align-current) - aligns comments, arrows, assignments, and type annotations around the cursor.
    Example:
     
    -sum(L) -> sum(L, 0).
    -sum([H|T], Sum) -> sum(T, Sum + H);  % recurse
    -sum([], Sum) -> Sum.   % base case
    +sum(L) -> sum(L, 0).
    +sum([H|T], Sum) -> sum(T, Sum + H);  % recurse
    +sum([], Sum) -> Sum.   % base case
     
    --record { two :: int(), % hello
    -          three = hello :: string(),    % there
    -          four = 42 :: int() }.
    +-record { two :: int(), % hello
    +          three = hello :: string(),    % there
    +          four = 42 :: int() }.
     
     becomes:
     
    -sum(L) -> sum(L, 0).
    -sum([H|T], Sum) -> sum(T, Sum + H); % recurse
    -sum([], Sum)    -> Sum.             % base case
    +sum(L) -> sum(L, 0).
    +sum([H|T], Sum) -> sum(T, Sum + H); % recurse
    +sum([], Sum)    -> Sum.             % base case
     
    --record { two           :: int(),    % hello
    -          three = hello :: string(), % there
    -          four  = 42    :: int() }.

    +-record { two :: int(), % hello + three = hello :: string(), % there + four = 42 :: int() }.

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/fprof.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/fprof.xhtml 2025-05-10 20:19:27.073353320 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/fprof.xhtml 2025-05-10 20:19:27.081353392 +0000 @@ -70,61 +70,61 @@ interested reader to try it out. Note that some flags to analyse/1 will affect the format.

    The following example was run on Erlang/OTP R8 on Solaris 8; all OTP internals in this example are version dependent.

    As an example, we will use the following function, which is a -slightly modified benchmark function from module file:

    -module(foo).
    --export([create_file_slow/2]).
    +slightly modified benchmark function from module file:

    -module(foo).
    +-export([create_file_slow/2]).
     
    -create_file_slow(Name, N) when is_integer(N), N >= 0 ->
    -    {ok, FD} =
    -        file:open(Name, [raw, write, delayed_write, binary]),
    +create_file_slow(Name, N) when is_integer(N), N >= 0 ->
    +    {ok, FD} =
    +        file:open(Name, [raw, write, delayed_write, binary]),
         if N > 256 ->
    -            ok = file:write(FD,
    -                            lists:map(fun (X) -> <<X:32/unsigned>> end,
    -                            lists:seq(0, 255))),
    -            ok = create_file_slow(FD, 256, N);
    +            ok = file:write(FD,
    +                            lists:map(fun (X) -> <<X:32/unsigned>> end,
    +                            lists:seq(0, 255))),
    +            ok = create_file_slow(FD, 256, N);
            true ->
    -            ok = create_file_slow(FD, 0, N)
    +            ok = create_file_slow(FD, 0, N)
         end,
    -    ok = file:close(FD).
    +    ok = file:close(FD).
     
    -create_file_slow(FD, M, M) ->
    +create_file_slow(FD, M, M) ->
         ok;
    -create_file_slow(FD, M, N) ->
    -    ok = file:write(FD, <<M:32/unsigned>>),
    -    create_file_slow(FD, M+1, N).

    Let us have a look at the printout after running:

    1> fprof:apply(foo, create_file_slow, [junk, 1024]).
    -2> fprof:profile().
    -3> fprof:analyse().

    The printout starts with:

    %% Analysis results:
    -{  analysis_options,
    - [{callers, true},
    -  {sort, acc},
    -  {totals, false},
    -  {details, true}]}.
    +create_file_slow(FD, M, N) ->
    +    ok = file:write(FD, <<M:32/unsigned>>),
    +    create_file_slow(FD, M+1, N).

    Let us have a look at the printout after running:

    1> fprof:apply(foo, create_file_slow, [junk, 1024]).
    +2> fprof:profile().
    +3> fprof:analyse().

    The printout starts with:

    %% Analysis results:
    +{  analysis_options,
    + [{callers, true},
    +  {sort, acc},
    +  {totals, false},
    +  {details, true}]}.
     
     %                                       CNT       ACC       OWN
    -[{ totals,                             9627, 1691.119, 1659.074}].  %%%

    The CNT column shows the total number of function calls that was found in the +[{ totals, 9627, 1691.119, 1659.074}]. %%%

    The CNT column shows the total number of function calls that was found in the trace. In the ACC column is the total time of the trace from first timestamp to last. And in the OWN column is the sum of the execution time in functions found in the trace, not including called functions. In this case it is very close to the ACC time since the emulator had practically nothing to do except executing our test program.

    All time values in the printout are in milliseconds.

    The printout continues:

    %                                       CNT       ACC       OWN
    -[{ "<0.28.0>",                         9627,undefined, 1659.074}].   %%

    This is the printout header of one process. The printout contains only this one +[{ "<0.28.0>", 9627,undefined, 1659.074}]. %%

    This is the printout header of one process. The printout contains only this one process since we called fprof:apply/3 that traces only the current process. Therefore the CNT and OWN columns perfectly matches the totals above. The ACC column is undefined since summing the ACC times of all calls in the process makes no sense — one would get something like the ACC value from totals above multiplied by the average depth of the call stack.

    All paragraphs up to the next process header only concerns function calls within -this process.

    Now we come to something more interesting:

    {[{undefined,                             0, 1691.076,    0.030}],
    - { {fprof,apply_start_stop,4},            0, 1691.076,    0.030},     %
    - [{{foo,create_file_slow,2},              1, 1691.046,    0.103},
    -  {suspend,                               1,    0.000,    0.000}]}.
    +this process.

    Now we come to something more interesting:

    {[{undefined,                             0, 1691.076,    0.030}],
    + { {fprof,apply_start_stop,4},            0, 1691.076,    0.030},     %
    + [{{foo,create_file_slow,2},              1, 1691.046,    0.103},
    +  {suspend,                               1,    0.000,    0.000}]}.
     
    -{[{{fprof,apply_start_stop,4},            1, 1691.046,    0.103}],
    - { {foo,create_file_slow,2},              1, 1691.046,    0.103},     %
    - [{{file,close,1},                        1, 1398.873,    0.019},
    -  {{foo,create_file_slow,3},              1,  249.678,    0.029},
    -  {{file,open,2},                         1,   20.778,    0.055},
    -  {{lists,map,2},                         1,   16.590,    0.043},
    -  {{lists,seq,2},                         1,    4.708,    0.017},
    -  {{file,write,2},                        1,    0.316,    0.021}]}.

    The printout consists of one paragraph per called function. The function +{[{{fprof,apply_start_stop,4}, 1, 1691.046, 0.103}], + { {foo,create_file_slow,2}, 1, 1691.046, 0.103}, % + [{{file,close,1}, 1, 1398.873, 0.019}, + {{foo,create_file_slow,3}, 1, 249.678, 0.029}, + {{file,open,2}, 1, 20.778, 0.055}, + {{lists,map,2}, 1, 16.590, 0.043}, + {{lists,seq,2}, 1, 4.708, 0.017}, + {{file,write,2}, 1, 0.316, 0.021}]}.

    The printout consists of one paragraph per called function. The function marked with % is the one the paragraph concerns — foo:create_file_slow/2. Above the marked function are the calling functions — those that has called the marked, and below are those called by the marked function.

    The paragraphs are per default sorted in descending order of the ACC column for @@ -141,12 +141,12 @@ (lists:seq/2 and lists:map/2).

    The function undefined that has called fprof:apply_start_stop/4 is an unknown function because that call was not recorded in the trace. It was only recorded that the execution returned from fprof:apply_start_stop/4 to some -other function above in the call stack, or that the process exited from there.

    Let us continue down the printout to find:

    {[{{foo,create_file_slow,2},              1,  249.678,    0.029},
    -  {{foo,create_file_slow,3},            768,    0.000,   23.294}],
    - { {foo,create_file_slow,3},            769,  249.678,   23.323},     %
    - [{{file,write,2},                      768,  220.314,   14.539},
    -  {suspend,                              57,    6.041,    0.000},
    -  {{foo,create_file_slow,3},            768,    0.000,   23.294}]}.

    If you compare with the code you will see there also that +other function above in the call stack, or that the process exited from there.

    Let us continue down the printout to find:

    {[{{foo,create_file_slow,2},              1,  249.678,    0.029},
    +  {{foo,create_file_slow,3},            768,    0.000,   23.294}],
    + { {foo,create_file_slow,3},            769,  249.678,   23.323},     %
    + [{{file,write,2},                      768,  220.314,   14.539},
    +  {suspend,                              57,    6.041,    0.000},
    +  {{foo,create_file_slow,3},            768,    0.000,   23.294}]}.

    If you compare with the code you will see there also that foo:create_file_slow/3 was called only from foo:create_file_slow/2 and itself, and called only file:write/2, note the number of calls to file:write/2. But here we see that suspend was called a few times. This is a @@ -154,88 +154,88 @@ foo:create_file_slow/3, and since there is no receive or erlang:yield/0 in the code, it must be Erlang scheduling suspensions, or the trace file driver compensating for large file write operations (these are regarded as a schedule -out followed by a schedule in to the same process).

    Let us find the suspend entry:

    {[{{file,write,2},                       53,    6.281,    0.000},
    -  {{foo,create_file_slow,3},             57,    6.041,    0.000},
    -  {{prim_file,drv_command,4},            50,    4.582,    0.000},
    -  {{prim_file,drv_get_response,1},       34,    2.986,    0.000},
    -  {{lists,map,2},                        10,    2.104,    0.000},
    -  {{prim_file,write,2},                  17,    1.852,    0.000},
    -  {{erlang,port_command,2},              15,    1.713,    0.000},
    -  {{prim_file,drv_command,2},            22,    1.482,    0.000},
    -  {{prim_file,translate_response,2},     11,    1.441,    0.000},
    -  {{prim_file,'-drv_command/2-fun-0-',1},  15,    1.340,    0.000},
    -  {{lists,seq,4},                         3,    0.880,    0.000},
    -  {{foo,'-create_file_slow/2-fun-0-',1},   5,    0.523,    0.000},
    -  {{erlang,bump_reductions,1},            4,    0.503,    0.000},
    -  {{prim_file,open_int_setopts,3},        1,    0.165,    0.000},
    -  {{prim_file,i32,4},                     1,    0.109,    0.000},
    -  {{fprof,apply_start_stop,4},            1,    0.000,    0.000}],
    - { suspend,                             299,   32.002,    0.000},     %
    - [ ]}.

    We find no particularly long suspend times, so no function seems to have waited +out followed by a schedule in to the same process).

    Let us find the suspend entry:

    {[{{file,write,2},                       53,    6.281,    0.000},
    +  {{foo,create_file_slow,3},             57,    6.041,    0.000},
    +  {{prim_file,drv_command,4},            50,    4.582,    0.000},
    +  {{prim_file,drv_get_response,1},       34,    2.986,    0.000},
    +  {{lists,map,2},                        10,    2.104,    0.000},
    +  {{prim_file,write,2},                  17,    1.852,    0.000},
    +  {{erlang,port_command,2},              15,    1.713,    0.000},
    +  {{prim_file,drv_command,2},            22,    1.482,    0.000},
    +  {{prim_file,translate_response,2},     11,    1.441,    0.000},
    +  {{prim_file,'-drv_command/2-fun-0-',1},  15,    1.340,    0.000},
    +  {{lists,seq,4},                         3,    0.880,    0.000},
    +  {{foo,'-create_file_slow/2-fun-0-',1},   5,    0.523,    0.000},
    +  {{erlang,bump_reductions,1},            4,    0.503,    0.000},
    +  {{prim_file,open_int_setopts,3},        1,    0.165,    0.000},
    +  {{prim_file,i32,4},                     1,    0.109,    0.000},
    +  {{fprof,apply_start_stop,4},            1,    0.000,    0.000}],
    + { suspend,                             299,   32.002,    0.000},     %
    + [ ]}.

    We find no particularly long suspend times, so no function seems to have waited in a receive statement. Actually, prim_file:drv_command/4 contains a receive statement, but in this test program, the message lies in the process receive buffer when the receive statement is entered. We also see that the total suspend time for the test run is small.

    The suspend pseudo function has an OWN time of zero. This is to prevent the process total OWN time from including time in suspension. Whether suspend -time is really ACC or OWN time is more of a philosophical question.

    Now we look at another interesting pseudo function, garbage_collect:

    {[{{prim_file,drv_command,4},            25,    0.873,    0.873},
    -  {{prim_file,write,2},                  16,    0.692,    0.692},
    -  {{lists,map,2},                         2,    0.195,    0.195}],
    - { garbage_collect,                      43,    1.760,    1.760},     %
    - [ ]}.

    Here we see that no function stands out, which is very normal.

    The garbage_collect pseudo function has not an OWN time of zero like +time is really ACC or OWN time is more of a philosophical question.

    Now we look at another interesting pseudo function, garbage_collect:

    {[{{prim_file,drv_command,4},            25,    0.873,    0.873},
    +  {{prim_file,write,2},                  16,    0.692,    0.692},
    +  {{lists,map,2},                         2,    0.195,    0.195}],
    + { garbage_collect,                      43,    1.760,    1.760},     %
    + [ ]}.

    Here we see that no function stands out, which is very normal.

    The garbage_collect pseudo function has not an OWN time of zero like suspend, instead it is equal to the ACC time.

    Garbage collection often occurs while a process is suspended, but fprof hides this fact by pretending that the suspended function was first unsuspended and then garbage collected. Otherwise the printout would show garbage_collect being called from suspend, but not which function that might have caused the -garbage collection.

    Let us now get back to the test code:

    {[{{foo,create_file_slow,3},            768,  220.314,   14.539},
    -  {{foo,create_file_slow,2},              1,    0.316,    0.021}],
    - { {file,write,2},                      769,  220.630,   14.560},     %
    - [{{prim_file,write,2},                 769,  199.789,   22.573},
    -  {suspend,                              53,    6.281,    0.000}]}.

    Not unexpectedly, we see that file:write/2 was called from +garbage collection.

    Let us now get back to the test code:

    {[{{foo,create_file_slow,3},            768,  220.314,   14.539},
    +  {{foo,create_file_slow,2},              1,    0.316,    0.021}],
    + { {file,write,2},                      769,  220.630,   14.560},     %
    + [{{prim_file,write,2},                 769,  199.789,   22.573},
    +  {suspend,                              53,    6.281,    0.000}]}.

    Not unexpectedly, we see that file:write/2 was called from foo:create_file_slow/3 and foo:create_file_slow/2. The number of calls in each case as well as the used time are also confirms the previous results.

    We see that file:write/2 only calls prim_file:write/2, but let us refrain from digging into the internals of the kernel application.

    If we nevertheless do dig down we find the call to the linked-in driver -that does the file operations towards the host operating system:

    {[{{prim_file,drv_command,4},           772, 1458.356, 1456.643}],
    - { {erlang,port_command,2},             772, 1458.356, 1456.643},     %
    - [{suspend,                              15,    1.713,    0.000}]}.

    This is 86 % of the total run time, and as we saw before it is the close +that does the file operations towards the host operating system:

    {[{{prim_file,drv_command,4},           772, 1458.356, 1456.643}],
    + { {erlang,port_command,2},             772, 1458.356, 1456.643},     %
    + [{suspend,                              15,    1.713,    0.000}]}.

    This is 86 % of the total run time, and as we saw before it is the close operation the absolutely biggest contributor. We find a comparison ratio a -little bit up in the call stack:

    {[{{prim_file,close,1},                   1, 1398.748,    0.024},
    -  {{prim_file,write,2},                 769,  174.672,   12.810},
    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/fprof_chapter.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/fprof_chapter.xhtml	2025-05-10 20:19:27.073353320 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/fprof_chapter.xhtml	2025-05-10 20:19:27.081353392 +0000
    @@ -71,10 +71,10 @@
     
     

    It is also possible to trace immediately into the profiling process that creates the raw profile data, that is to short circuit the tracing and profiling steps -so that the filesystem is not used for tracing.

    Do something like this:

    {ok, Tracer} = fprof:profile(start),
    -fprof:trace([start, {tracer, Tracer}]),
    +so that the filesystem is not used for tracing.

    Do something like this:

    {ok, Tracer} = fprof:profile(start),
    +fprof:trace([start, {tracer, Tracer}]),
     %% Run code to profile
    -fprof:trace(stop);

    This puts less load on the filesystem, but much more load on the Erlang runtime +fprof:trace(stop);

    This puts less load on the filesystem, but much more load on the Erlang runtime system.

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/lcnt_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/lcnt_chapter.xhtml 2025-05-10 20:19:27.073353320 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/lcnt_chapter.xhtml 2025-05-10 20:19:27.081353392 +0000 @@ -128,20 +128,20 @@ Example with Mnesia Transaction Benchmark -

    From the Erlang shell:

    Erlang/OTP 27 [erts-15.0] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit] [lock-counting]
    +

    From the Erlang shell:

    Erlang/OTP 27 [erts-15.0] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit] [lock-counting]
     
    -Eshell V15.0 (press Ctrl+G to abort, type help(). for help)
    -1> Conf = [{db_nodes, [node()]}, {driver_nodes, [node()]}, {replica_nodes, [node()]},
    -    {n_drivers_per_node, 10}, {n_branches, 1000}, {n_accounts_per_branch, 10},
    -    {replica_type, ram_copies}, {stop_after, 60000}, {reuse_history_id, true}], ok.
    +Eshell V15.0 (press Ctrl+G to abort, type help(). for help)
    +1> Conf = [{db_nodes, [node()]}, {driver_nodes, [node()]}, {replica_nodes, [node()]},
    +    {n_drivers_per_node, 10}, {n_branches, 1000}, {n_accounts_per_branch, 10},
    +    {replica_type, ram_copies}, {stop_after, 60000}, {reuse_history_id, true}], ok.
     ok
    -2> mnesia_tpcb:init([{use_running_mnesia, false}|Conf]).
    +2> mnesia_tpcb:init([{use_running_mnesia, false}|Conf]).
         .
         .
         .
     ignore

    Initial configuring of the benchmark is done. It is time to profile the actual -Mnesia benchmark:

    3> lcnt:apply(fun() -> {ok,{time, Tps,_,_,_,_}} = mnesia_tpcb:run([{use_running_mnesia,
    -    true}|Conf]), Tps/60 end).
    +Mnesia benchmark:

    3> lcnt:apply(fun() -> {ok,{time, Tps,_,_,_,_}} = mnesia_tpcb:run([{use_running_mnesia,
    +    true}|Conf]), Tps/60 end).
           .
           .
           .
    @@ -245,63 +245,63 @@
       
       The Big Bang Benchmark
     
    -
    -module(big).
    --export([bang/1]).
    +
    -module(big).
    +-export([bang/1]).
     
    -pinger([], [], true) ->
    +pinger([], [], true) ->
         receive
    -	{procs, Procs, ReportTo} ->
    -	    pinger(Procs, [], ReportTo)
    +	{procs, Procs, ReportTo} ->
    +	    pinger(Procs, [], ReportTo)
         end;
    -pinger([], [], false) ->
    -    receive {ping, From} -> From ! {pong, self()} end,
    -    pinger([],[],false);
    -pinger([], [], ReportTo) ->
    -    ReportTo ! {done, self()},
    -    pinger([],[],false);
    -pinger([], [Po|Pos] = Pongers, ReportTo) ->
    +pinger([], [], false) ->
    +    receive {ping, From} -> From ! {pong, self()} end,
    +    pinger([],[],false);
    +pinger([], [], ReportTo) ->
    +    ReportTo ! {done, self()},
    +    pinger([],[],false);
    +pinger([], [Po|Pos] = Pongers, ReportTo) ->
         receive
    -	{ping, From} ->
    -	    From ! {pong, self()},
    -	    pinger([], Pongers, ReportTo);
    -	{pong, Po} ->
    -	    pinger([], Pos, ReportTo)
    +	{ping, From} ->
    +	    From ! {pong, self()},
    +	    pinger([], Pongers, ReportTo);
    +	{pong, Po} ->
    +	    pinger([], Pos, ReportTo)
         end;
    -pinger([Pi|Pis], Pongers, ReportTo) ->
    -    receive {ping, From} -> From ! {pong, self()}
    +pinger([Pi|Pis], Pongers, ReportTo) ->
    +    receive {ping, From} -> From ! {pong, self()}
         after 0 -> ok
         end,
    -    Pi ! {ping, self()},
    -    pinger(Pis, [Pi|Pongers], ReportTo).
    +    Pi ! {ping, self()},
    +    pinger(Pis, [Pi|Pongers], ReportTo).
     
    -spawn_procs(N) when N =< 0 ->
    -    [];
    -spawn_procs(N) ->
    -    [spawn_link(fun () -> pinger([],[],true) end) | spawn_procs(N-1)].
    +spawn_procs(N) when N =< 0 ->
    +    [];
    +spawn_procs(N) ->
    +    [spawn_link(fun () -> pinger([],[],true) end) | spawn_procs(N-1)].
     
    -send_procs([], Msg) ->
    +send_procs([], Msg) ->
         Msg;
    -send_procs([P|Ps], Msg) ->
    +send_procs([P|Ps], Msg) ->
         P ! Msg,
    -    send_procs(Ps, Msg).
    +    send_procs(Ps, Msg).
     
    -receive_msgs([]) ->
    +receive_msgs([]) ->
         ok;
    -receive_msgs([M|Ms]) ->
    +receive_msgs([M|Ms]) ->
         receive
     	M ->
    -	    receive_msgs(Ms)
    +	    receive_msgs(Ms)
         end.
     
    -bang(N) when integer(N) ->
    -    Procs = spawn_procs(N),
    -    RMsgs = lists:map(fun (P) -> {done, P} end, Procs),
    -    Start = now(),
    -    send_procs(Procs, {procs, Procs, self()}),
    -    receive_msgs(RMsgs),
    -    Stop = now(),
    -    lists:foreach(fun (P) -> exit(P, normal) end, Procs),
    -    timer:now_diff(Stop, Start).

    +bang(N) when integer(N) -> + Procs = spawn_procs(N), + RMsgs = lists:map(fun (P) -> {done, P} end, Procs), + Start = now(), + send_procs(Procs, {procs, Procs, self()}), + receive_msgs(RMsgs), + Stop = now(), + lists:foreach(fun (P) -> exit(P, normal) end, Procs), + timer:now_diff(Stop, Start).

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/make.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/make.xhtml 2025-05-10 20:19:27.073353320 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/make.xhtml 2025-05-10 20:19:27.081353392 +0000 @@ -37,8 +37,8 @@ the first match is used. For example, the following Emakefile means that file1 should be compiled with the options [debug_info,{i,"../foo"}], while all other files in the current directory should be compiled with only the -debug_info flag.

    {'file1',[debug_info,{i,"../foo"}]}.
    -{'*',[debug_info]}.

    +debug_info flag.

    {'file1',[debug_info,{i,"../foo"}]}.
    +{'*',[debug_info]}.

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/notes.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/notes.xhtml 2025-05-10 20:19:27.073353320 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/notes.xhtml 2025-05-10 20:19:27.081353392 +0000 @@ -62,25 +62,25 @@ Fixed Bugs and Malfunctions

    -
    • Dialyzer warnings due to type specs added in dbg have been eliminated.

      Own Id: OTP-18860

    • In Erlang/OTP 26, doing a cover analysis on the line level would return multiple entries for lines on which multiple functions were defined.

      For example, consider this module:

      -module(foo).
      --export([bar/0, baz/0]).
      +
      • Dialyzer warnings due to type specs added in dbg have been eliminated.

        Own Id: OTP-18860

      • In Erlang/OTP 26, doing a cover analysis on the line level would return multiple entries for lines on which multiple functions were defined.

        For example, consider this module:

        -module(foo).
        +-export([bar/0, baz/0]).
         
        -bar() -> ok. baz() -> not_ok.

        In Erlang/OTP 26, analysing on the line level would return two entries -for line 4:

        1> cover:compile_module(foo).
        -{ok,foo}
        -2> foo:bar().
        +bar() -> ok. baz() -> not_ok.

        In Erlang/OTP 26, analysing on the line level would return two entries +for line 4:

        1> cover:compile_module(foo).
        +{ok,foo}
        +2> foo:bar().
         ok
        -3> cover:analyse(foo, coverage, line).
        -{ok,[{{foo,4},{1,0}},{{foo,4},{0,1}}]}
        -4> cover:analyse(foo, calls, line).
        -{ok,[{{foo,4},1},{{foo,4},0}]}

        In Erlang/OTP 27, there will only be a single entry for line 4:

        1> cover:compile_module(foo).
        -{ok,foo}
        -2> foo:bar().
        +3> cover:analyse(foo, coverage, line).
        +{ok,[{{foo,4},{1,0}},{{foo,4},{0,1}}]}
        +4> cover:analyse(foo, calls, line).
        +{ok,[{{foo,4},1},{{foo,4},0}]}

        In Erlang/OTP 27, there will only be a single entry for line 4:

        1> cover:compile_module(foo).
        +{ok,foo}
        +2> foo:bar().
         ok
        -3> cover:analyse(foo, coverage, line).
        -{ok,[{{foo,4},{1,0}}]}
        -4> cover:analyse(foo, calls, line).
        -{ok,[{{foo,4},1}]}

        Own Id: OTP-18998 Aux Id: GH-8159, PR-8182

      • Fixed align command in emacs mode.

        Own Id: OTP-19026 Aux Id: PR-8155

      +3> cover:analyse(foo, coverage, line). +{ok,[{{foo,4},{1,0}}]} +4> cover:analyse(foo, calls, line). +{ok,[{{foo,4},1}]}

      Own Id: OTP-18998 Aux Id: GH-8159, PR-8182

    • Fixed align command in emacs mode.

      Own Id: OTP-19026 Aux Id: PR-8155

    @@ -93,12 +93,12 @@ """. "a\nb\nc"

    Adjacent string literals without intervening white space is now a syntax error, to avoid possible confusion with triple-quoted strings. For example:

    1> "abc""xyz".
     "xyz".
    -* 1:6: adjacent string literals without intervening white space

    POTENTIAL INCOMPATIBILITY

    Own Id: OTP-18750 Aux Id: OTP-18746, PR-7313, PR-7451

  • There is a new tool tprof, which combines the functionality of eprof and cprof under one interface and adds heap profiling. It also has functionality to help with profiling process hierarchies.

    Example:

    1> tprof:profile(lists, seq, [1, 16], #{type => call_memory}).
    +* 1:6: adjacent string literals without intervening white space

    POTENTIAL INCOMPATIBILITY

    Own Id: OTP-18750 Aux Id: OTP-18746, PR-7313, PR-7451

  • There is a new tool tprof, which combines the functionality of eprof and cprof under one interface and adds heap profiling. It also has functionality to help with profiling process hierarchies.

    Example:

    1> tprof:profile(lists, seq, [1, 16], #{type => call_memory}).
     
     ****** Process <0.92.0>  --  100.00% of total *** 
    -FUNCTION          CALLS  WORDS  PER CALL  [     %]
    -lists:seq_loop/3      5     32      6.40  [100.00]
    -                            32            [ 100.0]
    +FUNCTION          CALLS  WORDS  PER CALL  [     %]
    +lists:seq_loop/3      5     32      6.40  [100.00]
    +                            32            [ 100.0]
     ok

    Own Id: OTP-18756 Aux Id: PR-6639

  • Native coverage support has been implemented in the JIT. It will automatically be used by the cover tool to reduce the execution overhead when running cover-compiled code.

    There are also new APIs to support native coverage without using the cover tool.

    To instrument code for native coverage it must be compiled with the line_coverage option.

    To enable native coverage in the runtime system, start it like so:

    $ erl +JPcover true

    There are also the following new functions for supporting native coverage:

    Own Id: OTP-18856 Aux Id: PR-7856

  • The documentation has been migrated to use Markdown and ExDoc.

    Own Id: OTP-18955 Aux Id: PR-8026

  • Improved the align command in emacs mode.

    Own Id: OTP-19080 Aux Id: PR-8288

  • /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/tprof.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/tprof.xhtml 2025-05-10 20:19:27.069353284 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/tprof.xhtml 2025-05-10 20:19:27.077353356 +0000 @@ -55,137 +55,137 @@ Ad-hoc profiling

    -

    Ad-hoc profiling is convenient for profiling a single function call.

    For example:

    1> tprof:profile(lists, seq, [1, 16], #{type => call_memory}).
    +

    Ad-hoc profiling is convenient for profiling a single function call.

    For example:

    1> tprof:profile(lists, seq, [1, 16], #{type => call_memory}).
     
     ****** Process <0.92.0>  --  100.00% of total *** 
    -FUNCTION          CALLS  WORDS  PER CALL  [     %]
    -lists:seq_loop/3      5     32      6.40  [100.00]
    -                            32            [ 100.0]
    +FUNCTION          CALLS  WORDS  PER CALL  [     %]
    +lists:seq_loop/3      5     32      6.40  [100.00]
    +                            32            [ 100.0]
     ok

    By default tracing is enabled for all functions in all modules. When funs -are created in the interactive shell, parts of shell code are also traced:

    1> tprof:profile(fun() -> lists:seq(1, 16) end, #{type => call_memory}).
    +are created in the interactive shell, parts of shell code are also traced:

    1> tprof:profile(fun() -> lists:seq(1, 16) end, #{type => call_memory}).
     
     ****** Process <0.95.0>  --  100.00% of total *** 
    -FUNCTION                   CALLS  WORDS  PER CALL  [    %]
    -erl_eval:do_apply/7            1      3      3.00  [ 3.61]
    -erl_eval:match_list/6          1      3      3.00  [ 3.61]
    -lists:reverse/1                1      4      4.00  [ 4.82]
    -erl_eval:expr_list/7           3      7      2.33  [ 8.43]
    -erl_eval:ret_expr/3            4     16      4.00  [19.28]
    -erl_eval:merge_bindings/4      3     18      6.00  [21.69]
    -lists:seq_loop/3               5     32      6.40  [38.55]
    -                                     83            [100.0]
    -ok

    However, it is possible to limit the trace to specific functions or modules:

    2> tprof:profile(fun() -> lists:seq(1, 16) end,
    -                 #{type => call_memory, pattern => [{lists, seq_loop, '_'}]}).
    +FUNCTION                   CALLS  WORDS  PER CALL  [    %]
    +erl_eval:do_apply/7            1      3      3.00  [ 3.61]
    +erl_eval:match_list/6          1      3      3.00  [ 3.61]
    +lists:reverse/1                1      4      4.00  [ 4.82]
    +erl_eval:expr_list/7           3      7      2.33  [ 8.43]
    +erl_eval:ret_expr/3            4     16      4.00  [19.28]
    +erl_eval:merge_bindings/4      3     18      6.00  [21.69]
    +lists:seq_loop/3               5     32      6.40  [38.55]
    +                                     83            [100.0]
    +ok

    However, it is possible to limit the trace to specific functions or modules:

    2> tprof:profile(fun() -> lists:seq(1, 16) end,
    +                 #{type => call_memory, pattern => [{lists, seq_loop, '_'}]}).
     ****** Process <0.98.0>  --  100.00% of total *** 
    -FUNCTION          CALLS  WORDS  PER CALL  [     %]
    -lists:seq_loop/3      5     32      6.40  [100.00]
    -                            32            [ 100.0]
    +FUNCTION          CALLS  WORDS  PER CALL  [     %]
    +lists:seq_loop/3      5     32      6.40  [100.00]
    +                            32            [ 100.0]
     
     ok

    Ad-hoc profiling results can be printed in a few different ways. The following -examples use the test module defined like this:

    -module(test).
    --export([test_spawn/0]).
    -test_spawn() ->
    -    {Pid, MRef} = spawn_monitor(fun () -> lists:seq(1, 32) end),
    +examples use the test module defined like this:

    -module(test).
    +-export([test_spawn/0]).
    +test_spawn() ->
    +    {Pid, MRef} = spawn_monitor(fun () -> lists:seq(1, 32) end),
         receive
    -        {'DOWN', MRef, process, Pid, normal} ->
    +        {'DOWN', MRef, process, Pid, normal} ->
                 done
    -    end.

    By default per-process statistics is shown:

    1> tprof:profile(test, test_spawn, [], #{type => call_memory}).
    +    end.

    By default per-process statistics is shown:

    1> tprof:profile(test, test_spawn, [], #{type => call_memory}).
     
     ****** Process <0.176.0>    -- 23.66 % of total allocations ***
    -FUNCTION                CALLS  WORDS  PER CALL  [    %]
    -erlang:spawn_monitor/1      1      2         2  [ 9.09]
    -erlang:spawn_opt/4          1      6         6  [27.27]
    -test:test_spawn/0           1     14        14  [63.64]
    -                                  22            [100.0]
    +FUNCTION                CALLS  WORDS  PER CALL  [    %]
    +erlang:spawn_monitor/1      1      2         2  [ 9.09]
    +erlang:spawn_opt/4          1      6         6  [27.27]
    +test:test_spawn/0           1     14        14  [63.64]
    +                                  22            [100.0]
     
     ****** Process <0.177.0>    -- 76.34 % of total allocations ***
    -FUNCTION           CALLS  WORDS  PER CALL  [    %]
    -erlang:apply/2         1      7         7  [ 9.86]
    -lists:seq_loop/3       9     64         7  [90.14]
    -                             71            [100.0]

    The following example prints the combined memory allocation of all +FUNCTION CALLS WORDS PER CALL [ %] +erlang:apply/2 1 7 7 [ 9.86] +lists:seq_loop/3 9 64 7 [90.14] + 71 [100.0]

    The following example prints the combined memory allocation of all processes, sorted by the total number of allocated words in descending -order:

    2> tprof:profile(test, test_spawn, [],
    -                 #{type => call_memory, report => {total, {measurement, descending}}}).
    +order:

    2> tprof:profile(test, test_spawn, [],
    +                 #{type => call_memory, report => {total, {measurement, descending}}}).
     
    -FUNCTION                CALLS  WORDS  PER CALL  [    %]
    -lists:seq_loop/3            9     64         7  [68.82]
    -test:test_spawn/0           1     14        14  [15.05]
    -erlang:apply/2              1      7         7  [ 7.53]
    -erlang:spawn_opt/4          1      6         6  [ 6.45]
    -erlang:spawn_monitor/1      1      2         2  [ 2.15]
    -                                  93            [100.0]

    The profiling data can also be collected for further inspection:

    3> {done, ProfileData} = tprof:profile(fun test:test_spawn/0,
    -                                       #{type => call_memory, report => return}).
    +FUNCTION                CALLS  WORDS  PER CALL  [    %]
    +lists:seq_loop/3            9     64         7  [68.82]
    +test:test_spawn/0           1     14        14  [15.05]
    +erlang:apply/2              1      7         7  [ 7.53]
    +erlang:spawn_opt/4          1      6         6  [ 6.45]
    +erlang:spawn_monitor/1      1      2         2  [ 2.15]
    +                                  93            [100.0]

    The profiling data can also be collected for further inspection:

    3> {done, ProfileData} = tprof:profile(fun test:test_spawn/0,
    +                                       #{type => call_memory, report => return}).
     <...>
    -4> tprof:format(tprof:inspect(ProfileData, process, {percent, descending})).
    +4> tprof:format(tprof:inspect(ProfileData, process, {percent, descending})).
     
     ****** Process <0.223.0>    -- 23.66 % of total allocations ***
    -FUNCTION                CALLS  WORDS  PER CALL  [    %]
    -test:test_spawn/0           1     14        14  [63.64]
    -erlang:spawn_opt/4          1      6         6  [27.27]
    -erlang:spawn_monitor/1      1      2         2  [ 9.09]
    -                                  22            [100.0]
    +FUNCTION                CALLS  WORDS  PER CALL  [    %]
    +test:test_spawn/0           1     14        14  [63.64]
    +erlang:spawn_opt/4          1      6         6  [27.27]
    +erlang:spawn_monitor/1      1      2         2  [ 9.09]
    +                                  22            [100.0]
     
     ****** Process <0.224.0>    -- 76.34 % of total allocations ***
    -FUNCTION           CALLS  WORDS  PER CALL  [    %]
    -lists:seq_loop/3       9     64         7  [90.14]
    -erlang:apply/2         1      7         7  [ 9.86]
    -                             71            [100.0]

    Which processes that are profiled depends on the profiling type.

    • call_count (default) counts calls in all processes.

    • call_time and call_memory limits the profiling to the processes +FUNCTION CALLS WORDS PER CALL [ %] +lists:seq_loop/3 9 64 7 [90.14] +erlang:apply/2 1 7 7 [ 9.86] + 71 [100.0]

    Which processes that are profiled depends on the profiling type.

    • call_count (default) counts calls in all processes.

    • call_time and call_memory limits the profiling to the processes spawned from the user-provided function (using the set_on_spawn -option for trace:process/4).

    call_time and call_memory can be restricted to profile a single process:

    2> tprof:profile(test, test_spawn, [],
    -                 #{type => call_memory, set_on_spawn => false}).
    +option for trace:process/4).

    call_time and call_memory can be restricted to profile a single process:

    2> tprof:profile(test, test_spawn, [],
    +                 #{type => call_memory, set_on_spawn => false}).
     
     ****** Process <0.183.0>    -- 100.00 % of total allocations ***
    -FUNCTION                CALLS  WORDS  PER CALL  [    %]
    -erlang:spawn_monitor/1      1      2         2  [ 9.09]
    -erlang:spawn_opt/4          1      6         6  [27.27]
    -test:test_spawn/0           1     14        14  [63.64]

    Erlang programs can perform expensive operations in other processes +FUNCTION CALLS WORDS PER CALL [ %] +erlang:spawn_monitor/1 1 2 2 [ 9.09] +erlang:spawn_opt/4 1 6 6 [27.27] +test:test_spawn/0 1 14 14 [63.64]

    Erlang programs can perform expensive operations in other processes than the original one. You can include multiple, new, or even all -processes in the trace when measuring time or memory:

    7> pg:start_link().
    -{ok,<0.252.0>}
    -8> tprof:profile(fun() -> pg:join(group, self()) end,
    -                 #{type => call_memory, rootset => [pg]}).
    +processes in the trace when measuring time or memory:

    7> pg:start_link().
    +{ok,<0.252.0>}
    +8> tprof:profile(fun() -> pg:join(group, self()) end,
    +                 #{type => call_memory, rootset => [pg]}).
     ****** Process <0.252.0>    -- 52.86 % of total allocations ***
    -FUNCTION                      CALLS  WORDS  PER CALL  [    %]
    -pg:leave_local_update_ets/5       1      2         2  [ 1.80]
    -gen:reply/2                       1      3         3  [ 2.70]
    -erlang:monitor/2                  1      3         3  [ 2.70]
    -gen_server:try_handle_call/4      1      3         3  [ 2.70]
    -gen_server:try_dispatch/4         1      3         3  [ 2.70]
    -maps:iterator/1                   2      4         2  [ 3.60]
    -maps:take/2                       1      6         6  [ 5.41]
    -pg:join_local_update_ets/5        1      8         8  [ 7.21]
    -pg:handle_info/2                  1      8         8  [ 7.21]
    -pg:handle_call/3                  1      9         9  [ 8.11]
    -gen_server:loop/7                 2      9         4  [ 8.11]
    -ets:lookup/2                      2     10         5  [ 9.01]
    -pg:join_local/3                   1     11        11  [ 9.91]
    -pg:notify_group/5                 2     16         8  [14.41]
    -erlang:setelement/3               2     16         8  [14.41]
    -                                       111            [100.0]
    +FUNCTION                      CALLS  WORDS  PER CALL  [    %]
    +pg:leave_local_update_ets/5       1      2         2  [ 1.80]
    +gen:reply/2                       1      3         3  [ 2.70]
    +erlang:monitor/2                  1      3         3  [ 2.70]
    +gen_server:try_handle_call/4      1      3         3  [ 2.70]
    +gen_server:try_dispatch/4         1      3         3  [ 2.70]
    +maps:iterator/1                   2      4         2  [ 3.60]
    +maps:take/2                       1      6         6  [ 5.41]
    +pg:join_local_update_ets/5        1      8         8  [ 7.21]
    +pg:handle_info/2                  1      8         8  [ 7.21]
    +pg:handle_call/3                  1      9         9  [ 8.11]
    +gen_server:loop/7                 2      9         4  [ 8.11]
    +ets:lookup/2                      2     10         5  [ 9.01]
    +pg:join_local/3                   1     11        11  [ 9.91]
    +pg:notify_group/5                 2     16         8  [14.41]
    +erlang:setelement/3               2     16         8  [14.41]
    +                                       111            [100.0]
     
     ****** Process <0.255.0>    -- 47.14 % of total allocations ***
    -FUNCTION                   CALLS  WORDS  PER CALL  [    %]
    -erl_eval:match_list/6          1      3         3  [ 3.03]
    -erlang:monitor/2               1      3         3  [ 3.03]
    -lists:reverse/1                2      4         2  [ 4.04]
    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/xref_chapter.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/xref_chapter.xhtml	2025-05-10 20:19:27.069353284 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/xref_chapter.xhtml	2025-05-10 20:19:27.077353356 +0000
    @@ -35,25 +35,25 @@
       
       Module Check
     
    -

    Assume we want to check the following module:

    -module(my_module).
    +

    Assume we want to check the following module:

    -module(my_module).
     
    --export([t/1]).
    +-export([t/1]).
     
    -t(A) ->
    -  my_module:t2(A).
    +t(A) ->
    +  my_module:t2(A).
     
    -t2(_) ->
    +t2(_) ->
       true.

    Cross reference data are read from BEAM files, so the first step when checking -an edited module is to compile it:

    1> c(my_module, debug_info).
    +an edited module is to compile it:

    1> c(my_module, debug_info).
     ./my_module.erl:10: Warning: function t2/1 is unused
    -{ok, my_module}

    The debug_info option ensures that the BEAM file contains debug information, +{ok, my_module}

    The debug_info option ensures that the BEAM file contains debug information, which makes it possible to find unused local functions.

    The module can now be checked for calls to deprecated functions, calls to undefined functions, and for unused local -functions:

    2> xref:m(my_module)
    -[{deprecated,[]},
    - {undefined,[{{my_module,t,1},{my_module,t2,1}}]},
    - {unused,[{my_module,t2,1}]}]

    m/1 is also suitable for checking that the BEAM file of a module that is about +functions:

    2> xref:m(my_module)
    +[{deprecated,[]},
    + {undefined,[{{my_module,t,1},{my_module,t2,1}}]},
    + {unused,[{my_module,t2,1}]}]

    m/1 is also suitable for checking that the BEAM file of a module that is about to be loaded into a running a system does not call any undefined functions. In either case, the code path of the code server (see the module code) is used for finding modules that export externally called functions not exported by the @@ -68,28 +68,28 @@ this example an xref server will be used, which makes it possible to analyze applications and releases, and also to select the library path explicitly.

    Each Xref server is referred to by a unique name. The name is given when -creating the server:

    1> xref:start(s).
    -{ok,<0.27.0>}

    Next the system to be analyzed is added to the Xref server. Here the system will +creating the server:

    1> xref:start(s).
    +{ok,<0.27.0>}

    Next the system to be analyzed is added to the Xref server. Here the system will be OTP, so no library path will be needed. Otherwise, when analyzing a system that uses OTP, the OTP modules are typically made library modules by setting the library path to the default OTP code path (or to code_path, see the reference manual). By default, the names of read BEAM files and warnings are output when adding analyzed modules, but these messages -can be avoided by setting default values of some options:

    2> xref:set_default(s, [{verbose,false}, {warnings,false}]).
    +can be avoided by setting default values of some options:

    2> xref:set_default(s, [{verbose,false}, {warnings,false}]).
     ok
    -3> xref:add_release(s, code:lib_dir(), {name, otp}).
    -{ok,otp}

    add_release/3 assumes that all subdirectories of the library directory +3> xref:add_release(s, code:lib_dir(), {name, otp}). +{ok,otp}

    add_release/3 assumes that all subdirectories of the library directory returned by code:lib_dir() contain applications; -the effect is that of reading all BEAM files for the application.

    It is now easy to check the release for calls to undefined functions:

    4> xref:analyze(s, undefined_function_calls).
    -{ok, [...]}

    We can now continue with further analyses, or we can delete the Xref server:

    5> xref:stop(s).

    The check for calls to undefined functions is an example of a predefined +the effect is that of reading all BEAM files for the application.

    It is now easy to check the release for calls to undefined functions:

    4> xref:analyze(s, undefined_function_calls).
    +{ok, [...]}

    We can now continue with further analyses, or we can delete the Xref server:

    5> xref:stop(s).

    The check for calls to undefined functions is an example of a predefined analysis, probably the most useful one. Other examples are the analyses that find unused local functions, or functions that call some given functions. See the analyze/2,3 functions for a complete list of predefined analyses.

    Each predefined analysis is a shorthand for a query, a sentence of a tiny language providing cross reference data as values of predefined variables. The check for calls to -undefined functions can thus be stated as a query:

    4> xref:q(s, "(XC - UC) || (XU - X - B)").
    -{ok,[...]}

    The query asks for the restriction of external calls except the unresolved calls +undefined functions can thus be stated as a query:

    4> xref:q(s, "(XC - UC) || (XU - X - B)").
    +{ok,[...]}

    The query asks for the restriction of external calls except the unresolved calls to calls to functions that are externally used but neither exported nor built-in functions (the || operator restricts the used functions while the | operator restricts the calling functions). The - operator returns the difference of two @@ -119,8 +119,8 @@ provided with a simple language. Below are some expressions of the language with comments, focusing on elements of the language rather than providing useful examples. The analyzed system is assumed to be OTP, so in order to run the -queries, first evaluate these calls:

    xref:start(s).
    -xref:add_release(s, code:root_dir()).
    • xref:q(s, "(Fun) xref : Mod"). - All functions of the xref module.

    • xref:q(s, "xref : Mod * X"). - All exported functions of the xref +queries, first evaluate these calls:

      xref:start(s).
      +xref:add_release(s, code:root_dir()).
      • xref:q(s, "(Fun) xref : Mod"). - All functions of the xref module.

      • xref:q(s, "xref : Mod * X"). - All exported functions of the xref module. The first operand of the intersection operator * is implicitly converted to the more special type of the second operand.

      • xref:q(s, "(Mod) tools"). - All modules of the Tools application.

      • xref:q(s, '"xref_.*" : Mod'). - All modules with a name beginning with xref_.

      • xref:q(s, "# E | X "). - Number of calls from exported functions.

      • xref:q(s, "XC || L "). - All external calls to local functions.

      • xref:q(s, "XC * LC"). - All calls that have both an external and a local @@ -163,18 +163,18 @@ a module M1 is said to call a module M2 if there is some function in M1 that calls some function in M2. It would be nice if we could use the much smaller module graph, since it is available also in the light weight -modulesmode of Xref servers.

        t(S) ->
        -  {ok, _} = xref:q(S, "Eplus := closure E"),
        -  {ok, Ms} = xref:q(S, "AM"),
        -  Fun = fun(M, N) ->
        -      Q = io_lib:format("# (Mod) (Eplus | ~p : Mod)", [M]),
        -      {ok, N0} = xref:q(S, lists:flatten(Q)),
        +modulesmode of Xref servers.

        t(S) ->
        +  {ok, _} = xref:q(S, "Eplus := closure E"),
        +  {ok, Ms} = xref:q(S, "AM"),
        +  Fun = fun(M, N) ->
        +      Q = io_lib:format("# (Mod) (Eplus | ~p : Mod)", [M]),
        +      {ok, N0} = xref:q(S, lists:flatten(Q)),
               N + N0
             end,
        -  Sum = lists:foldl(Fun, 0, Ms),
        -  ok = xref:forget(S, 'Eplus'),
        -  {ok, Tot} = xref:q(S, "# (closure ME | AM)"),
        -  100 * ((Tot - Sum) / Tot).

        Comments on the code:

        • We want to find the reduction of the closure of the function graph to modules. + Sum = lists:foldl(Fun, 0, Ms), + ok = xref:forget(S, 'Eplus'), + {ok, Tot} = xref:q(S, "# (closure ME | AM)"), + 100 * ((Tot - Sum) / Tot).

        Comments on the code:

        • We want to find the reduction of the closure of the function graph to modules. The direct expression for doing that would be (Mod) (closure E | AM), but then we would have to represent all of the transitive closure of E in memory. Instead the number of indirectly used modules is found for each analyzed /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tprof.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tprof.html 2025-05-10 20:19:27.321355567 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tprof.html 2025-05-10 20:19:27.321355567 +0000 @@ -160,137 +160,137 @@ Ad-hoc profiling -

          Ad-hoc profiling is convenient for profiling a single function call.

          For example:

          1> tprof:profile(lists, seq, [1, 16], #{type => call_memory}).
          +

          Ad-hoc profiling is convenient for profiling a single function call.

          For example:

          1> tprof:profile(lists, seq, [1, 16], #{type => call_memory}).
           
           ****** Process <0.92.0>  --  100.00% of total *** 
          -FUNCTION          CALLS  WORDS  PER CALL  [     %]
          -lists:seq_loop/3      5     32      6.40  [100.00]
          -                            32            [ 100.0]
          +FUNCTION          CALLS  WORDS  PER CALL  [     %]
          +lists:seq_loop/3      5     32      6.40  [100.00]
          +                            32            [ 100.0]
           ok

          By default tracing is enabled for all functions in all modules. When funs -are created in the interactive shell, parts of shell code are also traced:

          1> tprof:profile(fun() -> lists:seq(1, 16) end, #{type => call_memory}).
          +are created in the interactive shell, parts of shell code are also traced:

          1> tprof:profile(fun() -> lists:seq(1, 16) end, #{type => call_memory}).
           
           ****** Process <0.95.0>  --  100.00% of total *** 
          -FUNCTION                   CALLS  WORDS  PER CALL  [    %]
          -erl_eval:do_apply/7            1      3      3.00  [ 3.61]
          -erl_eval:match_list/6          1      3      3.00  [ 3.61]
          -lists:reverse/1                1      4      4.00  [ 4.82]
          -erl_eval:expr_list/7           3      7      2.33  [ 8.43]
          -erl_eval:ret_expr/3            4     16      4.00  [19.28]
          -erl_eval:merge_bindings/4      3     18      6.00  [21.69]
          -lists:seq_loop/3               5     32      6.40  [38.55]
          -                                     83            [100.0]
          -ok

          However, it is possible to limit the trace to specific functions or modules:

          2> tprof:profile(fun() -> lists:seq(1, 16) end,
          -                 #{type => call_memory, pattern => [{lists, seq_loop, '_'}]}).
          +FUNCTION                   CALLS  WORDS  PER CALL  [    %]
          +erl_eval:do_apply/7            1      3      3.00  [ 3.61]
          +erl_eval:match_list/6          1      3      3.00  [ 3.61]
          +lists:reverse/1                1      4      4.00  [ 4.82]
          +erl_eval:expr_list/7           3      7      2.33  [ 8.43]
          +erl_eval:ret_expr/3            4     16      4.00  [19.28]
          +erl_eval:merge_bindings/4      3     18      6.00  [21.69]
          +lists:seq_loop/3               5     32      6.40  [38.55]
          +                                     83            [100.0]
          +ok

          However, it is possible to limit the trace to specific functions or modules:

          2> tprof:profile(fun() -> lists:seq(1, 16) end,
          +                 #{type => call_memory, pattern => [{lists, seq_loop, '_'}]}).
           ****** Process <0.98.0>  --  100.00% of total *** 
          -FUNCTION          CALLS  WORDS  PER CALL  [     %]
          -lists:seq_loop/3      5     32      6.40  [100.00]
          -                            32            [ 100.0]
          +FUNCTION          CALLS  WORDS  PER CALL  [     %]
          +lists:seq_loop/3      5     32      6.40  [100.00]
          +                            32            [ 100.0]
           
           ok

          Ad-hoc profiling results can be printed in a few different ways. The following -examples use the test module defined like this:

          -module(test).
          --export([test_spawn/0]).
          -test_spawn() ->
          -    {Pid, MRef} = spawn_monitor(fun () -> lists:seq(1, 32) end),
          +examples use the test module defined like this:

          -module(test).
          +-export([test_spawn/0]).
          +test_spawn() ->
          +    {Pid, MRef} = spawn_monitor(fun () -> lists:seq(1, 32) end),
               receive
          -        {'DOWN', MRef, process, Pid, normal} ->
          +        {'DOWN', MRef, process, Pid, normal} ->
                       done
          -    end.

          By default per-process statistics is shown:

          1> tprof:profile(test, test_spawn, [], #{type => call_memory}).
          +    end.

          By default per-process statistics is shown:

          1> tprof:profile(test, test_spawn, [], #{type => call_memory}).
           
           ****** Process <0.176.0>    -- 23.66 % of total allocations ***
          -FUNCTION                CALLS  WORDS  PER CALL  [    %]
          -erlang:spawn_monitor/1      1      2         2  [ 9.09]
          -erlang:spawn_opt/4          1      6         6  [27.27]
          -test:test_spawn/0           1     14        14  [63.64]
          -                                  22            [100.0]
          +FUNCTION                CALLS  WORDS  PER CALL  [    %]
          +erlang:spawn_monitor/1      1      2         2  [ 9.09]
          +erlang:spawn_opt/4          1      6         6  [27.27]
          +test:test_spawn/0           1     14        14  [63.64]
          +                                  22            [100.0]
           
           ****** Process <0.177.0>    -- 76.34 % of total allocations ***
          -FUNCTION           CALLS  WORDS  PER CALL  [    %]
          -erlang:apply/2         1      7         7  [ 9.86]
          -lists:seq_loop/3       9     64         7  [90.14]
          -                             71            [100.0]

          The following example prints the combined memory allocation of all +FUNCTION CALLS WORDS PER CALL [ %] +erlang:apply/2 1 7 7 [ 9.86] +lists:seq_loop/3 9 64 7 [90.14] + 71 [100.0]

          The following example prints the combined memory allocation of all processes, sorted by the total number of allocated words in descending -order:

          2> tprof:profile(test, test_spawn, [],
          -                 #{type => call_memory, report => {total, {measurement, descending}}}).
          +order:

          2> tprof:profile(test, test_spawn, [],
          +                 #{type => call_memory, report => {total, {measurement, descending}}}).
           
          -FUNCTION                CALLS  WORDS  PER CALL  [    %]
          -lists:seq_loop/3            9     64         7  [68.82]
          -test:test_spawn/0           1     14        14  [15.05]
          -erlang:apply/2              1      7         7  [ 7.53]
          -erlang:spawn_opt/4          1      6         6  [ 6.45]
          -erlang:spawn_monitor/1      1      2         2  [ 2.15]
          -                                  93            [100.0]

          The profiling data can also be collected for further inspection:

          3> {done, ProfileData} = tprof:profile(fun test:test_spawn/0,
          -                                       #{type => call_memory, report => return}).
          +FUNCTION                CALLS  WORDS  PER CALL  [    %]
          +lists:seq_loop/3            9     64         7  [68.82]
          +test:test_spawn/0           1     14        14  [15.05]
          +erlang:apply/2              1      7         7  [ 7.53]
          +erlang:spawn_opt/4          1      6         6  [ 6.45]
          +erlang:spawn_monitor/1      1      2         2  [ 2.15]
          +                                  93            [100.0]

          The profiling data can also be collected for further inspection:

          3> {done, ProfileData} = tprof:profile(fun test:test_spawn/0,
          +                                       #{type => call_memory, report => return}).
           <...>
          -4> tprof:format(tprof:inspect(ProfileData, process, {percent, descending})).
          +4> tprof:format(tprof:inspect(ProfileData, process, {percent, descending})).
           
           ****** Process <0.223.0>    -- 23.66 % of total allocations ***
          -FUNCTION                CALLS  WORDS  PER CALL  [    %]
          -test:test_spawn/0           1     14        14  [63.64]
          -erlang:spawn_opt/4          1      6         6  [27.27]
          -erlang:spawn_monitor/1      1      2         2  [ 9.09]
          -                                  22            [100.0]
          +FUNCTION                CALLS  WORDS  PER CALL  [    %]
          +test:test_spawn/0           1     14        14  [63.64]
          +erlang:spawn_opt/4          1      6         6  [27.27]
          +erlang:spawn_monitor/1      1      2         2  [ 9.09]
          +                                  22            [100.0]
           
           ****** Process <0.224.0>    -- 76.34 % of total allocations ***
          -FUNCTION           CALLS  WORDS  PER CALL  [    %]
          -lists:seq_loop/3       9     64         7  [90.14]
          -erlang:apply/2         1      7         7  [ 9.86]
          -                             71            [100.0]

          Which processes that are profiled depends on the profiling type.

          • call_count (default) counts calls in all processes.

          • call_time and call_memory limits the profiling to the processes +FUNCTION CALLS WORDS PER CALL [ %] +lists:seq_loop/3 9 64 7 [90.14] +erlang:apply/2 1 7 7 [ 9.86] + 71 [100.0]

          Which processes that are profiled depends on the profiling type.

          • call_count (default) counts calls in all processes.

          • call_time and call_memory limits the profiling to the processes spawned from the user-provided function (using the set_on_spawn -option for trace:process/4).

          call_time and call_memory can be restricted to profile a single process:

          2> tprof:profile(test, test_spawn, [],
          -                 #{type => call_memory, set_on_spawn => false}).
          +option for trace:process/4).

        call_time and call_memory can be restricted to profile a single process:

        2> tprof:profile(test, test_spawn, [],
        +                 #{type => call_memory, set_on_spawn => false}).
         
         ****** Process <0.183.0>    -- 100.00 % of total allocations ***
        -FUNCTION                CALLS  WORDS  PER CALL  [    %]
        -erlang:spawn_monitor/1      1      2         2  [ 9.09]
        -erlang:spawn_opt/4          1      6         6  [27.27]
        -test:test_spawn/0           1     14        14  [63.64]

        Erlang programs can perform expensive operations in other processes +FUNCTION CALLS WORDS PER CALL [ %] +erlang:spawn_monitor/1 1 2 2 [ 9.09] +erlang:spawn_opt/4 1 6 6 [27.27] +test:test_spawn/0 1 14 14 [63.64]

    Erlang programs can perform expensive operations in other processes than the original one. You can include multiple, new, or even all -processes in the trace when measuring time or memory:

    7> pg:start_link().
    -{ok,<0.252.0>}
    -8> tprof:profile(fun() -> pg:join(group, self()) end,
    -                 #href_anchor"ss">type => call_memory, rootset => [pg]}).
    +processes in the trace when measuring time or memory:

    7> pg:start_link().
    +{ok,<0.252.0>}
    +8> tprof:profile(fun() -> pg:join(group, self()) end,
    +                 #href_anchor"ss">type => call_memory, rootset => [pg]}).
     ****** Process <0.252.0>    -- 52.86 % of total allocations ***
    -FUNCTION                      CALLS  WORDS  PER CALL  [    %]
    -pg:leave_local_update_ets/5       1      2         2  [ 1.80]
    -gen:reply/2                       1      3         3  [ 2.70]
    -erlang:monitor/2                  1      3         3  [ 2.70]
    -gen_server:try_handle_call/4      1      3         3  [ 2.70]
    -gen_server:try_dispatch/4         1      3         3  [ 2.70]
    -maps:iterator/1                   2      4         2  [ 3.60]
    -maps:take/2                       1      6         6  [ 5.41]
    -pg:join_local_update_ets/5        1      8         8  [ 7.21]
    -pg:handle_info/2                  1      8         8  [ 7.21]
    -pg:handle_call/3                  1      9         9  [ 8.11]
    -gen_server:loop/7                 2      9         4  [ 8.11]
    -ets:lookup/2                      2     10         5  [ 9.01]
    -pg:join_local/3                   1     11        11  [ 9.91]
    -pg:notify_group/5                 2     16         8  [14.41]
    -erlang:setelement/3               2     16         8  [14.41]
    -                                       111            [100.0]
    +FUNCTION                      CALLS  WORDS  PER CALL  [    %]
    +pg:leave_local_update_ets/5       1      2         2  [ 1.80]
    +gen:reply/2                       1      3         3  [ 2.70]
    +erlang:monitor/2                  1      3         3  [ 2.70]
    +gen_server:try_handle_call/4      1      3         3  [ 2.70]
    +gen_server:try_dispatch/4         1      3         3  [ 2.70]
    +maps:iterator/1                   2      4         2  [ 3.60]
    +maps:take/2                       1      6         6  [ 5.41]
    +pg:join_local_update_ets/5        1      8         8  [ 7.21]
    +pg:handle_info/2                  1      8         8  [ 7.21]
    +pg:handle_call/3                  1      9         9  [ 8.11]
    +gen_server:loop/7                 2      9         4  [ 8.11]
    +ets:lookup/2                      2     10         5  [ 9.01]
    +pg:join_local/3                   1     11        11  [ 9.91]
    +pg:notify_group/5                 2     16         8  [14.41]
    +erlang:setelement/3               2     16         8  [14.41]
    +                                       111            [100.0]
     
     ****** Process <0.255.0>    -- 47.14 % of total allocations ***
    -FUNCTION                   CALLS  WORDS  PER CALL  [    %]
    -erl_eval:match_list/6          1      3         3  [ 3.03]
    -erlang:monitor/2               1      3         3  [ 3.03]
    -lists:reverse/1                2      4         2  [ 4.04]
    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/xref.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/xref.html	2025-05-10 20:19:27.381356112 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/xref.html	2025-05-10 20:19:27.409356365 +0000
    @@ -3722,7 +3722,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/xref_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/xref_chapter.html 2025-05-10 20:19:27.441356656 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/xref_chapter.html 2025-05-10 20:19:27.445356692 +0000 @@ -140,25 +140,25 @@ Module Check -

    Assume we want to check the following module:

    -module(my_module).
    +

    Assume we want to check the following module:

    -module(my_module).
     
    --export([t/1]).
    +-export([t/1]).
     
    -t(A) ->
    -  my_module:t2(A).
    +t(A) ->
    +  my_module:t2(A).
     
    -t2(_) ->
    +t2(_) ->
       true.

    Cross reference data are read from BEAM files, so the first step when checking -an edited module is to compile it:

    1> c(my_module, debug_info).
    +an edited module is to compile it:

    1> c(my_module, debug_info).
     ./my_module.erl:10: Warning: function t2/1 is unused
    -{ok, my_module}

    The debug_info option ensures that the BEAM file contains debug information, +{ok, my_module}

    The debug_info option ensures that the BEAM file contains debug information, which makes it possible to find unused local functions.

    The module can now be checked for calls to deprecated functions, calls to undefined functions, and for unused local -functions:

    2> xref:m(my_module)
    -[{deprecated,[]},
    - {undefined,[{{my_module,t,1},{my_module,t2,1}}]},
    - {unused,[{my_module,t2,1}]}]

    m/1 is also suitable for checking that the BEAM file of a module that is about +functions:

    2> xref:m(my_module)
    +[{deprecated,[]},
    + {undefined,[{{my_module,t,1},{my_module,t2,1}}]},
    + {unused,[{my_module,t2,1}]}]

    m/1 is also suitable for checking that the BEAM file of a module that is about to be loaded into a running a system does not call any undefined functions. In either case, the code path of the code server (see the module code) is used for finding modules that export externally called functions not exported by the @@ -173,28 +173,28 @@ this example an xref server will be used, which makes it possible to analyze applications and releases, and also to select the library path explicitly.

    Each Xref server is referred to by a unique name. The name is given when -creating the server:

    1> xref:start(s).
    -{ok,<0.27.0>}

    Next the system to be analyzed is added to the Xref server. Here the system will +creating the server:

    1> xref:start(s).
    +{ok,<0.27.0>}

    Next the system to be analyzed is added to the Xref server. Here the system will be OTP, so no library path will be needed. Otherwise, when analyzing a system that uses OTP, the OTP modules are typically made library modules by setting the library path to the default OTP code path (or to code_path, see the reference manual). By default, the names of read BEAM files and warnings are output when adding analyzed modules, but these messages -can be avoided by setting default values of some options:

    2> xref:set_default(s, [{verbose,false}, {warnings,false}]).
    +can be avoided by setting default values of some options:

    2> xref:set_default(s, [{verbose,false}, {warnings,false}]).
     ok
    -3> xref:add_release(s, code:lib_dir(), {name, otp}).
    -{ok,otp}

    add_release/3 assumes that all subdirectories of the library directory +3> xref:add_release(s, code:lib_dir(), {name, otp}). +{ok,otp}

    add_release/3 assumes that all subdirectories of the library directory returned by code:lib_dir() contain applications; -the effect is that of reading all BEAM files for the application.

    It is now easy to check the release for calls to undefined functions:

    4> xref:analyze(s, undefined_function_calls).
    -{ok, [...]}

    We can now continue with further analyses, or we can delete the Xref server:

    5> xref:stop(s).

    The check for calls to undefined functions is an example of a predefined +the effect is that of reading all BEAM files for the application.

    It is now easy to check the release for calls to undefined functions:

    4> xref:analyze(s, undefined_function_calls).
    +{ok, [...]}

    We can now continue with further analyses, or we can delete the Xref server:

    5> xref:stop(s).

    The check for calls to undefined functions is an example of a predefined analysis, probably the most useful one. Other examples are the analyses that find unused local functions, or functions that call some given functions. See the analyze/2,3 functions for a complete list of predefined analyses.

    Each predefined analysis is a shorthand for a query, a sentence of a tiny language providing cross reference data as values of predefined variables. The check for calls to -undefined functions can thus be stated as a query:

    4> xref:q(s, "(XC - UC) || (XU - X - B)").
    -{ok,[...]}

    The query asks for the restriction of external calls except the unresolved calls +undefined functions can thus be stated as a query:

    4> xref:q(s, "(XC - UC) || (XU - X - B)").
    +{ok,[...]}

    The query asks for the restriction of external calls except the unresolved calls to calls to functions that are externally used but neither exported nor built-in functions (the || operator restricts the used functions while the | operator restricts the calling functions). The - operator returns the difference of two @@ -224,8 +224,8 @@ provided with a simple language. Below are some expressions of the language with comments, focusing on elements of the language rather than providing useful examples. The analyzed system is assumed to be OTP, so in order to run the -queries, first evaluate these calls:

    xref:start(s).
    -xref:add_release(s, code:root_dir()).
    • xref:q(s, "(Fun) xref : Mod"). - All functions of the xref module.

    • xref:q(s, "xref : Mod * X"). - All exported functions of the xref +queries, first evaluate these calls:

      xref:start(s).
      +xref:add_release(s, code:root_dir()).
      • xref:q(s, "(Fun) xref : Mod"). - All functions of the xref module.

      • xref:q(s, "xref : Mod * X"). - All exported functions of the xref module. The first operand of the intersection operator * is implicitly converted to the more special type of the second operand.

      • xref:q(s, "(Mod) tools"). - All modules of the Tools application.

      • xref:q(s, '"xref_.*" : Mod'). - All modules with a name beginning with xref_.

      • xref:q(s, "# E | X "). - Number of calls from exported functions.

      • xref:q(s, "XC || L "). - All external calls to local functions.

      • xref:q(s, "XC * LC"). - All calls that have both an external and a local @@ -268,18 +268,18 @@ a module M1 is said to call a module M2 if there is some function in M1 that calls some function in M2. It would be nice if we could use the much smaller module graph, since it is available also in the light weight -modulesmode of Xref servers.

        t(S) ->
        -  {ok, _} = xref:q(S, "Eplus := closure E"),
        -  {ok, Ms} = xref:q(S, "AM"),
        -  Fun = fun(M, N) ->
        -      Q = io_lib:format("# (Mod) (Eplus | ~p : Mod)", [M]),
        -      {ok, N0} = xref:q(S, lists:flatten(Q)),
        +modulesmode of Xref servers.

        t(S) ->
        +  {ok, _} = xref:q(S, "Eplus := closure E"),
        +  {ok, Ms} = xref:q(S, "AM"),
        +  Fun = fun(M, N) ->
        +      Q = io_lib:format("# (Mod) (Eplus | ~p : Mod)", [M]),
        +      {ok, N0} = xref:q(S, lists:flatten(Q)),
               N + N0
             end,
        -  Sum = lists:foldl(Fun, 0, Ms),
        -  ok = xref:forget(S, 'Eplus'),
        -  {ok, Tot} = xref:q(S, "# (closure ME | AM)"),
        -  100 * ((Tot - Sum) / Tot).

        Comments on the code:

        • We want to find the reduction of the closure of the function graph to modules. + Sum = lists:foldl(Fun, 0, Ms), + ok = xref:forget(S, 'Eplus'), + {ok, Tot} = xref:q(S, "# (closure ME | AM)"), + 100 * ((Tot - Sum) / Tot).

        Comments on the code:

        • We want to find the reduction of the closure of the function graph to modules. The direct expression for doing that would be (Mod) (closure E | AM), but then we would have to represent all of the transitive closure of E in memory. Instead the number of indirectly used modules is found for each analyzed @@ -354,7 +354,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/404.html 2025-05-10 20:19:27.465356873 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/404.html 2025-05-10 20:19:27.465356873 +0000 @@ -147,7 +147,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/api-reference.html 2025-05-10 20:19:27.509357272 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/api-reference.html 2025-05-10 20:19:27.533357490 +0000 @@ -2418,7 +2418,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/chapter.html 2025-05-10 20:19:27.553357672 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/chapter.html 2025-05-10 20:19:27.557357708 +0000 @@ -161,13 +161,13 @@ is the object reference. Optional arguments are last and expressed as tagged tuples in any order.

          For example the wxWindow C++ class is implemented in the wxWindow erlang module and the member wxWindow::CenterOnParent is thus -wxWindow:centerOnParent. The following C++ code:

            wxWindow MyWin = new wxWindow();
          -  MyWin.CenterOnParent(wxVERTICAL);
          +wxWindow:centerOnParent. The following C++ code:

            wxWindow MyWin = new wxWindow();
          +  MyWin.CenterOnParent(wxVERTICAL);
             ...
          -  delete MyWin;

          would in erlang look like:

            MyWin = wxWindow:new(),
          -  wxWindow:centerOnParent(MyWin, [{dir,?wxVERTICAL}]),
          +  delete MyWin;

          would in erlang look like:

            MyWin = wxWindow:new(),
          +  wxWindow:centerOnParent(MyWin, [{dir,?wxVERTICAL}]),
             ...
          -  wxWindow:destroy(MyWin),

          When you are reading wxWidgets documentation or the examples, you will notice + wxWindow:destroy(MyWin),

          When you are reading wxWidgets documentation or the examples, you will notice that some of the most basic classes are missing in wx, they are directly mapped to corresponding erlang terms:

          • wxPoint is represented by {Xcoord,Ycoord}

          • wxSize is represented by {Width,Height}

          • wxRect is represented by {Xcoord,Ycoord,Width,Height}

          • wxColour is represented by {Red,Green,Blue[,Alpha]}

          • wxString is represented by unicode:charlist()

          • wxGBPosition is represented by {Row,Column}

          • wxGBSpan is represented by {RowSpan,ColumnSPan}

          • wxGridCellCoords is represented by {Row,Column}

          In the places where the erlang API differs from the original one it should be @@ -195,14 +195,14 @@ from several processes in your application, you must share the environment. You can get the active environment with wx:get_env/0 and set it in the new processes with wx:set_env/1. Two processes or applications which have both -called wx:new() will not be able use each others objects.

            wx:new(),
          -  MyWin = wxFrame:new(wx:null(), 42, "Example", []),
          -  Env = wx:get_env(),
          -  spawn(fun() ->
          -           wx:set_env(Env),
          +called wx:new() will not be able use each others objects.

            wx:new(),
          +  MyWin = wxFrame:new(wx:null(), 42, "Example", []),
          +  Env = wx:get_env(),
          +  spawn(fun() ->
          +           wx:set_env(Env),
                      %% Here you can do wx calls from your helper process.
                      ...
          -        end),
          +        end),
             ...

          When wx:destroy/0 is invoked or when all processes in the application have died, the memory is deleted and all windows created by that application are closed.

          The wx application never cleans or garbage collects memory as long as the user @@ -308,7 +308,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/gl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/gl.html 2025-05-10 20:19:27.933361116 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/gl.html 2025-05-10 20:19:28.105362676 +0000 @@ -41049,7 +41049,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/glu.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/glu.html 2025-05-10 20:19:28.177363328 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/glu.html 2025-05-10 20:19:28.177363328 +0000 @@ -1821,7 +1821,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/notes.html 2025-05-10 20:19:28.213363655 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/notes.html 2025-05-10 20:19:28.213363655 +0000 @@ -1082,7 +1082,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/search.html 2025-05-10 20:19:28.233363836 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/search.html 2025-05-10 20:19:28.233363836 +0000 @@ -145,7 +145,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx.epub/OEBPS/chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx.epub/OEBPS/chapter.xhtml 2025-05-10 20:19:28.309364525 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx.epub/OEBPS/chapter.xhtml 2025-05-10 20:19:28.357364961 +0000 @@ -56,13 +56,13 @@ is the object reference. Optional arguments are last and expressed as tagged tuples in any order.

          For example the wxWindow C++ class is implemented in the wxWindow erlang module and the member wxWindow::CenterOnParent is thus -wxWindow:centerOnParent. The following C++ code:

            wxWindow MyWin = new wxWindow();
          -  MyWin.CenterOnParent(wxVERTICAL);
          +wxWindow:centerOnParent. The following C++ code:

            wxWindow MyWin = new wxWindow();
          +  MyWin.CenterOnParent(wxVERTICAL);
             ...
          -  delete MyWin;

          would in erlang look like:

            MyWin = wxWindow:new(),
          -  wxWindow:centerOnParent(MyWin, [{dir,?wxVERTICAL}]),
          +  delete MyWin;

          would in erlang look like:

            MyWin = wxWindow:new(),
          +  wxWindow:centerOnParent(MyWin, [{dir,?wxVERTICAL}]),
             ...
          -  wxWindow:destroy(MyWin),

          When you are reading wxWidgets documentation or the examples, you will notice + wxWindow:destroy(MyWin),

          When you are reading wxWidgets documentation or the examples, you will notice that some of the most basic classes are missing in wx, they are directly mapped to corresponding erlang terms:

          • wxPoint is represented by {Xcoord,Ycoord}

          • wxSize is represented by {Width,Height}

          • wxRect is represented by {Xcoord,Ycoord,Width,Height}

          • wxColour is represented by {Red,Green,Blue[,Alpha]}

          • wxString is represented by unicode:charlist()

          • wxGBPosition is represented by {Row,Column}

          • wxGBSpan is represented by {RowSpan,ColumnSPan}

          • wxGridCellCoords is represented by {Row,Column}

          In the places where the erlang API differs from the original one it should be @@ -90,14 +90,14 @@ from several processes in your application, you must share the environment. You can get the active environment with wx:get_env/0 and set it in the new processes with wx:set_env/1. Two processes or applications which have both -called wx:new() will not be able use each others objects.

            wx:new(),
          -  MyWin = wxFrame:new(wx:null(), 42, "Example", []),
          -  Env = wx:get_env(),
          -  spawn(fun() ->
          -           wx:set_env(Env),
          +called wx:new() will not be able use each others objects.

            wx:new(),
          +  MyWin = wxFrame:new(wx:null(), 42, "Example", []),
          +  Env = wx:get_env(),
          +  spawn(fun() ->
          +           wx:set_env(Env),
                      %% Here you can do wx calls from your helper process.
                      ...
          -        end),
          +        end),
             ...

          When wx:destroy/0 is invoked or when all processes in the application have died, the memory is deleted and all windows created by that application are closed.

          The wx application never cleans or garbage collects memory as long as the user /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx.epub/OEBPS/content.opf 2025-05-10 20:19:28.309364525 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx.epub/OEBPS/content.opf 2025-05-10 20:19:28.357364961 +0000 @@ -4,10 +4,10 @@ version="3.0"> wx - 2.4.3 - urn:uuid:fbdb633c-f553-bb0d-1746-f7b122a27a17 + urn:uuid:39ab106e-fd67-4b9f-69c7-5617c9548c00 en - 2025-05-10T20:11:31Z + 2041-06-12T09:31:39Z /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx.epub/OEBPS/wx_object.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx.epub/OEBPS/wx_object.xhtml 2025-05-10 20:19:28.261364090 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx.epub/OEBPS/wx_object.xhtml 2025-05-10 20:19:28.309364525 +0000 @@ -31,36 +31,36 @@ shutdown | Term, terminate(State) is called. It lets the user module clean up, it is always called when server terminates or when wx_object() in the driver is deleted. If the Parent process terminates the Module:terminate/2 function is -called.
          terminate(Reason, State)

          Example:

            -module(myDialog).
          -  -export([new/2, show/1, destroy/1]).  %% API
          -  -export([init/1, handle_call/3, handle_event/2,
          -           handle_info/2, code_change/3, terminate/2]).
          +called.
          terminate(Reason, State)

          Example:

            -module(myDialog).
          +  -export([new/2, show/1, destroy/1]).  %% API
          +  -export([init/1, handle_call/3, handle_event/2,
          +           handle_info/2, code_change/3, terminate/2]).
                      new/2, showModal/1, destroy/1]).  %% Callbacks
           
             %% Client API
          -  new(Parent, Msg) ->
          -     wx_object:start(?MODULE, [Parent,Id], []).
          +  new(Parent, Msg) ->
          +     wx_object:start(?MODULE, [Parent,Id], []).
           
          -  show(Dialog) ->
          -     wx_object:call(Dialog, show_modal).
          +  show(Dialog) ->
          +     wx_object:call(Dialog, show_modal).
           
          -  destroy(Dialog) ->
          -     wx_object:call(Dialog, destroy).
          +  destroy(Dialog) ->
          +     wx_object:call(Dialog, destroy).
           
             %% Server Implementation ala gen_server
          -  init([Parent, Str]) ->
          -     Dialog = wxDialog:new(Parent, 42, "Testing", []),
          +  init([Parent, Str]) ->
          +     Dialog = wxDialog:new(Parent, 42, "Testing", []),
                ...
          -     wxDialog:connect(Dialog, command_button_clicked),
          -     {Dialog, MyState}.
          +     wxDialog:connect(Dialog, command_button_clicked),
          +     {Dialog, MyState}.
           
          -  handle_call(show, _From, State) ->
          -     wxDialog:show(State#state.win),
          -     {reply, ok, State};
          +  handle_call(show, _From, State) ->
          +     wxDialog:show(State#state.win),
          +     {reply, ok, State};
             ...
          -  handle_event(#wx{}, State) ->
          -     io:format("Users clicked button~n",[]),
          -     {noreply, State};
          +  handle_event(#wx{}, State) ->
          +     io:format("Users clicked button~n",[]),
          +     {noreply, State};
             ...

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx.html 2025-05-10 20:19:28.817369131 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx.html 2025-05-10 20:19:28.825369203 +0000 @@ -1469,7 +1469,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAcceleratorEntry.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAcceleratorEntry.html 2025-05-10 20:19:28.849369421 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAcceleratorEntry.html 2025-05-10 20:19:28.853369457 +0000 @@ -560,7 +560,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAcceleratorTable.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAcceleratorTable.html 2025-05-10 20:19:28.873369639 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAcceleratorTable.html 2025-05-10 20:19:28.877369675 +0000 @@ -433,7 +433,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxActivateEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxActivateEvent.html 2025-05-10 20:19:28.901369892 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxActivateEvent.html 2025-05-10 20:19:28.905369929 +0000 @@ -354,7 +354,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxArtProvider.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxArtProvider.html 2025-05-10 20:19:28.929370146 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxArtProvider.html 2025-05-10 20:19:28.933370183 +0000 @@ -420,7 +420,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiDockArt.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiDockArt.html 2025-05-10 20:19:28.957370400 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiDockArt.html 2025-05-10 20:19:28.961370436 +0000 @@ -473,7 +473,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiManager.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiManager.html 2025-05-10 20:19:28.993370726 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiManager.html 2025-05-10 20:19:29.005370835 +0000 @@ -1473,7 +1473,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiManagerEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiManagerEvent.html 2025-05-10 20:19:29.033371088 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiManagerEvent.html 2025-05-10 20:19:29.037371126 +0000 @@ -820,7 +820,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiNotebook.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiNotebook.html 2025-05-10 20:19:29.069371416 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiNotebook.html 2025-05-10 20:19:29.081371524 +0000 @@ -1429,7 +1429,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiNotebookEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiNotebookEvent.html 2025-05-10 20:19:29.101371706 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiNotebookEvent.html 2025-05-10 20:19:29.105371742 +0000 @@ -559,7 +559,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiPaneInfo.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiPaneInfo.html 2025-05-10 20:19:29.157372213 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiPaneInfo.html 2025-05-10 20:19:29.181372431 +0000 @@ -4097,7 +4097,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiSimpleTabArt.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiSimpleTabArt.html 2025-05-10 20:19:29.205372648 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiSimpleTabArt.html 2025-05-10 20:19:29.205372648 +0000 @@ -316,7 +316,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiTabArt.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiTabArt.html 2025-05-10 20:19:29.229372866 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiTabArt.html 2025-05-10 20:19:29.233372902 +0000 @@ -469,7 +469,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBitmap.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBitmap.html 2025-05-10 20:19:29.261373156 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBitmap.html 2025-05-10 20:19:29.273373265 +0000 @@ -1379,7 +1379,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBitmapButton.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBitmapButton.html 2025-05-10 20:19:29.297373483 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBitmapButton.html 2025-05-10 20:19:29.301373519 +0000 @@ -551,7 +551,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBitmapDataObject.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBitmapDataObject.html 2025-05-10 20:19:29.325373737 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBitmapDataObject.html 2025-05-10 20:19:29.329373773 +0000 @@ -434,7 +434,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBookCtrlBase.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBookCtrlBase.html 2025-05-10 20:19:29.357374027 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBookCtrlBase.html 2025-05-10 20:19:29.361374063 +0000 @@ -958,7 +958,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBookCtrlEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBookCtrlEvent.html 2025-05-10 20:19:29.385374280 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBookCtrlEvent.html 2025-05-10 20:19:29.389374317 +0000 @@ -477,7 +477,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBoxSizer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBoxSizer.html 2025-05-10 20:19:29.409374498 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBoxSizer.html 2025-05-10 20:19:29.413374534 +0000 @@ -354,7 +354,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBrush.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBrush.html 2025-05-10 20:19:29.437374752 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBrush.html 2025-05-10 20:19:29.441374788 +0000 @@ -748,7 +748,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBufferedDC.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBufferedDC.html 2025-05-10 20:19:29.465375006 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBufferedDC.html 2025-05-10 20:19:29.469375042 +0000 @@ -571,7 +571,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBufferedPaintDC.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBufferedPaintDC.html 2025-05-10 20:19:29.489375223 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBufferedPaintDC.html 2025-05-10 20:19:29.493375260 +0000 @@ -408,7 +408,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxButton.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxButton.html 2025-05-10 20:19:29.521375514 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxButton.html 2025-05-10 20:19:29.529375586 +0000 @@ -929,7 +929,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCalendarCtrl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCalendarCtrl.html 2025-05-10 20:19:29.557375840 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCalendarCtrl.html 2025-05-10 20:19:29.569375948 +0000 @@ -1402,7 +1402,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCalendarDateAttr.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCalendarDateAttr.html 2025-05-10 20:19:29.593376166 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCalendarDateAttr.html 2025-05-10 20:19:29.601376238 +0000 @@ -1046,7 +1046,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCalendarEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCalendarEvent.html 2025-05-10 20:19:29.625376456 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCalendarEvent.html 2025-05-10 20:19:29.625376456 +0000 @@ -393,7 +393,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCaret.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCaret.html 2025-05-10 20:19:29.653376710 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCaret.html 2025-05-10 20:19:29.661376782 +0000 @@ -986,7 +986,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCheckBox.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCheckBox.html 2025-05-10 20:19:29.685377000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCheckBox.html 2025-05-10 20:19:29.693377073 +0000 @@ -777,7 +777,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCheckListBox.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCheckListBox.html 2025-05-10 20:19:29.717377290 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCheckListBox.html 2025-05-10 20:19:29.717377290 +0000 @@ -522,7 +522,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxChildFocusEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxChildFocusEvent.html 2025-05-10 20:19:29.741377508 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxChildFocusEvent.html 2025-05-10 20:19:29.741377508 +0000 @@ -359,7 +359,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxChoice.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxChoice.html 2025-05-10 20:19:29.765377725 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxChoice.html 2025-05-10 20:19:29.773377797 +0000 @@ -662,7 +662,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxChoicebook.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxChoicebook.html 2025-05-10 20:19:29.801378052 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxChoicebook.html 2025-05-10 20:19:29.813378161 +0000 @@ -1370,7 +1370,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxClientDC.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxClientDC.html 2025-05-10 20:19:29.833378341 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxClientDC.html 2025-05-10 20:19:29.837378378 +0000 @@ -323,7 +323,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxClipboard.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxClipboard.html 2025-05-10 20:19:29.861378595 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxClipboard.html 2025-05-10 20:19:29.865378632 +0000 @@ -801,7 +801,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxClipboardTextEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxClipboardTextEvent.html 2025-05-10 20:19:29.889378849 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxClipboardTextEvent.html 2025-05-10 20:19:29.889378849 +0000 @@ -306,7 +306,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCloseEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCloseEvent.html 2025-05-10 20:19:29.913379067 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCloseEvent.html 2025-05-10 20:19:29.917379103 +0000 @@ -562,7 +562,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourData.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourData.html 2025-05-10 20:19:29.937379285 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourData.html 2025-05-10 20:19:29.941379321 +0000 @@ -548,7 +548,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourDialog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourDialog.html 2025-05-10 20:19:29.965379539 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourDialog.html 2025-05-10 20:19:29.969379575 +0000 @@ -517,7 +517,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourPickerCtrl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourPickerCtrl.html 2025-05-10 20:19:29.993379792 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourPickerCtrl.html 2025-05-10 20:19:29.997379829 +0000 @@ -583,7 +583,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourPickerEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourPickerEvent.html 2025-05-10 20:19:30.017380010 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourPickerEvent.html 2025-05-10 20:19:30.021380046 +0000 @@ -356,7 +356,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxComboBox.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxComboBox.html 2025-05-10 20:19:30.053380336 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxComboBox.html 2025-05-10 20:19:30.061380408 +0000 @@ -1302,7 +1302,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCommandEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCommandEvent.html 2025-05-10 20:19:30.085380626 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCommandEvent.html 2025-05-10 20:19:30.089380662 +0000 @@ -692,7 +692,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxContextMenuEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxContextMenuEvent.html 2025-05-10 20:19:30.109380844 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxContextMenuEvent.html 2025-05-10 20:19:30.113380880 +0000 @@ -405,7 +405,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxControl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxControl.html 2025-05-10 20:19:30.133381062 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxControl.html 2025-05-10 20:19:30.137381098 +0000 @@ -328,7 +328,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxControlWithItems.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxControlWithItems.html 2025-05-10 20:19:30.165381352 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxControlWithItems.html 2025-05-10 20:19:30.173381424 +0000 @@ -1173,7 +1173,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCursor.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCursor.html 2025-05-10 20:19:30.193381606 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCursor.html 2025-05-10 20:19:30.197381642 +0000 @@ -481,7 +481,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDC.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDC.html 2025-05-10 20:19:30.249382113 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDC.html 2025-05-10 20:19:30.277382367 +0000 @@ -4056,7 +4056,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDCOverlay.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDCOverlay.html 2025-05-10 20:19:30.301382585 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDCOverlay.html 2025-05-10 20:19:30.305382621 +0000 @@ -399,7 +399,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDataObject.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDataObject.html 2025-05-10 20:19:30.325382803 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDataObject.html 2025-05-10 20:19:30.329382839 +0000 @@ -258,7 +258,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDateEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDateEvent.html 2025-05-10 20:19:30.349383020 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDateEvent.html 2025-05-10 20:19:30.353383056 +0000 @@ -348,7 +348,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDatePickerCtrl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDatePickerCtrl.html 2025-05-10 20:19:30.377383274 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDatePickerCtrl.html 2025-05-10 20:19:30.381383310 +0000 @@ -592,7 +592,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDialog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDialog.html 2025-05-10 20:19:30.409383564 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDialog.html 2025-05-10 20:19:30.417383637 +0000 @@ -961,7 +961,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDirDialog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDirDialog.html 2025-05-10 20:19:30.441383854 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDirDialog.html 2025-05-10 20:19:30.445383890 +0000 @@ -535,7 +535,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDirPickerCtrl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDirPickerCtrl.html 2025-05-10 20:19:30.469384108 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDirPickerCtrl.html 2025-05-10 20:19:30.473384144 +0000 @@ -591,7 +591,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDisplay.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDisplay.html 2025-05-10 20:19:30.497384362 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDisplay.html 2025-05-10 20:19:30.501384398 +0000 @@ -705,7 +705,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDisplayChangedEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDisplayChangedEvent.html 2025-05-10 20:19:30.521384580 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDisplayChangedEvent.html 2025-05-10 20:19:30.525384616 +0000 @@ -299,7 +299,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDropFilesEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDropFilesEvent.html 2025-05-10 20:19:30.545384796 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDropFilesEvent.html 2025-05-10 20:19:30.549384833 +0000 @@ -436,7 +436,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxEraseEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxEraseEvent.html 2025-05-10 20:19:30.569385014 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxEraseEvent.html 2025-05-10 20:19:30.569385014 +0000 @@ -358,7 +358,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxEvent.html 2025-05-10 20:19:30.593385232 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxEvent.html 2025-05-10 20:19:30.597385268 +0000 @@ -599,7 +599,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxEvtHandler.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxEvtHandler.html 2025-05-10 20:19:30.621385486 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxEvtHandler.html 2025-05-10 20:19:30.625385522 +0000 @@ -666,7 +666,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFileDataObject.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFileDataObject.html 2025-05-10 20:19:30.649385740 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFileDataObject.html 2025-05-10 20:19:30.649385740 +0000 @@ -393,7 +393,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFileDialog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFileDialog.html 2025-05-10 20:19:30.677385994 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFileDialog.html 2025-05-10 20:19:30.681386030 +0000 @@ -942,7 +942,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFileDirPickerEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFileDirPickerEvent.html 2025-05-10 20:19:30.701386211 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFileDirPickerEvent.html 2025-05-10 20:19:30.705386247 +0000 @@ -356,7 +356,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFilePickerCtrl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFilePickerCtrl.html 2025-05-10 20:19:30.729386465 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFilePickerCtrl.html 2025-05-10 20:19:30.733386501 +0000 @@ -594,7 +594,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFindReplaceData.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFindReplaceData.html 2025-05-10 20:19:30.757386719 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFindReplaceData.html 2025-05-10 20:19:30.761386755 +0000 @@ -584,7 +584,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFindReplaceDialog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFindReplaceDialog.html 2025-05-10 20:19:30.781386937 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFindReplaceDialog.html 2025-05-10 20:19:30.785386973 +0000 @@ -528,7 +528,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFlexGridSizer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFlexGridSizer.html 2025-05-10 20:19:30.813387227 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFlexGridSizer.html 2025-05-10 20:19:30.817387263 +0000 @@ -851,7 +851,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFocusEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFocusEvent.html 2025-05-10 20:19:30.841387481 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFocusEvent.html 2025-05-10 20:19:30.845387517 +0000 @@ -364,7 +364,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFont.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFont.html 2025-05-10 20:19:30.873387771 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFont.html 2025-05-10 20:19:30.881387843 +0000 @@ -1211,7 +1211,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontData.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontData.html 2025-05-10 20:19:30.905388061 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontData.html 2025-05-10 20:19:30.913388133 +0000 @@ -849,7 +849,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontDialog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontDialog.html 2025-05-10 20:19:30.933388315 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontDialog.html 2025-05-10 20:19:30.937388351 +0000 @@ -436,7 +436,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontPickerCtrl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontPickerCtrl.html 2025-05-10 20:19:30.961388568 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontPickerCtrl.html 2025-05-10 20:19:30.965388605 +0000 @@ -663,7 +663,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontPickerEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontPickerEvent.html 2025-05-10 20:19:30.985388786 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontPickerEvent.html 2025-05-10 20:19:30.989388822 +0000 @@ -355,7 +355,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFrame.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFrame.html 2025-05-10 20:19:31.017389076 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFrame.html 2025-05-10 20:19:31.029389184 +0000 @@ -1290,7 +1290,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGBSizerItem.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGBSizerItem.html 2025-05-10 20:19:31.049389366 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGBSizerItem.html 2025-05-10 20:19:31.049389366 +0000 @@ -224,7 +224,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGCDC.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGCDC.html 2025-05-10 20:19:31.069389548 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGCDC.html 2025-05-10 20:19:31.073389584 +0000 @@ -444,7 +444,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGLCanvas.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGLCanvas.html 2025-05-10 20:19:31.097389802 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGLCanvas.html 2025-05-10 20:19:31.101389838 +0000 @@ -544,7 +544,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGLContext.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGLContext.html 2025-05-10 20:19:31.121390019 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGLContext.html 2025-05-10 20:19:31.125390055 +0000 @@ -457,7 +457,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGauge.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGauge.html 2025-05-10 20:19:31.149390273 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGauge.html 2025-05-10 20:19:31.157390345 +0000 @@ -738,7 +738,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGenericDirCtrl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGenericDirCtrl.html 2025-05-10 20:19:31.181390563 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGenericDirCtrl.html 2025-05-10 20:19:31.189390635 +0000 @@ -1112,7 +1112,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsBrush.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsBrush.html 2025-05-10 20:19:31.209390817 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsBrush.html 2025-05-10 20:19:31.213390853 +0000 @@ -222,7 +222,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsContext.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsContext.html 2025-05-10 20:19:31.249391179 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsContext.html 2025-05-10 20:19:31.265391325 +0000 @@ -2219,7 +2219,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsFont.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsFont.html 2025-05-10 20:19:31.289391542 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsFont.html 2025-05-10 20:19:31.289391542 +0000 @@ -222,7 +222,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsGradientStops.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsGradientStops.html 2025-05-10 20:19:31.313391759 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsGradientStops.html 2025-05-10 20:19:31.317391796 +0000 @@ -624,7 +624,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsMatrix.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsMatrix.html 2025-05-10 20:19:31.341392013 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsMatrix.html 2025-05-10 20:19:31.345392049 +0000 @@ -716,7 +716,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsObject.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsObject.html 2025-05-10 20:19:31.365392231 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsObject.html 2025-05-10 20:19:31.369392267 +0000 @@ -354,7 +354,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsPath.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsPath.html 2025-05-10 20:19:31.397392521 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsPath.html 2025-05-10 20:19:31.405392594 +0000 @@ -1174,7 +1174,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsPen.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsPen.html 2025-05-10 20:19:31.425392775 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsPen.html 2025-05-10 20:19:31.425392775 +0000 @@ -222,7 +222,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsRenderer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsRenderer.html 2025-05-10 20:19:31.449392993 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsRenderer.html 2025-05-10 20:19:31.453393029 +0000 @@ -709,7 +709,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGrid.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGrid.html 2025-05-10 20:19:31.545393862 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGrid.html 2025-05-10 20:19:31.597394334 +0000 @@ -8449,7 +8449,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridBagSizer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridBagSizer.html 2025-05-10 20:19:31.633394661 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridBagSizer.html 2025-05-10 20:19:31.641394733 +0000 @@ -1164,7 +1164,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellAttr.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellAttr.html 2025-05-10 20:19:31.669394987 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellAttr.html 2025-05-10 20:19:31.677395060 +0000 @@ -1095,7 +1095,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellBoolEditor.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellBoolEditor.html 2025-05-10 20:19:31.701395277 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellBoolEditor.html 2025-05-10 20:19:31.701395277 +0000 @@ -436,7 +436,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellBoolRenderer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellBoolRenderer.html 2025-05-10 20:19:31.721395459 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellBoolRenderer.html 2025-05-10 20:19:31.725395495 +0000 @@ -314,7 +314,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellChoiceEditor.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellChoiceEditor.html 2025-05-10 20:19:31.745395676 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellChoiceEditor.html 2025-05-10 20:19:31.749395713 +0000 @@ -393,7 +393,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellEditor.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellEditor.html 2025-05-10 20:19:31.773395929 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellEditor.html 2025-05-10 20:19:31.777395967 +0000 @@ -603,7 +603,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellFloatEditor.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellFloatEditor.html 2025-05-10 20:19:31.797396147 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellFloatEditor.html 2025-05-10 20:19:31.801396183 +0000 @@ -394,7 +394,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellFloatRenderer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellFloatRenderer.html 2025-05-10 20:19:31.821396365 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellFloatRenderer.html 2025-05-10 20:19:31.825396401 +0000 @@ -546,7 +546,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellNumberEditor.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellNumberEditor.html 2025-05-10 20:19:31.845396583 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellNumberEditor.html 2025-05-10 20:19:31.849396619 +0000 @@ -430,7 +430,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellNumberRenderer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellNumberRenderer.html 2025-05-10 20:19:31.869396800 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellNumberRenderer.html 2025-05-10 20:19:31.873396837 +0000 @@ -314,7 +314,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellRenderer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellRenderer.html 2025-05-10 20:19:31.893397018 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellRenderer.html 2025-05-10 20:19:31.897397054 +0000 @@ -339,7 +339,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellStringRenderer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellStringRenderer.html 2025-05-10 20:19:31.917397236 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellStringRenderer.html 2025-05-10 20:19:31.917397236 +0000 @@ -315,7 +315,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellTextEditor.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellTextEditor.html 2025-05-10 20:19:31.941397453 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellTextEditor.html 2025-05-10 20:19:31.941397453 +0000 @@ -391,7 +391,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridEvent.html 2025-05-10 20:19:31.965397671 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridEvent.html 2025-05-10 20:19:31.969397706 +0000 @@ -643,7 +643,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridSizer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridSizer.html 2025-05-10 20:19:31.993397924 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridSizer.html 2025-05-10 20:19:31.997397961 +0000 @@ -743,7 +743,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHelpEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHelpEvent.html 2025-05-10 20:19:32.021398178 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHelpEvent.html 2025-05-10 20:19:32.025398214 +0000 @@ -477,7 +477,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHtmlEasyPrinting.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHtmlEasyPrinting.html 2025-05-10 20:19:32.053398468 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHtmlEasyPrinting.html 2025-05-10 20:19:32.057398504 +0000 @@ -960,7 +960,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHtmlLinkEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHtmlLinkEvent.html 2025-05-10 20:19:32.077398686 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHtmlLinkEvent.html 2025-05-10 20:19:32.081398722 +0000 @@ -357,7 +357,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHtmlWindow.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHtmlWindow.html 2025-05-10 20:19:32.109398976 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHtmlWindow.html 2025-05-10 20:19:32.121399085 +0000 @@ -1361,7 +1361,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIcon.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIcon.html 2025-05-10 20:19:32.141399266 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIcon.html 2025-05-10 20:19:32.145399303 +0000 @@ -446,7 +446,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIconBundle.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIconBundle.html 2025-05-10 20:19:32.165399484 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIconBundle.html 2025-05-10 20:19:32.173399557 +0000 @@ -600,7 +600,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIconizeEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIconizeEvent.html 2025-05-10 20:19:32.193399738 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIconizeEvent.html 2025-05-10 20:19:32.193399738 +0000 @@ -354,7 +354,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIdleEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIdleEvent.html 2025-05-10 20:19:32.213399919 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIdleEvent.html 2025-05-10 20:19:32.217399955 +0000 @@ -541,7 +541,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxImage.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxImage.html 2025-05-10 20:19:32.273400463 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxImage.html 2025-05-10 20:19:32.301400717 +0000 @@ -3859,7 +3859,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxImageList.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxImageList.html 2025-05-10 20:19:32.329400971 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxImageList.html 2025-05-10 20:19:32.337401043 +0000 @@ -973,7 +973,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxInitDialogEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxInitDialogEvent.html 2025-05-10 20:19:32.357401225 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxInitDialogEvent.html 2025-05-10 20:19:32.361401261 +0000 @@ -298,7 +298,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxJoystickEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxJoystickEvent.html 2025-05-10 20:19:32.385401478 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxJoystickEvent.html 2025-05-10 20:19:32.393401551 +0000 @@ -861,7 +861,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxKeyEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxKeyEvent.html 2025-05-10 20:19:32.421401805 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxKeyEvent.html 2025-05-10 20:19:32.425401841 +0000 @@ -935,7 +935,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxLayoutAlgorithm.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxLayoutAlgorithm.html 2025-05-10 20:19:32.453402095 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxLayoutAlgorithm.html 2025-05-10 20:19:32.457402131 +0000 @@ -599,7 +599,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListBox.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListBox.html 2025-05-10 20:19:32.481402349 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListBox.html 2025-05-10 20:19:32.489402422 +0000 @@ -827,7 +827,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListCtrl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListCtrl.html 2025-05-10 20:19:32.537402856 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListCtrl.html 2025-05-10 20:19:32.557403038 +0000 @@ -3262,7 +3262,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListEvent.html 2025-05-10 20:19:32.581403255 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListEvent.html 2025-05-10 20:19:32.585403292 +0000 @@ -837,7 +837,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListItem.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListItem.html 2025-05-10 20:19:32.613403546 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListItem.html 2025-05-10 20:19:32.621403618 +0000 @@ -1272,7 +1272,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListItemAttr.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListItemAttr.html 2025-05-10 20:19:32.645403836 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListItemAttr.html 2025-05-10 20:19:32.649403872 +0000 @@ -695,7 +695,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListView.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListView.html 2025-05-10 20:19:32.669404053 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListView.html 2025-05-10 20:19:32.673404089 +0000 @@ -589,7 +589,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListbook.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListbook.html 2025-05-10 20:19:32.705404379 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListbook.html 2025-05-10 20:19:32.713404451 +0000 @@ -1369,7 +1369,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxLocale.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxLocale.html 2025-05-10 20:19:32.741404705 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxLocale.html 2025-05-10 20:19:32.753404815 +0000 @@ -1371,7 +1371,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxLogNull.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxLogNull.html 2025-05-10 20:19:32.773404996 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxLogNull.html 2025-05-10 20:19:32.777405033 +0000 @@ -317,7 +317,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMDIChildFrame.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMDIChildFrame.html 2025-05-10 20:19:32.801405250 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMDIChildFrame.html 2025-05-10 20:19:32.805405286 +0000 @@ -660,7 +660,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMDIClientWindow.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMDIClientWindow.html 2025-05-10 20:19:32.829405504 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMDIClientWindow.html 2025-05-10 20:19:32.833405540 +0000 @@ -405,7 +405,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMDIParentFrame.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMDIParentFrame.html 2025-05-10 20:19:32.857405758 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMDIParentFrame.html 2025-05-10 20:19:32.861405794 +0000 @@ -828,7 +828,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMask.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMask.html 2025-05-10 20:19:32.881405975 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMask.html 2025-05-10 20:19:32.885406011 +0000 @@ -474,7 +474,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMaximizeEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMaximizeEvent.html 2025-05-10 20:19:32.905406193 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMaximizeEvent.html 2025-05-10 20:19:32.909406229 +0000 @@ -301,7 +301,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMemoryDC.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMemoryDC.html 2025-05-10 20:19:32.929406410 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMemoryDC.html 2025-05-10 20:19:32.933406447 +0000 @@ -447,7 +447,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenu.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenu.html 2025-05-10 20:19:32.973406810 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenu.html 2025-05-10 20:19:32.989406954 +0000 @@ -2244,7 +2244,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenuBar.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenuBar.html 2025-05-10 20:19:33.021407244 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenuBar.html 2025-05-10 20:19:33.029407317 +0000 @@ -1458,7 +1458,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenuEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenuEvent.html 2025-05-10 20:19:33.053407534 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenuEvent.html 2025-05-10 20:19:33.053407534 +0000 @@ -444,7 +444,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenuItem.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenuItem.html 2025-05-10 20:19:33.085407825 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenuItem.html 2025-05-10 20:19:33.093407897 +0000 @@ -1431,7 +1431,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMessageDialog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMessageDialog.html 2025-05-10 20:19:33.117408115 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMessageDialog.html 2025-05-10 20:19:33.121408151 +0000 @@ -397,7 +397,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMiniFrame.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMiniFrame.html 2025-05-10 20:19:33.145408369 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMiniFrame.html 2025-05-10 20:19:33.149408405 +0000 @@ -498,7 +498,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMirrorDC.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMirrorDC.html 2025-05-10 20:19:33.169408586 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMirrorDC.html 2025-05-10 20:19:33.173408623 +0000 @@ -317,7 +317,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMouseCaptureChangedEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMouseCaptureChangedEvent.html 2025-05-10 20:19:33.193408804 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMouseCaptureChangedEvent.html 2025-05-10 20:19:33.197408839 +0000 @@ -357,7 +357,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMouseCaptureLostEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMouseCaptureLostEvent.html 2025-05-10 20:19:33.217409021 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMouseCaptureLostEvent.html 2025-05-10 20:19:33.221409058 +0000 @@ -303,7 +303,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMouseEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMouseEvent.html 2025-05-10 20:19:33.257409384 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMouseEvent.html 2025-05-10 20:19:33.269409493 +0000 @@ -2082,7 +2082,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMoveEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMoveEvent.html 2025-05-10 20:19:33.289409674 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMoveEvent.html 2025-05-10 20:19:33.293409711 +0000 @@ -397,7 +397,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMultiChoiceDialog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMultiChoiceDialog.html 2025-05-10 20:19:33.313409892 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMultiChoiceDialog.html 2025-05-10 20:19:33.317409928 +0000 @@ -447,7 +447,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNavigationKeyEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNavigationKeyEvent.html 2025-05-10 20:19:33.341410145 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNavigationKeyEvent.html 2025-05-10 20:19:33.345410182 +0000 @@ -630,7 +630,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNotebook.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNotebook.html 2025-05-10 20:19:33.369410399 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNotebook.html 2025-05-10 20:19:33.377410472 +0000 @@ -855,7 +855,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNotificationMessage.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNotificationMessage.html 2025-05-10 20:19:33.401410690 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNotificationMessage.html 2025-05-10 20:19:33.409410762 +0000 @@ -937,7 +937,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNotifyEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNotifyEvent.html 2025-05-10 20:19:33.429410944 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNotifyEvent.html 2025-05-10 20:19:33.433410980 +0000 @@ -360,7 +360,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxOverlay.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxOverlay.html 2025-05-10 20:19:33.453411160 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxOverlay.html 2025-05-10 20:19:33.457411198 +0000 @@ -354,7 +354,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPageSetupDialog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPageSetupDialog.html 2025-05-10 20:19:33.477411378 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPageSetupDialog.html 2025-05-10 20:19:33.481411414 +0000 @@ -439,7 +439,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPageSetupDialogData.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPageSetupDialogData.html 2025-05-10 20:19:33.509411668 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPageSetupDialogData.html 2025-05-10 20:19:33.521411778 +0000 @@ -1479,7 +1479,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPaintDC.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPaintDC.html 2025-05-10 20:19:33.541411959 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPaintDC.html 2025-05-10 20:19:33.545411995 +0000 @@ -320,7 +320,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPaintEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPaintEvent.html 2025-05-10 20:19:33.565412176 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPaintEvent.html 2025-05-10 20:19:33.569412212 +0000 @@ -307,7 +307,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPalette.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPalette.html 2025-05-10 20:19:33.593412430 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPalette.html 2025-05-10 20:19:33.597412466 +0000 @@ -631,7 +631,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPaletteChangedEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPaletteChangedEvent.html 2025-05-10 20:19:33.617412648 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPaletteChangedEvent.html 2025-05-10 20:19:33.621412684 +0000 @@ -386,7 +386,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPanel.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPanel.html 2025-05-10 20:19:33.645412902 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPanel.html 2025-05-10 20:19:33.649412938 +0000 @@ -487,7 +487,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPasswordEntryDialog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPasswordEntryDialog.html 2025-05-10 20:19:33.669413119 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPasswordEntryDialog.html 2025-05-10 20:19:33.673413155 +0000 @@ -361,7 +361,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPen.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPen.html 2025-05-10 20:19:33.697413373 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPen.html 2025-05-10 20:19:33.701413409 +0000 @@ -862,7 +862,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPickerBase.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPickerBase.html 2025-05-10 20:19:33.725413627 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPickerBase.html 2025-05-10 20:19:33.733413699 +0000 @@ -788,7 +788,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPopupTransientWindow.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPopupTransientWindow.html 2025-05-10 20:19:33.753413881 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPopupTransientWindow.html 2025-05-10 20:19:33.757413917 +0000 @@ -509,7 +509,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPopupWindow.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPopupWindow.html 2025-05-10 20:19:33.777414099 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPopupWindow.html 2025-05-10 20:19:33.781414135 +0000 @@ -524,7 +524,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPostScriptDC.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPostScriptDC.html 2025-05-10 20:19:33.801414316 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPostScriptDC.html 2025-05-10 20:19:33.805414352 +0000 @@ -354,7 +354,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPreviewCanvas.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPreviewCanvas.html 2025-05-10 20:19:33.825414533 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPreviewCanvas.html 2025-05-10 20:19:33.825414533 +0000 @@ -221,7 +221,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPreviewControlBar.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPreviewControlBar.html 2025-05-10 20:19:33.849414751 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPreviewControlBar.html 2025-05-10 20:19:33.853414787 +0000 @@ -519,7 +519,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPreviewFrame.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPreviewFrame.html 2025-05-10 20:19:33.873414969 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPreviewFrame.html 2025-05-10 20:19:33.877415005 +0000 @@ -520,7 +520,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintData.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintData.html 2025-05-10 20:19:33.905415259 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintData.html 2025-05-10 20:19:33.909415295 +0000 @@ -1085,7 +1085,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintDialog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintDialog.html 2025-05-10 20:19:33.933415513 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintDialog.html 2025-05-10 20:19:33.933415513 +0000 @@ -433,7 +433,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintDialogData.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintDialogData.html 2025-05-10 20:19:33.961415766 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintDialogData.html 2025-05-10 20:19:33.969415839 +0000 @@ -1270,7 +1270,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintPreview.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintPreview.html 2025-05-10 20:19:33.997416092 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintPreview.html 2025-05-10 20:19:34.005416166 +0000 @@ -1033,7 +1033,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrinter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrinter.html 2025-05-10 20:19:34.029416383 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrinter.html 2025-05-10 20:19:34.033416419 +0000 @@ -720,7 +720,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintout.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintout.html 2025-05-10 20:19:34.065416709 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintout.html 2025-05-10 20:19:34.077416818 +0000 @@ -1233,7 +1233,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxProgressDialog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxProgressDialog.html 2025-05-10 20:19:34.101417036 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxProgressDialog.html 2025-05-10 20:19:34.105417072 +0000 @@ -493,7 +493,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxQueryNewPaletteEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxQueryNewPaletteEvent.html 2025-05-10 20:19:34.125417253 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxQueryNewPaletteEvent.html 2025-05-10 20:19:34.129417290 +0000 @@ -388,7 +388,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxRadioBox.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxRadioBox.html 2025-05-10 20:19:34.157417543 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxRadioBox.html 2025-05-10 20:19:34.165417615 +0000 @@ -1133,7 +1133,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxRadioButton.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxRadioButton.html 2025-05-10 20:19:34.189417833 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxRadioButton.html 2025-05-10 20:19:34.197417906 +0000 @@ -590,7 +590,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxRegion.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxRegion.html 2025-05-10 20:19:34.225418159 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxRegion.html 2025-05-10 20:19:34.233418233 +0000 @@ -1205,7 +1205,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSashEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSashEvent.html 2025-05-10 20:19:34.257418450 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSashEvent.html 2025-05-10 20:19:34.261418487 +0000 @@ -447,7 +447,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSashLayoutWindow.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSashLayoutWindow.html 2025-05-10 20:19:34.285418704 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSashLayoutWindow.html 2025-05-10 20:19:34.289418740 +0000 @@ -688,7 +688,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSashWindow.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSashWindow.html 2025-05-10 20:19:34.313418958 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSashWindow.html 2025-05-10 20:19:34.317418994 +0000 @@ -793,7 +793,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScreenDC.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScreenDC.html 2025-05-10 20:19:34.341419212 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScreenDC.html 2025-05-10 20:19:34.341419212 +0000 @@ -317,7 +317,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrollBar.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrollBar.html 2025-05-10 20:19:34.369419466 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrollBar.html 2025-05-10 20:19:34.373419502 +0000 @@ -805,7 +805,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrollEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrollEvent.html 2025-05-10 20:19:34.397419720 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrollEvent.html 2025-05-10 20:19:34.401419756 +0000 @@ -408,7 +408,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrollWinEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrollWinEvent.html 2025-05-10 20:19:34.425419973 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrollWinEvent.html 2025-05-10 20:19:34.429420010 +0000 @@ -399,7 +399,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrolledWindow.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrolledWindow.html 2025-05-10 20:19:34.457420264 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrolledWindow.html 2025-05-10 20:19:34.465420336 +0000 @@ -1079,7 +1079,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSetCursorEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSetCursorEvent.html 2025-05-10 20:19:34.489420554 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSetCursorEvent.html 2025-05-10 20:19:34.493420590 +0000 @@ -514,7 +514,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxShowEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxShowEvent.html 2025-05-10 20:19:34.517420807 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxShowEvent.html 2025-05-10 20:19:34.521420844 +0000 @@ -395,7 +395,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSingleChoiceDialog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSingleChoiceDialog.html 2025-05-10 20:19:34.541421025 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSingleChoiceDialog.html 2025-05-10 20:19:34.545421061 +0000 @@ -486,7 +486,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizeEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizeEvent.html 2025-05-10 20:19:34.565421242 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizeEvent.html 2025-05-10 20:19:34.569421279 +0000 @@ -404,7 +404,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizer.html 2025-05-10 20:19:34.609421641 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizer.html 2025-05-10 20:19:34.625421787 +0000 @@ -2346,7 +2346,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizerFlags.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizerFlags.html 2025-05-10 20:19:34.649422003 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizerFlags.html 2025-05-10 20:19:34.657422077 +0000 @@ -745,7 +745,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizerItem.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizerItem.html 2025-05-10 20:19:34.689422367 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizerItem.html 2025-05-10 20:19:34.697422439 +0000 @@ -1691,7 +1691,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSlider.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSlider.html 2025-05-10 20:19:34.725422693 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSlider.html 2025-05-10 20:19:34.733422765 +0000 @@ -950,7 +950,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSpinButton.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSpinButton.html 2025-05-10 20:19:34.757422983 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSpinButton.html 2025-05-10 20:19:34.761423019 +0000 @@ -693,7 +693,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSpinCtrl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSpinCtrl.html 2025-05-10 20:19:34.785423237 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSpinCtrl.html 2025-05-10 20:19:34.793423309 +0000 @@ -745,7 +745,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSpinEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSpinEvent.html 2025-05-10 20:19:34.813423491 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSpinEvent.html 2025-05-10 20:19:34.817423527 +0000 @@ -392,7 +392,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSplashScreen.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSplashScreen.html 2025-05-10 20:19:34.841423745 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSplashScreen.html 2025-05-10 20:19:34.845423781 +0000 @@ -447,7 +447,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSplitterEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSplitterEvent.html 2025-05-10 20:19:34.865423962 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSplitterEvent.html 2025-05-10 20:19:34.869423998 +0000 @@ -516,7 +516,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSplitterWindow.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSplitterWindow.html 2025-05-10 20:19:34.897424252 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSplitterWindow.html 2025-05-10 20:19:34.909424361 +0000 @@ -1355,7 +1355,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticBitmap.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticBitmap.html 2025-05-10 20:19:34.929424542 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticBitmap.html 2025-05-10 20:19:34.933424579 +0000 @@ -572,7 +572,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticBox.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticBox.html 2025-05-10 20:19:34.957424796 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticBox.html 2025-05-10 20:19:34.961424832 +0000 @@ -495,7 +495,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticBoxSizer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticBoxSizer.html 2025-05-10 20:19:34.981425014 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticBoxSizer.html 2025-05-10 20:19:34.985425050 +0000 @@ -400,7 +400,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticLine.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticLine.html 2025-05-10 20:19:35.005425232 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticLine.html 2025-05-10 20:19:35.009425268 +0000 @@ -568,7 +568,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticText.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticText.html 2025-05-10 20:19:35.033425485 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticText.html 2025-05-10 20:19:35.037425522 +0000 @@ -631,7 +631,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStatusBar.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStatusBar.html 2025-05-10 20:19:35.065425776 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStatusBar.html 2025-05-10 20:19:35.073425848 +0000 @@ -1097,7 +1097,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStdDialogButtonSizer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStdDialogButtonSizer.html 2025-05-10 20:19:35.093426029 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStdDialogButtonSizer.html 2025-05-10 20:19:35.097426066 +0000 @@ -517,7 +517,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStyledTextCtrl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStyledTextCtrl.html 2025-05-10 20:19:35.253427480 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStyledTextCtrl.html 2025-05-10 20:19:35.321428096 +0000 @@ -17656,7 +17656,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStyledTextEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStyledTextEvent.html 2025-05-10 20:19:35.357428423 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStyledTextEvent.html 2025-05-10 20:19:35.365428495 +0000 @@ -1228,7 +1228,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSysColourChangedEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSysColourChangedEvent.html 2025-05-10 20:19:35.385428677 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSysColourChangedEvent.html 2025-05-10 20:19:35.389428713 +0000 @@ -303,7 +303,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSystemOptions.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSystemOptions.html 2025-05-10 20:19:35.413428930 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSystemOptions.html 2025-05-10 20:19:35.417428967 +0000 @@ -479,7 +479,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSystemSettings.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSystemSettings.html 2025-05-10 20:19:35.437429148 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSystemSettings.html 2025-05-10 20:19:35.441429184 +0000 @@ -438,7 +438,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTaskBarIcon.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTaskBarIcon.html 2025-05-10 20:19:35.461429366 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTaskBarIcon.html 2025-05-10 20:19:35.465429402 +0000 @@ -521,7 +521,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTaskBarIconEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTaskBarIconEvent.html 2025-05-10 20:19:35.489429620 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTaskBarIconEvent.html 2025-05-10 20:19:35.489429620 +0000 @@ -295,7 +295,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextAttr.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextAttr.html 2025-05-10 20:19:35.525429946 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextAttr.html 2025-05-10 20:19:35.533430018 +0000 @@ -1852,7 +1852,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextCtrl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextCtrl.html 2025-05-10 20:19:35.573430381 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextCtrl.html 2025-05-10 20:19:35.589430526 +0000 @@ -2526,7 +2526,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextDataObject.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextDataObject.html 2025-05-10 20:19:35.613430744 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextDataObject.html 2025-05-10 20:19:35.617430780 +0000 @@ -481,7 +481,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextEntryDialog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextEntryDialog.html 2025-05-10 20:19:35.637430961 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextEntryDialog.html 2025-05-10 20:19:35.641430997 +0000 @@ -477,7 +477,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToggleButton.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToggleButton.html 2025-05-10 20:19:35.665431215 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToggleButton.html 2025-05-10 20:19:35.669431251 +0000 @@ -573,7 +573,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToolBar.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToolBar.html 2025-05-10 20:19:35.705431577 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToolBar.html 2025-05-10 20:19:35.721431723 +0000 @@ -2074,7 +2074,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToolTip.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToolTip.html 2025-05-10 20:19:35.741431904 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToolTip.html 2025-05-10 20:19:35.745431941 +0000 @@ -505,7 +505,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToolbook.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToolbook.html 2025-05-10 20:19:35.773432194 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToolbook.html 2025-05-10 20:19:35.785432303 +0000 @@ -1371,7 +1371,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTopLevelWindow.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTopLevelWindow.html 2025-05-10 20:19:35.813432557 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTopLevelWindow.html 2025-05-10 20:19:35.821432629 +0000 @@ -1147,7 +1147,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTreeCtrl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTreeCtrl.html 2025-05-10 20:19:35.873433101 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTreeCtrl.html 2025-05-10 20:19:35.897433318 +0000 @@ -3667,7 +3667,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTreeEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTreeEvent.html 2025-05-10 20:19:35.921433536 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTreeEvent.html 2025-05-10 20:19:35.925433572 +0000 @@ -636,7 +636,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTreebook.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTreebook.html 2025-05-10 20:19:35.961433898 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTreebook.html 2025-05-10 20:19:35.969433971 +0000 @@ -1563,7 +1563,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxUpdateUIEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxUpdateUIEvent.html 2025-05-10 20:19:35.993434189 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxUpdateUIEvent.html 2025-05-10 20:19:36.001434261 +0000 @@ -1032,7 +1032,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWebView.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWebView.html 2025-05-10 20:19:36.041434624 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWebView.html 2025-05-10 20:19:36.057434769 +0000 @@ -2341,7 +2341,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWebViewEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWebViewEvent.html 2025-05-10 20:19:36.077434950 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWebViewEvent.html 2025-05-10 20:19:36.081434987 +0000 @@ -484,7 +484,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindow.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindow.html 2025-05-10 20:19:36.173435821 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindow.html 2025-05-10 20:19:36.217436219 +0000 @@ -8231,7 +8231,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindowCreateEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindowCreateEvent.html 2025-05-10 20:19:36.249436510 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindowCreateEvent.html 2025-05-10 20:19:36.249436510 +0000 @@ -299,7 +299,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindowDC.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindowDC.html 2025-05-10 20:19:36.273436727 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindowDC.html 2025-05-10 20:19:36.273436727 +0000 @@ -318,7 +318,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindowDestroyEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindowDestroyEvent.html 2025-05-10 20:19:36.297436945 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindowDestroyEvent.html 2025-05-10 20:19:36.297436945 +0000 @@ -300,7 +300,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxXmlResource.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxXmlResource.html 2025-05-10 20:19:36.329437235 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxXmlResource.html 2025-05-10 20:19:36.337437308 +0000 @@ -1485,7 +1485,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx_misc.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx_misc.html 2025-05-10 20:19:36.369437598 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx_misc.html 2025-05-10 20:19:36.377437670 +0000 @@ -1366,7 +1366,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx_object.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx_object.html 2025-05-10 20:19:36.409437960 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx_object.html 2025-05-10 20:19:36.421438069 +0000 @@ -136,36 +136,36 @@ shutdown | Term, terminate(State) is called. It lets the user module clean up, it is always called when server terminates or when wx_object() in the driver is deleted. If the Parent process terminates the Module:terminate/2 function is -called.
          terminate(Reason, State)

          Example:

            -module(myDialog).
          -  -export([new/2, show/1, destroy/1]).  %% API
          -  -export([init/1, handle_call/3, handle_event/2,
          -           handle_info/2, code_change/3, terminate/2]).
          +called.
          terminate(Reason, State)

          Example:

            -module(myDialog).
          +  -export([new/2, show/1, destroy/1]).  %% API
          +  -export([init/1, handle_call/3, handle_event/2,
          +           handle_info/2, code_change/3, terminate/2]).
                      new/2, showModal/1, destroy/1]).  %% Callbacks
           
             %% Client API
          -  new(Parent, Msg) ->
          -     wx_object:start(?MODULE, [Parent,Id], []).
          +  new(Parent, Msg) ->
          +     wx_object:start(?MODULE, [Parent,Id], []).
           
          -  show(Dialog) ->
          -     wx_object:call(Dialog, show_modal).
          +  show(Dialog) ->
          +     wx_object:call(Dialog, show_modal).
           
          -  destroy(Dialog) ->
          -     wx_object:call(Dialog, destroy).
          +  destroy(Dialog) ->
          +     wx_object:call(Dialog, destroy).
           
             %% Server Implementation ala gen_server
          -  init([Parent, Str]) ->
          -     Dialog = wxDialog:new(Parent, 42, "Testing", []),
          +  init([Parent, Str]) ->
          +     Dialog = wxDialog:new(Parent, 42, "Testing", []),
                ...
          -     wxDialog:connect(Dialog, command_button_clicked),
          -     {Dialog, MyState}.
          +     wxDialog:connect(Dialog, command_button_clicked),
          +     {Dialog, MyState}.
           
          -  handle_call(show, _From, State) ->
          -     wxDialog:show(State#state.win),
          -     {reply, ok, State};
          +  handle_call(show, _From, State) ->
          +     wxDialog:show(State#state.win),
          +     {reply, ok, State};
             ...
          -  handle_event(#wx{}, State) ->
          -     io:format("Users clicked button~n",[]),
          -     {noreply, State};
          +  handle_event(#wx{}, State) ->
          +     io:format("Users clicked button~n",[]),
          +     {noreply, State};
             ...

          @@ -1375,7 +1375,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/404.html 2025-05-10 20:19:36.441438250 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/404.html 2025-05-10 20:19:36.441438250 +0000 @@ -143,7 +143,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/api-reference.html 2025-05-10 20:19:36.461438432 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/api-reference.html 2025-05-10 20:19:36.465438468 +0000 @@ -235,7 +235,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/notes.html 2025-05-10 20:19:36.497438758 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/notes.html 2025-05-10 20:19:36.505438830 +0000 @@ -1375,7 +1375,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/search.html 2025-05-10 20:19:36.525439012 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/search.html 2025-05-10 20:19:36.525439012 +0000 @@ -141,7 +141,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl.html 2025-05-10 20:19:36.553439266 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl.html 2025-05-10 20:19:36.561439338 +0000 @@ -1137,7 +1137,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_eventp.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_eventp.html 2025-05-10 20:19:36.589439592 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_eventp.html 2025-05-10 20:19:36.593439629 +0000 @@ -554,7 +554,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_examples.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_examples.html 2025-05-10 20:19:36.621439883 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_examples.html 2025-05-10 20:19:36.625439919 +0000 @@ -146,92 +146,92 @@ user state, use their own state variable instead. Another option (used in e.g. xmerl_eventp.erl) is for customization functions to share one of the local states (in xmerl_eventp.erl, the continuation function and the fetch function -both access the cont_state.)

          Functions to access user state:

          • xmerl_scan:user_state(GlobalState)
          • xmerl_scan:user_state(UserState, GlobalState)

          1.2 Event Function

          {event_fun, fun()} | {event_fun, fun(), EventState}

          The event function is called at the beginning and at the end of a parsed entity. -It has the following format and semantics:

          fun(Event, GlobalState) ->
          -   EventState = xmerl_scan:event_state(GlobalState),
          -   EventState2 = foo(Event, EventState),
          -   GlobalState2 = xmerl_scan:event_state(EventState2, GlobalState)
          -end.

          1.3 Hook Function

          {hook_fun, fun()} | {hook_fun, fun(), HookState}

          The hook function is called when the processor has parsed a complete entity. -Format and semantics:

          fun(Entity, GlobalState) ->
          -   HookState = xmerl_scan:hook_state(GlobalState),
          -   {TransformedEntity, HookState2} = foo(Entity, HookState),
          -   GlobalState2 = xmerl_scan:hook_state(HookState2, GlobalState),
          -   {TransformedEntity, GlobalState2}
          +both access the cont_state.)

          Functions to access user state:

          • xmerl_scan:user_state(GlobalState)
          • xmerl_scan:user_state(UserState, GlobalState)

          1.2 Event Function

          {event_fun, fun()} | {event_fun, fun(), EventState}

          The event function is called at the beginning and at the end of a parsed entity. +It has the following format and semantics:

          fun(Event, GlobalState) ->
          +   EventState = xmerl_scan:event_state(GlobalState),
          +   EventState2 = foo(Event, EventState),
          +   GlobalState2 = xmerl_scan:event_state(EventState2, GlobalState)
          +end.

          1.3 Hook Function

          {hook_fun, fun()} | {hook_fun, fun(), HookState}

          The hook function is called when the processor has parsed a complete entity. +Format and semantics:

          fun(Entity, GlobalState) ->
          +   HookState = xmerl_scan:hook_state(GlobalState),
          +   {TransformedEntity, HookState2} = foo(Entity, HookState),
          +   GlobalState2 = xmerl_scan:hook_state(HookState2, GlobalState),
          +   {TransformedEntity, GlobalState2}
           end.

          The relationship between the event function, the hook function and the accumulator function is as follows:

          1. The event function is first called with an 'ended' event for the parsed entity.
          2. The hook function is called, possibly re-formatting the entity.
          3. The acc function is called in order to (optionally) add the re-formatted -entity to the contents of its parent element.

          1.4 Fetch Function

          {fetch_fun, fun()} | {fetch_fun, fun(), FetchState}

          The fetch function is called in order to fetch an external resource (e.g. a +entity to the contents of its parent element.

        • 1.4 Fetch Function

          {fetch_fun, fun()} | {fetch_fun, fun(), FetchState}

          The fetch function is called in order to fetch an external resource (e.g. a DTD).

          The fetch function can respond with three different return values:

          Result ::=
          -   {ok, {file, Filename}, NewGlobalState} |
          -   {ok, {string, String}, NewGlobalState} |
          -   {ok, not_fetched, NewGlobalState}

          Format and semantics:

          fun(URI, GlobalState) ->
          -   FetchState = xmerl_scan:fetch_state(GlobalState),
          -   Result = foo(URI, FetchState).  % Result being one of the above
          -end.

          1.5 Continuation Function

          {continuation_fun, fun()} | {continuation_fun, fun(), ContinuationState}

          The continuation function is called when the parser encounters the end of the -byte stream. Format and semantics:

          fun(Continue, Exception, GlobalState) ->
          -   ContState = xmerl_scan:cont_state(GlobalState),
          -   {Result, ContState2} = get_more_bytes(ContState),
          +   {ok, {file, Filename}, NewGlobalState} |
          +   {ok, {string, String}, NewGlobalState} |
          +   {ok, not_fetched, NewGlobalState}

          Format and semantics:

          fun(URI, GlobalState) ->
          +   FetchState = xmerl_scan:fetch_state(GlobalState),
          +   Result = foo(URI, FetchState).  % Result being one of the above
          +end.

          1.5 Continuation Function

          {continuation_fun, fun()} | {continuation_fun, fun(), ContinuationState}

          The continuation function is called when the parser encounters the end of the +byte stream. Format and semantics:

          fun(Continue, Exception, GlobalState) ->
          +   ContState = xmerl_scan:cont_state(GlobalState),
          +   {Result, ContState2} = get_more_bytes(ContState),
              case Result of
          -      [] ->
          -         GlobalState2 = xmerl_scan:cont_state(ContState2, GlobalState),
          -         Exception(GlobalState2);
          +      [] ->
          +         GlobalState2 = xmerl_scan:cont_state(ContState2, GlobalState),
          +         Exception(GlobalState2);
                 MoreBytes ->
          -         {MoreBytes2, Rest} = end_on_whitespace_char(MoreBytes),
          -         ContState3 = update_cont_state(Rest, ContState2),
          -         GlobalState3 = xmerl_scan:cont_state(ContState3, GlobalState),
          -         Continue(MoreBytes2, GlobalState3)
          +         {MoreBytes2, Rest} = end_on_whitespace_char(MoreBytes),
          +         ContState3 = update_cont_state(Rest, ContState2),
          +         GlobalState3 = xmerl_scan:cont_state(ContState3, GlobalState),
          +         Continue(MoreBytes2, GlobalState3)
              end
          -end.

          1.6 Rules Functions

          {rules, ReadFun : fun(), WriteFun : fun(), RulesState} |
          -{rules, Table : ets()}

          The rules functions take care of storing scanner information in a rules +end.

    1.6 Rules Functions

    {rules, ReadFun : fun(), WriteFun : fun(), RulesState} |
    +{rules, Table : ets()}

    The rules functions take care of storing scanner information in a rules database. User-provided rules functions may opt to store the information in mnesia, or perhaps in the user_state(RulesState).

    The following modes exist:

    • If the user doesn't specify an option, the scanner creates an ets table, and uses built-in functions to read and write data to it. When the scanner is done, the ets table is deleted.
    • If the user specifies an ets table via the {rules, Table} option, the scanner uses this table. When the scanner is done, it does not delete the table.
    • If the user specifies read and write functions, the scanner will use them -instead.

    The format for the read and write functions are as follows:

     WriteFun(Context, Name, Definition, ScannerState) -> NewScannerState.
    - ReadFun(Context, Name, ScannerState) -> Definition | undefined.

    Here is a summary of the data objects currently being written by the scanner:

    ContextKey ValueDefinition
    notationNotationName{system, SL} | {public, PIDL, SL}
    elem_defElementName#xmlElement{content = ContentSpec}
    parameter_entityPENamePEDef
    entityEntityNameEntityDef

    Table 1: Scanner data objects

    where

    ContentSpec ::= empty | any | ElemContent
    -ElemContent ::= {Mode, Elems}
    +instead.

    The format for the read and write functions are as follows:

     WriteFun(Context, Name, Definition, ScannerState) -> NewScannerState.
    + ReadFun(Context, Name, ScannerState) -> Definition | undefined.

    Here is a summary of the data objects currently being written by the scanner:

    ContextKey ValueDefinition
    notationNotationName{system, SL} | {public, PIDL, SL}
    elem_defElementName#xmlElement{content = ContentSpec}
    parameter_entityPENamePEDef
    entityEntityNameEntityDef

    Table 1: Scanner data objects

    where

    ContentSpec ::= empty | any | ElemContent
    +ElemContent ::= {Mode, Elems}
     Mode        ::= seq | choice
    -Elems       ::= [Elem]
    -Elem        ::= '#PCDATA' | Name | ElemContent | {Occurrence, Elems}
    +Elems       ::= [Elem]
    +Elem        ::= '#PCDATA' | Name | ElemContent | {Occurrence, Elems}
     Occurrence  ::= '*' | '?' | '+'

    NOTE: When <Elem> is not wrapped with <Occurrence>, (Occurrence = once) is -implied.

    1.7 Accumulator Function

    {acc_fun, fun()}

    The accumulator function is called to accumulate the contents of an entity.When +implied.

    1.7 Accumulator Function

    {acc_fun, fun()}

    The accumulator function is called to accumulate the contents of an entity.When parsing very large files, it may not be desirable to do so.In this case, an acc function can be provided that simply doesn't accumulate.

    Note that it is possible to even modify the parsed entity before accumulating it, but this must be done with care. xmerl_scan performs post-processing of the element for namespace management. Thus, the element must keep its original structure for this to work.

    The acc function has the following format and semantics:

    %% default accumulating acc fun
    -fun(ParsedEntity, Acc, GlobalState) ->
    -   {[ParsedEntity|Acc], GlobalState}.
    +fun(ParsedEntity, Acc, GlobalState) ->
    +   {[ParsedEntity|Acc], GlobalState}.
     
     %% non-accumulating acc fun
    -fun(ParsedEntity, Acc, GlobalState) ->
    -   {Acc, GlobalState}.

    1.8 Close Function

    The close function is called when a document (either the main document or an +fun(ParsedEntity, Acc, GlobalState) -> + {Acc, GlobalState}.

    1.8 Close Function

    The close function is called when a document (either the main document or an external DTD) has been completely parsed. When xmerl_scan was started using xmerl_scan:file/[1,2], the file will be read in full, and closed immediately, before the parsing starts, so when the close function is called, it will not need to actually close the file. In this case, the close function will be a good -place to modify the state variables.

    Format and semantics:

    fun(GlobalState) ->
    +place to modify the state variables.

    Format and semantics:

    fun(GlobalState) ->
        GlobalState1 = ....  % state variables may be altered

    2 Examples

    -

    See xmerl_test.erl for more examples.

    2.1 Handling spaces

    The following sample program illustrates three ways of scanning a document:

    1. the default scan, which leaves whitespace untouched
    2. normalizing spaces
    3. normalizing spaces, then removing text elements that only contain one space.
    -module(tmp).
    +

    See xmerl_test.erl for more examples.

    2.1 Handling spaces

    The following sample program illustrates three ways of scanning a document:

    1. the default scan, which leaves whitespace untouched
    2. normalizing spaces
    3. normalizing spaces, then removing text elements that only contain one space.
    -module(tmp).
     
    --include("xmerl.hrl").
    +-include("xmerl.hrl").
     
    --export([file1/1, file2/1, file3/1]).
    +-export([file1/1, file2/1, file3/1]).
     
    -file1(F) -> xmerl_scan:file(F).
    +file1(F) -> xmerl_scan:file(F).
     
    -file2(F) -> xmerl_scan:file(F, [{space,normalize}]).
    +file2(F) -> xmerl_scan:file(F, [{space,normalize}]).
     
    -file3(F) -> Acc = fun(#xmlText{value = " ", pos = P}, Acc, S) -> {Acc, P,
    -S}; % new return format (X, Acc, S) -> {[X|Acc], S} end, xmerl_scan:file(F,
    -[{space,normalize}, {acc_fun, Acc}]).
    +
    file3(F) -> Acc = fun(#xmlText{value = " ", pos = P}, Acc, S) -> {Acc, P, +S}; % new return format (X, Acc, S) -> {[X|Acc], S} end, xmerl_scan:file(F, +[{space,normalize}, {acc_fun, Acc}]).
    @@ -278,7 +278,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_sax_parser.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_sax_parser.html 2025-05-10 20:19:36.653440173 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_sax_parser.html 2025-05-10 20:19:36.661440245 +0000 @@ -799,7 +799,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_scan.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_scan.html 2025-05-10 20:19:36.689440499 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_scan.html 2025-05-10 20:19:36.697440571 +0000 @@ -1147,7 +1147,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_ug.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_ug.html 2025-05-10 20:19:36.729440861 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_ug.html 2025-05-10 20:19:36.741440970 +0000 @@ -193,16 +193,16 @@ structure and data of the document. If it is a simple document like:

    <?xml version="1.0"?>
     <dog>
     Grand Danois
    -</dog>

    The parse result will be:

    #xmlElement{name = dog,
    +</dog>

    The parse result will be:

    #xmlElement{name = dog,
                 ...
    -            parents = [],
    +            parents = [],
                 ...
    -            attributes = [],
    -            content = [{xmlText,[{dog,1}],1,[],"\
    +            attributes = [],
    +            content = [{xmlText,[{dog,1}],1,[],"\
     Grand Danois\
    -",text}],
    +",text}],
                 ...
    -            }

    Where the content of the top element is: + }

    Where the content of the top element is: [{xmlText,[{dog,1}],1,[],"\ Grand Danois\ ",text}]. Text will be returned in xmlText records. Though, usually documents are more complex, and the content of the top element will in that case be a nested structure with #xmlElement{} @@ -256,41 +256,41 @@ <!ELEMENT motorcycles (bike,date?)+ > <!ELEMENT bike (name,engine,kind,drive, accessories?,comment?) > <!ELEMENT name (manufacturer,brandName,additionalName?) > -<!ELEMENT manufacturer (#href_anchor"makeup erlang" translate="no">3> {ParseResult,Misc}=xmerl_scan:file("motorcycles.xml"). -{{xmlElement,motorcycles, +<!ELEMENT manufacturer (#href_anchor"makeup erlang" translate="no">3> {ParseResult,Misc}=xmerl_scan:file("motorcycles.xml"). +{{xmlElement,motorcycles, motorcycles, - [], - {xmlNamespace,[],[]}, - [], + [], + {xmlNamespace,[],[]}, + [], 1, - [], - [{xmlText,[{motorcycles,1}],1,[],"\ - ",text}, - {xmlElement,bike, + [], + [{xmlText,[{motorcycles,1}],1,[],"\ + ",text}, + {xmlElement,bike, bike, - [], - {xmlNamespace,[],[]}, - [{motorcycles,1}], + [], + {xmlNamespace,[],[]}, + [{motorcycles,1}], 2, - [{xmlAttribute,year,[],[],[],[]|...}, - {xmlAttribute,color,[],[],[]|...}], - [{xmlText,[{bike,2},{motorcycles|...}], + [{xmlAttribute,year,[],[],[],[]|...}, + {xmlAttribute,color,[],[],[]|...}], + [{xmlText,[{bike,2},{motorcycles|...}], 1, - []|...}, - {xmlElement,name,name,[]|...}, - {xmlText,[{...}|...],3|...}, - {xmlElement,engine|...}, - {xmlText|...}, - {...}|...], - [], + []|...}, + {xmlElement,name,name,[]|...}, + {xmlText,[{...}|...],3|...}, + {xmlElement,engine|...}, + {xmlText|...}, + {...}|...], + [], ".", - undeclared}, + undeclared}, ... - ], - [], + ], + [], ".", - undeclared}, - []} + undeclared}, + []} 4>

    If you instead receives the XML doc as a string you can parse it by xmerl_scan:string/1. Both file/2 and string/2 exists where the second argument is a list of options to the parser, see the reference manual.

    @@ -327,22 +327,22 @@ {Tag, Content} or Tag where:

    • Tag = atom()
    • Attributes = [{Name, Value}| #xmlAttribute{}]
    • Name = atom()
    • Value = IOString | atom() | integer()

    See also reference manual for xmerl

    If you want to add the information about a black Harley Davidsson 1200 cc Sportster motorcycle from 2003 that is in shape as new in the motorcycles.xml document you can put the data in a simple-form data structure like:

    Data =
    -  {bike,
    -     [{year,"2003"},{color,"black"},{condition,"new"}],
    -     [{name,
    -         [{manufacturer,["Harley Davidsson"]},
    -          {brandName,["XL1200C"]},
    -          {additionalName,["Sportster"]}]},
    -      {engine,
    -         ["V-engine, 2-cylinders, 1200 cc"]},
    -      {kind,["custom"]},
    -      {drive,["belt"]}]}

    In order to append this data to the end of the motorcycles.xml document you have -to parse the file and add Data to the end of the root element content.

        {RootEl,Misc}=xmerl_scan:file('motorcycles.xml'),
    -    #xmlElement{content=Content} = RootEl,
    -    NewContent=Content++lists:flatten([Data]),
    -    NewRootEl=RootEl#xmlElement{content=NewContent},

    Then you can run it through the export_simple/2 function:

        {ok,IOF}=file:open('new_motorcycles.xml',[write]),
    -    Export=xmerl:export_simple([NewRootEl],xmerl_xml),
    -    io:format(IOF,"~s~n",[lists:flatten(Export)]),

    The result would be:

    
    +  {bike,
    +     [{year,"2003"},{color,"black"},{condition,"new"}],
    +     [{name,
    +         [{manufacturer,["Harley Davidsson"]},
    +          {brandName,["XL1200C"]},
    +          {additionalName,["Sportster"]}]},
    +      {engine,
    +         ["V-engine, 2-cylinders, 1200 cc"]},
    +      {kind,["custom"]},
    +      {drive,["belt"]}]}

    In order to append this data to the end of the motorcycles.xml document you have +to parse the file and add Data to the end of the root element content.

        {RootEl,Misc}=xmerl_scan:file('motorcycles.xml'),
    +    #xmlElement{content=Content} = RootEl,
    +    NewContent=Content++lists:flatten([Data]),
    +    NewRootEl=RootEl#xmlElement{content=NewContent},

    Then you can run it through the export_simple/2 function:

        {ok,IOF}=file:open('new_motorcycles.xml',[write]),
    +    Export=xmerl:export_simple([NewRootEl],xmerl_xml),
    +    io:format(IOF,"~s~n",[lists:flatten(Export)]),

    The result would be:

    
     <?xml version="1.0"?><motorcycles>
       <bike year="2000" color="black">
         <name>
    @@ -369,40 +369,40 @@
     <bike year="2003" color="black" condition="new"><name><manufacturer>Harley Davidsson</manufacturer><brandName>XL1200C</brandName><additionalName>Sportster</additionalName></name><engine>V-engine, 2-cylinders, 1200 cc</engine><kind>custom</kind><drive>belt</drive></bike></motorcycles>

    If it is important to get similar indentation and newlines as in the original document you have to add #href_anchor"inline">{prolog,Value} to export_simple/3. The following example code fixes those changes in the previous example:

        Data =
    -      [#xmlText{value="  "},
    -       {bike,[{year,"2003"},{color,"black"},{condition,"new"}],
    -             [#xmlText{value="\
    -    "},
    -              {name,[#xmlText{value="\
    -      "},
    -                     {manufacturer,["Harley Davidsson"]},
    -                     #xmlText{value="\
    -      "},
    -                     {brandName,["XL1200C"]},
    -                     #xmlText{value="\
    -      "},
    -                     {additionalName,["Sportster"]},
    -                     #xmlText{value="\
    -    "}]},
    -              {engine,["V-engine, 2-cylinders, 1200 cc"]},
    -              #xmlText{value="\
    -    "},
    -              {kind,["custom"]},
    -              #xmlText{value="\
    -    "},
    -              {drive,["belt"]},
    -              #xmlText{value="\
    -  "}]},
    -       #xmlText{value="\
    -"}],
    +      [#xmlText{value="  "},
    +       {bike,[{year,"2003"},{color,"black"},{condition,"new"}],
    +             [#xmlText{value="\
    +    "},
    +              {name,[#xmlText{value="\
    +      "},
    +                     {manufacturer,["Harley Davidsson"]},
    +                     #xmlText{value="\
    +      "},
    +                     {brandName,["XL1200C"]},
    +                     #xmlText{value="\
    +      "},
    +                     {additionalName,["Sportster"]},
    +                     #xmlText{value="\
    +    "}]},
    +              {engine,["V-engine, 2-cylinders, 1200 cc"]},
    +              #xmlText{value="\
    +    "},
    +              {kind,["custom"]},
    +              #xmlText{value="\
    +    "},
    +              {drive,["belt"]},
    +              #xmlText{value="\
    +  "}]},
    +       #xmlText{value="\
    +"}],
         ...
    -    NewContent=Content++lists:flatten([Data]),
    -    NewRootEl=RootEl#xmlElement{content=NewContent},
    +    NewContent=Content++lists:flatten([Data]),
    +    NewRootEl=RootEl#xmlElement{content=NewContent},
         ...
    -    Prolog = ["<?xml version=\\"1.0\\" encoding=\\"utf-8\\" ?>
    +    Prolog = ["<?xml version=\\"1.0\\" encoding=\\"utf-8\\" ?>
     <!DOCTYPE motorcycles SYSTEM \\"motorcycles.dtd\\">\
    -"],
    -    Export=xmerl:export_simple([NewRootEl],xmerl_xml,[{prolog,Prolog}]),
    /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_xpath.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_xpath.html	2025-05-10 20:19:36.769441224 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_xpath.html	2025-05-10 20:19:36.769441224 +0000
    @@ -508,7 +508,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_xs.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_xs.html 2025-05-10 20:19:36.793441442 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_xs.html 2025-05-10 20:19:36.797441478 +0000 @@ -379,7 +379,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_xs_examples.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_xs_examples.html 2025-05-10 20:19:36.821441696 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_xs_examples.html 2025-05-10 20:19:36.825441732 +0000 @@ -135,13 +135,13 @@
    <h1> <xsl:apply-templates/> </h1> -</xsl:template>

    becomes in Erlang:

    template(E = #xmlElement{ parents=[{'doc',_}|_], name='title'}) ->
    -    ["<h1>",
    -         xslapply(fun template/1, E),
    -     "</h1>"];


    Example 2 Using value_of and select

    <xsl:template match="title">
    +</xsl:template>

    becomes in Erlang:

    template(E = #xmlElement{ parents=[{'doc',_}|_], name='title'}) ->
    +    ["<h1>",
    +         xslapply(fun template/1, E),
    +     "</h1>"];


    Example 2 Using value_of and select

    <xsl:template match="title">
       <div align="center"><h1><xsl:value-of select="." /></h1></div>
    -</xsl:template>

    becomes:

    template(E = #xmlElement{name='title'}) ->
    -    ["<div align=\"center\"><h1>", value_of(select(".", E)), "</h1></div>"];


    Example 3 Simple xsl stylesheet

    A complete example with the XSLT sheet in the xmerl distribution.

    <xsl:stylesheet version="1.0"
    +</xsl:template>

    becomes:

    template(E = #xmlElement{name='title'}) ->
    +    ["<div align=\"center\"><h1>", value_of(select(".", E)), "</h1></div>"];


    Example 3 Simple xsl stylesheet

    A complete example with the XSLT sheet in the xmerl distribution.

    <xsl:stylesheet version="1.0"
             xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
             xmlns="http://www.w3.org/TR/xhtml1/strict">
     
    @@ -202,60 +202,60 @@
         </em>
       </xsl:template>
     
    -</xsl:stylesheet>


    Example 4 Erlang version

    Erlang transformation of previous example:

    -include("xmerl.hrl").
    +</xsl:stylesheet>


    Example 4 Erlang version

    Erlang transformation of previous example:

    -include("xmerl.hrl").
     
    --import(xmerl_xs,
    -    [ xslapply/2, value_of/1, select/2, built_in_rules/2 ]).
    +-import(xmerl_xs,
    +    [ xslapply/2, value_of/1, select/2, built_in_rules/2 ]).
     
    -doctype()->
    +doctype()->
         "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\
      \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd \">".
     
    -process_xml(Doc)->
    -    template(Doc).
    +process_xml(Doc)->
    +    template(Doc).
     
    -template(E = #xmlElement{name='doc'})->
    -    [ "<\?xml version=\"1.0\" encoding=\"iso-8859-1\"\?>",
    -      doctype(),
    +template(E = #xmlElement{name='doc'})->
    +    [ "<\?xml version=\"1.0\" encoding=\"iso-8859-1\"\?>",
    +      doctype(),
           "<html xmlns=\"http://www.w3.org/1999/xhtml\" >"
           "<head>"
    -      "<title>", value_of(select("title",E)), "</title>"
    +      "<title>", value_of(select("title",E)), "</title>"
           "</head>"
           "<body>",
    -      xslapply( fun template/1, E),
    +      xslapply( fun template/1, E),
           "</body>"
    -      "</html>" ];
    +      "</html>" ];
     
     
    -template(E = #xmlElement{ parents=[{'doc',_}|_], name='title'}) ->
    -    ["<h1>",
    -     xslapply( fun template/1, E),
    -     "</h1>"];
    +template(E = #xmlElement{ parents=[{'doc',_}|_], name='title'}) ->
    +    ["<h1>",
    +     xslapply( fun template/1, E),
    +     "</h1>"];
     
    -template(E = #xmlElement{ parents=[{'chapter',_}|_], name='title'}) ->
    -    ["<h2>",
    -     xslapply( fun template/1, E),
    -     "</h2>"];
    +template(E = #xmlElement{ parents=[{'chapter',_}|_], name='title'}) ->
    +    ["<h2>",
    +     xslapply( fun template/1, E),
    +     "</h2>"];
     
    -template(E = #xmlElement{ parents=[{'section',_}|_], name='title'}) ->
    -    ["<h3>",
    -     xslapply( fun template/1, E),
    -     "</h3>"];
    +template(E = #xmlElement{ parents=[{'section',_}|_], name='title'}) ->
    +    ["<h3>",
    +     xslapply( fun template/1, E),
    +     "</h3>"];
     
    -template(E = #xmlElement{ name='para'}) ->
    -    ["<p>", xslapply( fun template/1, E), "</p>"];
    +template(E = #xmlElement{ name='para'}) ->
    +    ["<p>", xslapply( fun template/1, E), "</p>"];
     
    -template(E = #xmlElement{ name='note'}) ->
    -    ["<p class=\"note\">"
    +template(E = #xmlElement{ name='note'}) ->
    +    ["<p class=\"note\">"
          "<b>NOTE: </b>",
    -     xslapply( fun template/1, E),
    -     "</p>"];
    +     xslapply( fun template/1, E),
    +     "</p>"];
     
    -template(E = #xmlElement{ name='emph'}) ->
    -    ["<em>", xslapply( fun template/1, E), "</em>"];
    +template(E = #xmlElement{ name='emph'}) ->
    +    ["<em>", xslapply( fun template/1, E), "</em>"];
     
    -template(E)->
    -    built_in_rules( fun template/1, E).

    It is important to end with a call to xmerl_xs:built_in_rules/2 if you want any +template(E)-> + built_in_rules( fun template/1, E).

    It is important to end with a call to xmerl_xs:built_in_rules/2 if you want any text to be written in "push" transforms. That are the ones using a lot xslapply( fun template/1, E ) instead of value_of(select("xpath",E)), which is pull...


    The largest example is the stylesheet to transform this document from the Simplified Docbook XML format to xhtml. The source file is sdocbook2xhtml.erl.

    @@ -274,21 +274,21 @@ <xsl:template match="line"> <xsl:if test="position() mod 2 = 0">&#160;&#160;</xsl:if> <xsl:value-of select="." /><br /> -</xsl:template>

    Can be written as

    template(E = #xmlElement{name='stanza'}) ->
    -    {Lines,LineNo} = lists:mapfoldl(fun template_pos/2, 1, select("line", E)),
    -    ["<p>", Lines, "</p>"].
    +</xsl:template>

    Can be written as

    template(E = #xmlElement{name='stanza'}) ->
    +    {Lines,LineNo} = lists:mapfoldl(fun template_pos/2, 1, select("line", E)),
    +    ["<p>", Lines, "</p>"].
     
    -template_pos(E = #xmlElement{name='line'}, P) ->
    -    {[indent_line(P rem 2), value_of(E#xmlElement.content), "<br />"], P + 1 }.
    +template_pos(E = #xmlElement{name='line'}, P) ->
    +    {[indent_line(P rem 2), value_of(E#xmlElement.content), "<br />"], P + 1 }.
     
    -indent_line(0)->"&#160;&#160;";
    -indent_line(_)->"".

    Global tree awareness

    In XSLT you have "root" access to the top of the tree with XPath, even though +indent_line(0)->"&#160;&#160;"; +indent_line(_)->"".


    Global tree awareness

    In XSLT you have "root" access to the top of the tree with XPath, even though you are somewhere deep in your tree.

    The xslapply/2 function only carries back the child part of the tree to the template fun. But it is quite easy to write template funs that handles both the -child and top tree.


    Example 6 Passing the root tree

    The following example piece will prepend the article title to any section title

    template(E = #xmlElement{name='title'}, ETop ) ->
    -    ["<h3>", value_of(select("title", ETop))," - ",
    -     xslapply( fun(A) -> template(A, ETop) end, E),
    -     "</h3>"];

    +child and top tree.


    Example 6 Passing the root tree

    The following example piece will prepend the article title to any section title

    template(E = #xmlElement{name='title'}, ETop ) ->
    +    ["<h3>", value_of(select("title", ETop))," - ",
    +     xslapply( fun(A) -> template(A, ETop) end, E),
    +     "</h3>"];

    @@ -326,7 +326,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_xsd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_xsd.html 2025-05-10 20:19:36.853441986 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.3/doc/html/xmerl_xsd.html 2025-05-10 20:19:36.857442022 +0000 @@ -806,9 +806,9 @@ several times towards the same schema it reduces time consumption.

    The result, ValidElement, is the valid element that conforms to the post-schema-validation infoset. When the validator finds an error it tries to continue and reports a list of all errors found. In those cases an unexpected -error is found it may cause a single error reason.

    Usage example:

    1>{E,_} = xmerl_scan:file("my_XML_document.xml").
    -2>{ok,S} = xmerl_xsd:process_schema("my_XML_Schema.xsd").
    -3>{E2,_} = xmerl_xsd:validate(E,S).

    Observe that E2 may differ from E if for instance there are default values +error is found it may cause a single error reason.

    Usage example:

    1>{E,_} = xmerl_scan:file("my_XML_document.xml").
    +2>{ok,S} = xmerl_xsd:process_schema("my_XML_Schema.xsd").
    +3>{E2,_} = xmerl_xsd:validate(E,S).

    Observe that E2 may differ from E if for instance there are default values defined in my_XML_Schema.xsd.

    @@ -834,7 +834,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    RPMS.2017/erlang-jinterface-27.3.4-1.1.x86_64.rpm RPMS/erlang-jinterface-27.3.4-1.1.x86_64.rpm differ: char 225, line 1 Comparing erlang-jinterface-27.3.4-1.1.x86_64.rpm to erlang-jinterface-27.3.4-1.1.x86_64.rpm comparing the rpm tags of erlang-jinterface --- old-rpm-tags +++ new-rpm-tags @@ -92 +92 @@ -/usr/lib64/erlang/lib/jinterface-1.14.1/priv/OtpErlang.jar 7efc707b7bfd700d78284f0453dddf09e4fb284ac4ae5316224e360ed6ec283a 0 +/usr/lib64/erlang/lib/jinterface-1.14.1/priv/OtpErlang.jar 162916964a65d66ccf8094221886793d6c89f2fb1a5e9a17760902a13af6a11d 0 comparing rpmtags comparing RELEASE comparing PROVIDES comparing scripts comparing filelist comparing file checksum creating rename script RPM file checksum differs. Extracting packages Package content is identical overalldiffered=3 (number of pkgs that are not bit-by-bit identical: 0 is good) overall=1
    ReportCB = fun(#{ what := What, status := Status, src := Src, dst := Dst }) ->
    -                   {ok, #hostent{ h_name = SrcName }} = inet:gethostbyaddr(Src),
    -                   {ok, #hostent{ h_name = DstName }} = inet:gethostbyaddr(Dst),
    -                   {"What: ~p~nStatus: ~p~nSrc: ~s (~s)~nDst: ~s (~s)~n",
    -                    [What, Status, inet:ntoa(Src), SrcName, inet:ntoa(Dst), DstName]}
    +metadata with your log event.

    ReportCB = fun(#{ what := What, status := Status, src := Src, dst := Dst }) ->
    +                   {ok, #hostent{ h_name = SrcName }} = inet:gethostbyaddr(Src),
    /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/logger_disk_log_h.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/logger_disk_log_h.xhtml	2025-05-10 20:19:10.513203186 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/logger_disk_log_h.xhtml	2025-05-10 20:19:10.537203404 +0000
    @@ -59,12 +59,12 @@
     and the disk_log handler, and are documented in the
     User's Guide.

    Notice that when changing the configuration of the handler in runtime, the disk_log options (file, type, max_no_files, max_no_bytes) must not be -modified.

    Example of adding a disk_log handler:

    logger:add_handler(my_disk_log_h, logger_disk_log_h,
    -                   #{config => #{file => "./my_disk_log",
    +modified.

    Example of adding a disk_log handler:

    logger:add_handler(my_disk_log_h, logger_disk_log_h,
    +                   #{config => #{file => "./my_disk_log",
                                      type => wrap,
                                      max_no_files => 4,
                                      max_no_bytes => 10000,
    -                                 filesync_repeat_interval => 1000}}).

    To use the disk_log handler instead of the default standard handler when + filesync_repeat_interval => 1000}}).

    To use the disk_log handler instead of the default standard handler when starting an Erlang node, change the Kernel default logger to use logger_disk_log_h. Example:

    erl -kernel logger '[{handler,default,logger_disk_log_h,
                           #{config => #{file => "./system_disk_log"}}}]'

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/logger_filters.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/logger_filters.xhtml 2025-05-10 20:19:10.513203186 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/logger_filters.xhtml 2025-05-10 20:19:10.537203404 +0000 @@ -135,8 +135,8 @@ events from, for example, a specific functional area. This allows filtering or other specialized treatment in a Logger handler.

    A domain field must be a list of atoms, creating smaller and more specialized domains as the list grows longer. The greatest domain is [], which comprises -all possible domains.

    For example, consider the following domains:

    D1 = [otp]
    -D2 = [otp, sasl]

    D1 is the greatest of the two, and is said to be a super-domain of D2. D2 +all possible domains.

    For example, consider the following domains:

    D1 = [otp]
    +D2 = [otp, sasl]

    D1 is the greatest of the two, and is said to be a super-domain of D2. D2 is a sub-domain D1. Both D1 and D2 are sub-domains of [].

    The above domains are used for logs originating from Erlang/OTP. D1 specifies that the log event comes from Erlang/OTP in general, and D2 indicates that the log event is a so called SASL report.

    The Extra parameter to the domain/2 function is specified when @@ -151,11 +151,11 @@ filter matches and Action is stop, the log event is stopped.

    If the filter does not match, it returns ignore, meaning that other filters, or the value of the configuration parameter filter_default, decide if the event is allowed or not.

    Log events that do not contain any domain field, match only when Compare is -equal to undefined or not_equal.

    Example: stop all events with domain [otp, sasl | _]

    1> logger:set_handler_config(h1, filter_default, log). % this is the default
    +equal to undefined or not_equal.

    Example: stop all events with domain [otp, sasl | _]

    1> logger:set_handler_config(h1, filter_default, log). % this is the default
     ok
    -2> Filter = {fun logger_filters:domain/2, {stop, sub, [otp, sasl]}}.
    +2> Filter = {fun logger_filters:domain/2, {stop, sub, [otp, sasl]}}.
     ...
    -3> logger:add_handler_filter(h1, no_sasl, Filter).
    +3> logger:add_handler_filter(h1, no_sasl, Filter).
     ok
    @@ -200,9 +200,9 @@ filter matches if the value of Operator is:

    • neq - and the compare function returns lt or gt.

    • eq - and the compare function returns eq.

    • lt - and the compare function returns lt.

    • gt - and the compare function returns gt.

    • lteq - and the compare function returns lt or eq.

    • gteq - and the compare function returns gt or eq.

    If the filter matches and Action is log, the log event is allowed. If the filter matches and Action is stop, the log event is stopped.

    If the filter does not match, it returns ignore, meaning that other filters, or the value of the configuration parameter filter_default, will decide if the -event is allowed or not.

    Example: only allow debug level log events

    logger:set_handler_config(h1, filter_default, stop).
    -Filter = {fun logger_filters:level/2, {log, eq, debug}}.
    -logger:add_handler_filter(h1, debug_only, Filter).
    +event is allowed or not.

    Example: only allow debug level log events

    logger:set_handler_config(h1, filter_default, stop).
    +Filter = {fun logger_filters:level/2, {log, eq, debug}}.
    +logger:add_handler_filter(h1, debug_only, Filter).
     ok
    /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/logger_std_h.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/logger_std_h.xhtml 2025-05-10 20:19:10.513203186 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/logger_std_h.xhtml 2025-05-10 20:19:10.537203404 +0000 @@ -80,9 +80,9 @@ protection behaviour. The same parameters are used both in the standard handler and the disk_log handler, and are documented in the User's Guide.

    Notice that if changing the configuration of the handler in runtime, the type, -file, or modes parameters must not be modified.

    Example of adding a standard handler:

    logger:add_handler(my_standard_h, logger_std_h,
    -                   #{config => #{file => "./system_info.log",
    -                                 filesync_repeat_interval => 1000}}).

    To set the default handler, that starts initially with the Kernel application, +file, or modes parameters must not be modified.

    Example of adding a standard handler:

    logger:add_handler(my_standard_h, logger_std_h,
    +                   #{config => #{file => "./system_info.log",
    +                                 filesync_repeat_interval => 1000}}).

    To set the default handler, that starts initially with the Kernel application, to log to file instead of standard_io, change the Kernel default logger configuration. Example:

    erl -kernel logger '[{handler,default,logger_std_h,
                           #{config => #{file => "./log.log"}}}]'

    An example of how to replace the standard handler with a disk_log handler at /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/net.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/net.xhtml 2025-05-10 20:19:10.513203186 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/net.xhtml 2025-05-10 20:19:10.537203404 +0000 @@ -449,13 +449,13 @@

    Interface address filtering selector function/0.

    For each ifaddrs entry, return either true to keep the entry or false to discard the entry.

    For example, to get an interface list which only contains -non-loopback inet interfaces:

    net:getifaddrs(
    -    fun (#{ addr  := #{family := inet},
    -            flags := Flags}) ->
    -          not lists:member(loopback, Flags);
    -        (_) ->
    +non-loopback inet interfaces:

    net:getifaddrs(
    +    fun (#{ addr  := #{family := inet},
    +            flags := Flags}) ->
    +          not lists:member(loopback, Flags);
    +        (_) ->
               false
    -    end).
    +
    end).
    /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/net_adm.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/net_adm.xhtml 2025-05-10 20:19:10.513203186 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/net_adm.xhtml 2025-05-10 20:19:10.533203368 +0000 @@ -370,8 +370,8 @@

    Returns the names and associated port numbers of the Erlang nodes that epmd -registered at the specified host.

    Similar to epmd -names, see erts:epmd.

    Returns {error, address} if epmd is not operational.

    Example:

    (arne@dunn)1> net_adm:names().
    -{ok,[{"arne",40262}]}
    +registered at the specified host.

    Similar to epmd -names, see erts:epmd.

    Returns {error, address} if epmd is not operational.

    Example:

    (arne@dunn)1> net_adm:names().
    +{ok,[{"arne",40262}]}
    /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/net_kernel.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/net_kernel.xhtml 2025-05-10 20:19:10.513203186 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/net_kernel.xhtml 2025-05-10 20:19:10.533203368 +0000 @@ -27,9 +27,9 @@ operational for distributed Erlang to work. The purpose of this process is to implement parts of the BIFs spawn/4 and spawn_link/4, and to provide monitoring of the network.

    An Erlang node is started using command-line flag -name or -sname:

    $ erl -sname foobar

    It is also possible to call net_kernel:start(foobar, #{}) -directly from the normal Erlang shell prompt:

    1> net_kernel:start(foobar, #{name_domain => shortnames}).
    -{ok,<0.64.0>}
    -(foobar@gringotts)2>

    If the node is started with command-line flag -sname, the node name is +directly from the normal Erlang shell prompt:

    1> net_kernel:start(foobar, #{name_domain => shortnames}).
    +{ok,<0.64.0>}
    +(foobar@gringotts)2>

    If the node is started with command-line flag -sname, the node name is foobar@Host, where Host is the short name of the host (not the fully qualified domain name). If started with flag -name, the node name is foobar@Host, where Host is the fully qualified domain name. For more @@ -547,13 +547,13 @@ delivered before a nodeup message due to a new connection to the same node. Prior to OTP 23.0, this was not guaranteed to be the case.

    The format of the node status change messages depends on Options. If Options is the empty list or if net_kernel:monitor_nodes/1 is called, the format is as -follows:

    {nodeup, Node} | {nodedown, Node}
    -  Node = node()

    When Options is the empty map or empty list, the caller will only subscribe +follows:

    {nodeup, Node} | {nodedown, Node}
    +  Node = node()

    When Options is the empty map or empty list, the caller will only subscribe for status change messages for visible nodes. That is, only nodes that appear in the result of erlang:nodes/0.

    If Options equals anything other than the empty list, the format of the status -change messages is as follows:

    {nodeup, Node, Info} | {nodedown, Node, Info}
    -  Node = node()
    -  Info = #{Tag => Val} | [{Tag, Val}]

    Info is either a map or a list of 2-tuples. Its content depends on Options. +change messages is as follows:

    {nodeup, Node, Info} | {nodedown, Node, Info}
    +  Node = node()
    +  Info = #{Tag => Val} | [{Tag, Val}]

    Info is either a map or a list of 2-tuples. Its content depends on Options. If Options is a map, Info will also be a map. If Options is a list, Info will also be a list.

    When Options is a map, currently the following associations are allowed:

    • connection_id => boolean() - If the value of the association equals true, a connection_id => ConnectionId association will be included in the @@ -587,23 +587,23 @@ {node_type, visible} tuple will be included in the Info list.

    • nodedown_reason - The tuple {nodedown_reason, Reason} will be included in the Info list for nodedown messages.

      See the documentation of the nodedown_reason => boolean() association -above for information about possible Reason values.

    Example:

    (a@localhost)1> net_kernel:monitor_nodes(true, #{connection_id=>true, node_type=>all, nodedown_reason=>true}).
    +above for information about possible Reason values.

    Example:

    (a@localhost)1> net_kernel:monitor_nodes(true, #{connection_id=>true, node_type=>all, nodedown_reason=>true}).
     ok
    -(a@localhost)2> flush().
    -Shell got {nodeup,b@localhost,
    -                  #{connection_id => 3067552,node_type => visible}}
    -Shell got {nodeup,c@localhost,
    -                  #{connection_id => 13892107,node_type => hidden}}
    -Shell got {nodedown,b@localhost,
    -                    #{connection_id => 3067552,node_type => visible,
    -                      nodedown_reason => connection_closed}}
    -Shell got {nodedown,c@localhost,
    -                    #{connection_id => 13892107,node_type => hidden,
    -                      nodedown_reason => net_tick_timeout}}
    -Shell got {nodeup,b@localhost,
    -                  #{connection_id => 3067553,node_type => visible}}
    +(a@localhost)2> flush().
    +Shell got {nodeup,b@localhost,
    +                  #{connection_id => 3067552,node_type => visible}}
    +Shell got {nodeup,c@localhost,
    +                  #{connection_id => 13892107,node_type => hidden}}
    +Shell got {nodedown,b@localhost,
    +                    #{connection_id => 3067552,node_type => visible,
    +                      nodedown_reason => connection_closed}}
    +Shell got {nodedown,c@localhost,
    +                    #{connection_id => 13892107,node_type => hidden,
    +                      nodedown_reason => net_tick_timeout}}
    +Shell got {nodeup,b@localhost,
    +                  #{connection_id => 3067553,node_type => visible}}
     ok
    -(a@localhost)3>
    +
    (a@localhost)3>
    /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/notes.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/notes.xhtml 2025-05-10 20:19:10.513203186 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/notes.xhtml 2025-05-10 20:19:10.533203368 +0000 @@ -4020,12 +4020,12 @@ viewed as two operations performed atomically. Asynchronously send an unlink signal or a demonitor signal, and ignore any future results of the link or monitor.

    NOTE: This change can cause some obscure code to fail which previously did -not. For example, the following code might hang:

                Mon = erlang:monitor(process, Pid),
    +not. For example, the following code might hang:

                Mon = erlang:monitor(process, Pid),
                 %% ...
    -            exit(Pid, bang),
    -            erlang:demonitor(Mon),
    +            exit(Pid, bang),
    +            erlang:demonitor(Mon),
                 receive
    -                {'DOWN', Mon, process, Pid, _} -> ok
    +                {'DOWN', Mon, process, Pid, _} -> ok
                 %% We were previously guaranteed to get a down message
                 %% (since we exited the process ourself), so we could
                 %% in this case leave out:
    /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/os.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/os.xhtml	2025-05-10 20:19:10.509203150 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/os.xhtml	2025-05-10 20:19:10.533203368 +0000
    @@ -537,13 +537,13 @@
     

    Executes Command in a command shell of the target OS, captures the standard output and standard error of the command, and returns this result as a string.

    The command shell can be set using the kernel configuration parameter, by default the -shell is detected upon system startup.

    Examples:

    LsOut = os:cmd("ls"), % on unix platform
    -DirOut = os:cmd("dir"), % on Win32 platform

    Notice that in some cases, standard output of a command when called from another +shell is detected upon system startup.

    Examples:

    LsOut = os:cmd("ls"), % on unix platform
    +DirOut = os:cmd("dir"), % on Win32 platform

    Notice that in some cases, standard output of a command when called from another program can differ, compared with the standard output of the command when called directly from an OS command shell.

    The possible options are:

    • max_size - The maximum size of the data returned by the os:cmd call. This option is a safety feature that should be used when the command executed -can return a very large, possibly infinite, result.

      > os:cmd("cat /dev/zero", #{ max_size => 20 }).
      -[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
    +can return a very large, possibly infinite, result.

    > os:cmd("cat /dev/zero", #{ max_size => 20 }).
    +[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
    @@ -833,7 +833,7 @@ resolution timestamp.

    This counter is read directly from the hardware or operating system with the same guarantees. This means that two consecutive calls to the function are not guaranteed to be monotonic, though it most likely will be. The performance -counter will be converted to the resolution passed as an argument.

    1> T1 = os:perf_counter(1000),receive after 10000 -> ok end,T2 = os:perf_counter(1000).
    +counter will be converted to the resolution passed as an argument.

    1> T1 = os:perf_counter(1000),receive after 10000 -> ok end,T2 = os:perf_counter(1000).
     176525861
     2> T2 - T1.
     10004
    @@ -1004,16 +1004,16 @@ allows you to log time stamps in high resolution and consistent with the time in the rest of the OS.

    Example of code formatting a string in format "DD Mon YYYY HH:MM:SS.mmmmmm", where DD is the day of month, Mon is the textual month name, YYYY is the year, -HH:MM:SS is the time, and mmmmmm is the microseconds in six positions:

    -module(print_time).
    --export([format_utc_timestamp/0]).
    -format_utc_timestamp() ->
    -    TS = {_,_,Micro} = os:timestamp(),
    -    {{Year,Month,Day},{Hour,Minute,Second}} =
    -calendar:now_to_universal_time(TS),
    -    Mstr = element(Month,{"Jan","Feb","Mar","Apr","May","Jun","Jul",
    -    "Aug","Sep","Oct","Nov","Dec"}),
    -    io_lib:format("~2w ~s ~4w ~2w:~2..0w:~2..0w.~6..0w",
    -    [Day,Mstr,Year,Hour,Minute,Second,Micro]).

    This module can be used as follows:

    1> io:format("~s~n",[print_time:format_utc_timestamp()]).
    +HH:MM:SS is the time, and mmmmmm is the microseconds in six positions:

    -module(print_time).
    +-export([format_utc_timestamp/0]).
    +format_utc_timestamp() ->
    +    TS = {_,_,Micro} = os:timestamp(),
    +    {{Year,Month,Day},{Hour,Minute,Second}} =
    +calendar:now_to_universal_time(TS),
    +    Mstr = element(Month,{"Jan","Feb","Mar","Apr","May","Jun","Jul",
    +    "Aug","Sep","Oct","Nov","Dec"}),
    +    io_lib:format("~2w ~s ~4w ~2w:~2..0w:~2..0w.~6..0w",
    +    [Day,Mstr,Year,Hour,Minute,Second,Micro]).

    This module can be used as follows:

    1> io:format("~s~n",[print_time:format_utc_timestamp()]).
     29 Apr 2009  9:55:30.051711

    OS system time can also be retrieved by system_time/0 and system_time/1.

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/pg.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/pg.xhtml 2025-05-10 20:19:10.509203150 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/pg.xhtml 2025-05-10 20:19:10.533203368 +0000 @@ -749,7 +749,7 @@

    Subscribes the caller to updates from the specified scope.

    Returns content of the entire scope and a reference to match the upcoming notifications.

    Whenever any group membership changes, an update message is sent to the -subscriber:

    {Ref, join, Group, [JoinPid1, JoinPid2]}
    {Ref, leave, Group, [LeavePid1]}
    +subscriber:

    {Ref, join, Group, [JoinPid1, JoinPid2]}
    {Ref, leave, Group, [LeavePid1]}
    /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/rpc.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/rpc.xhtml 2025-05-10 20:19:10.509203150 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/rpc.xhtml 2025-05-10 20:19:10.533203368 +0000 @@ -958,10 +958,10 @@ return values, or {badrpc, Reason} for failing calls. Timeout is a time (integer) in milliseconds, or infinity.

    The following example is useful when new object code is to be loaded on all nodes in the network, and indicates some side effects that RPCs can produce:

    %% Find object code for module Mod
    -{Mod, Bin, File} = code:get_object_code(Mod),
    +{Mod, Bin, File} = code:get_object_code(Mod),
     
     %% and load it on all nodes including this one
    -{ResL, _} = rpc:multicall(code, load_binary, [Mod, File, Bin]),
    +{ResL, _} = rpc:multicall(code, load_binary, [Mod, File, Bin]),
     
     %% and then maybe check the ResL list.

    Note

    If you want the ability to distinguish between results, you may want to consider using the erpc:multicall() function from the /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/seq_trace.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/seq_trace.xhtml 2025-05-10 20:19:10.509203150 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/seq_trace.xhtml 2025-05-10 20:19:10.529203331 +0000 @@ -36,9 +36,9 @@ Trace Messages Sent to the System Tracer

    The format of the messages is one of the following, depending on if flag -timestamp of the trace token is set to true or false:

    {seq_trace, Label, SeqTraceInfo, TimeStamp}

    or

    {seq_trace, Label, SeqTraceInfo}

    Where:

    Label = int()
    -TimeStamp = {Seconds, Milliseconds, Microseconds}
    -  Seconds = Milliseconds = Microseconds = int()

    SeqTraceInfo can have the following formats:

    • {send, Serial, From, To, Message} - Used when a process From with its +timestamp of the trace token is set to true or false:

      {seq_trace, Label, SeqTraceInfo, TimeStamp}

      or

      {seq_trace, Label, SeqTraceInfo}

      Where:

      Label = int()
      +TimeStamp = {Seconds, Milliseconds, Microseconds}
      +  Seconds = Milliseconds = Microseconds = int()

      SeqTraceInfo can have the following formats:

      • {send, Serial, From, To, Message} - Used when a process From with its trace token flag send set to true has sent information. To may be a process identifier, a registered name on a node represented as {NameAtom, NodeAtom}, or a node name represented as an atom. From may be a @@ -182,68 +182,68 @@ Example of Use

        This example gives a rough idea of how the new primitives can be used and what -kind of output it produces.

        Assume that you have an initiating process with Pid == <0.30.0> like this:

        -module(seqex).
        --compile(export_all).
        +kind of output it produces.

        Assume that you have an initiating process with Pid == <0.30.0> like this:

        -module(seqex).
        +-compile(export_all).
         
        -loop(Port) ->
        +loop(Port) ->
             receive
        -        {Port,Message} ->
        -            seq_trace:set_token(label,17),
        -            seq_trace:set_token('receive',true),
        -            seq_trace:set_token(print,true),
        -            seq_trace:print(17,"**** Trace Started ****"),
        -            call_server ! {self(),the_message};
        -        {ack,Ack} ->
        +        {Port,Message} ->
        +            seq_trace:set_token(label,17),
        +            seq_trace:set_token('receive',true),
        +            seq_trace:set_token(print,true),
        +            seq_trace:print(17,"**** Trace Started ****"),
        +            call_server ! {self(),the_message};
        +        {ack,Ack} ->
                     ok
             end,
        -    loop(Port).

        And a registered process call_server with Pid == <0.31.0> like this:

        loop() ->
        +    loop(Port).

        And a registered process call_server with Pid == <0.31.0> like this:

        loop() ->
             receive
        -        {PortController,Message} ->
        -            Ack = {received, Message},
        -            seq_trace:print(17,"We are here now"),
        -            PortController ! {ack,Ack}
        +        {PortController,Message} ->
        +            Ack = {received, Message},
        +            seq_trace:print(17,"We are here now"),
        +            PortController ! {ack,Ack}
             end,
        -    loop().

        A possible output from the system's sequential_tracer can be like this:

        17:<0.30.0> Info {0,1} WITH
        +    loop().

        A possible output from the system's sequential_tracer can be like this:

        17:<0.30.0> Info {0,1} WITH
         "**** Trace Started ****"
        -17:<0.31.0> Received {0,2} FROM <0.30.0> WITH
        -{<0.30.0>,the_message}
        -17:<0.31.0> Info {2,3} WITH
        +17:<0.31.0> Received {0,2} FROM <0.30.0> WITH
        +{<0.30.0>,the_message}
        +17:<0.31.0> Info {2,3} WITH
         "We are here now"
        -17:<0.30.0> Received {2,4} FROM <0.31.0> WITH
        -{ack,{received,the_message}}

        The implementation of a system tracer process that produces this printout can -look like this:

        tracer() ->
        +17:<0.30.0> Received {2,4} FROM <0.31.0> WITH
        +{ack,{received,the_message}}

        The implementation of a system tracer process that produces this printout can +look like this:

        tracer() ->
             receive
        -        {seq_trace,Label,TraceInfo} ->
        -           print_trace(Label,TraceInfo,false);
        -        {seq_trace,Label,TraceInfo,Ts} ->
        -           print_trace(Label,TraceInfo,Ts);
        +        {seq_trace,Label,TraceInfo} ->
        +           print_trace(Label,TraceInfo,false);
        +        {seq_trace,Label,TraceInfo,Ts} ->
        +           print_trace(Label,TraceInfo,Ts);
                 _Other -> ignore
             end,
        -    tracer().
        +    tracer().
         
        -print_trace(Label,TraceInfo,false) ->
        -    io:format("~p:",[Label]),
        -    print_trace(TraceInfo);
        -print_trace(Label,TraceInfo,Ts) ->
        -    io:format("~p ~p:",[Label,Ts]),
        -    print_trace(TraceInfo).
        -
        -print_trace({print,Serial,From,_,Info}) ->
        -    io:format("~p Info ~p WITH~n~p~n", [From,Serial,Info]);
        -print_trace({'receive',Serial,From,To,Message}) ->
        -    io:format("~p Received ~p FROM ~p WITH~n~p~n",
        -              [To,Serial,From,Message]);
        -print_trace({send,Serial,From,To,Message}) ->
        -    io:format("~p Sent ~p TO ~p WITH~n~p~n",
        -              [From,Serial,To,Message]).

        The code that creates a process that runs this tracer function and sets that -process as the system tracer can look like this:

        start() ->
        -    Pid = spawn(?MODULE,tracer,[]),
        -    seq_trace:set_system_tracer(Pid), % set Pid as the system tracer
        -    ok.

        With a function like test/0, the whole example can be started:

        test() ->
        -    P = spawn(?MODULE, loop, [port]),
        -    register(call_server, spawn(?MODULE, loop, [])),
        -    start(),
        -    P ! {port,message}.
        +
        print_trace(Label,TraceInfo,false) -> + io:format("~p:",[Label]), + print_trace(TraceInfo); +print_trace(Label,TraceInfo,Ts) -> + io:format("~p ~p:",[Label,Ts]), + print_trace(TraceInfo). + +print_trace({print,Serial,From,_,Info}) -> + io:format("~p Info ~p WITH~n~p~n", [From,Serial,Info]); +print_trace({'receive',Serial,From,To,Message}) -> + io:format("~p Received ~p FROM ~p WITH~n~p~n", + [To,Serial,From,Message]); +print_trace({send,Serial,From,To,Message}) -> + io:format("~p Sent ~p TO ~p WITH~n~p~n", + [From,Serial,To,Message]).

        The code that creates a process that runs this tracer function and sets that +process as the system tracer can look like this:

        start() ->
        +    Pid = spawn(?MODULE,tracer,[]),
        +    seq_trace:set_system_tracer(Pid), % set Pid as the system tracer
        +    ok.

        With a function like test/0, the whole example can be started:

        test() ->
        +    P = spawn(?MODULE, loop, [port]),
        +    register(call_server, spawn(?MODULE, loop, [])),
        +    start(),
        +    P ! {port,message}.
        @@ -816,11 +816,11 @@ tracing is disabled, otherwise Token should be an Erlang term returned from get_token/0 or set_token/1. set_token/1 can be used to temporarily exclude message passing from the trace by setting the -trace token to empty like this:

        OldToken = seq_trace:set_token([]), % set to empty and save
        +trace token to empty like this:

        OldToken = seq_trace:set_token([]), % set to empty and save
                                             % old value
         % do something that should not be part of the trace
        -io:format("Exclude the signalling caused by this~n"),
        -seq_trace:set_token(OldToken), % activate the trace token again
        +io:format("Exclude the signalling caused by this~n"),
        +seq_trace:set_token(OldToken), % activate the trace token again
         ...

        Returns the previous value of the trace token.

        /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/socket.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/socket.xhtml 2025-05-10 20:19:10.509203150 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/socket.xhtml 2025-05-10 20:19:10.529203331 +0000 @@ -67,8 +67,8 @@ completion_info/0 and the received completion message.

        The compiler may then optimize a following receive statement to only scan the messages that arrive after the reference/0 is created. If the message queue is large this is a big optimization.

        The reference/0 has to be unique for the call.

        Repeating an Operation on a select Systems

        Onselect systems, if a call would be repeated before the select -message has been received it replaces the call in progress:

            {select, {select_info, Handle}} = socket:accept(LSock, nowait),
        -    {error, timeout} = socket:accept(LSock, 500),
        +message has been received it replaces the call in progress:

            {select, {select_info, Handle}} = socket:accept(LSock, nowait),
        +    {error, timeout} = socket:accept(LSock, 500),
             :

        Above, Handle is no longer valid once the second accept/2, call has been made (the first call is automatically canceled). After the second accept/2 call returns {error, timeout}, @@ -101,28 +101,28 @@ Examples -

        client(SAddr, SPort) ->
        -   {ok, Sock} = socket:open(inet, stream, tcp),
        -   ok = socket:connect(Sock, #{family => inet,
        +
        client(SAddr, SPort) ->
        +   {ok, Sock} = socket:open(inet, stream, tcp),
        +   ok = socket:connect(Sock, #{family => inet,
                                        addr   => SAddr,
        -                               port   => SPort}),
        +                               port   => SPort}),
            Msg = <<"hello">>,
        -   ok = socket:send(Sock, Msg),
        -   ok = socket:shutdown(Sock, write),
        -   {ok, Msg} = socket:recv(Sock),
        -   ok = socket:close(Sock).
        -
        -server(Addr, Port) ->
        -   {ok, LSock} = socket:open(inet, stream, tcp),
        -   ok = socket:bind(LSock, #{family => inet,
        +   ok = socket:send(Sock, Msg),
        +   ok = socket:shutdown(Sock, write),
        +   {ok, Msg} = socket:recv(Sock),
        +   ok = socket:close(Sock).
        +
        +server(Addr, Port) ->
        +   {ok, LSock} = socket:open(inet, stream, tcp),
        +   ok = socket:bind(LSock, #{family => inet,
                                      port   => Port,
        -                             addr   => Addr}),
        -   ok = socket:listen(LSock),
        -   {ok, Sock} = socket:accept(LSock),
        -   {ok, Msg} = socket:recv(Sock),
        -   ok = socket:send(Sock, Msg),
        -   ok = socket:close(Sock),
        -   ok = socket:close(LSock).
        +
        addr => Addr}), + ok = socket:listen(LSock), + {ok, Sock} = socket:accept(LSock), + {ok, Msg} = socket:recv(Sock), + ok = socket:send(Sock, Msg), + ok = socket:close(Sock), + ok = socket:close(LSock).
        @@ -4724,7 +4724,7 @@ (since OTP 26.1).

        Result; a boolean/0.

      • tcp_info - Get miscellaneous TCP related information for a connected socket (since OTP 26.1).

        Result; a map/0 with information items as key-value pairs.

      Note

      Not all requests are supported by all platforms. To see if a ioctl request is supported on the current platform:

            Request = nread,
      -      true = socket:is_supported(ioctl_requests, Request),
      +      true = socket:is_supported(ioctl_requests, Request),
             :
      @@ -4888,7 +4888,7 @@

      Check if a socket feature is supported.

      Returns true if supports/0 has a {Key1, true} tuple or a {Key1, list()} tuple in its returned list, -otherwise false (also for unknown keys).

      Example:

      true = socket:is_supported(local),
      +otherwise false (also for unknown keys).

      Example:

      true = socket:is_supported(local),
      @@ -4919,7 +4919,7 @@

      Check if a socket feature is supported.

      Returns true if supports(Key1) has a {Key2, true} tuple -in its returned list, otherwise false (also for unknown keys).

      Example:

      true = socket:is_supported(msg_flags, errqueue),
      +in its returned list, otherwise false (also for unknown keys).

      Example:

      true = socket:is_supported(msg_flags, errqueue),
      @@ -5016,7 +5016,7 @@

      Start a socket monitor.

      If the Socket doesn't exist or when later the monitor is triggered, a 'DOWN' message is sent to the process that called monitor/1 -with the following pattern:

      	    {'DOWN', MonitorRef, socket, Socket, Info}

      Info is the termination reason of the socket or nosock if +with the following pattern:

      	    {'DOWN', MonitorRef, socket, Socket, Info}

      Info is the termination reason of the socket or nosock if Socket did not exist when the monitor was started.

      Making several calls to socket:monitor/1 for the same Socket is not an error; each call creates an independent monitor instance.

      @@ -5443,25 +5443,25 @@ On Unix, if will return {error, timeout} either if no data has arrived or if not enough data (Length > 0) has arrived. It is then up to the caller to make another all to see if -some data has arrived (and was stored internally):

          case socket:recv(Socket, 10, 5000) of
      -        {ok, Data} -> % 10 bytes of data
      +some data has arrived (and was stored internally):

          case socket:recv(Socket, 10, 5000) of
      +        {ok, Data} -> % 10 bytes of data
                   "Do something with this data..."
                   ok;
       
      -        {error, timeout} ->
      +        {error, timeout} ->
                   %% We *may* have gotten *some* data, just less then 10,
                   %% so try read again.
      -            case socket:recv(Socket, 0, 0) of
      -                {ok, Data} -> % We *did* get some data
      +            case socket:recv(Socket, 0, 0) of
      +                {ok, Data} -> % We *did* get some data
                           "Do something with this data..."
                           ok;
      -                {error, timeout} -> % Actually nothing to read
      +                {error, timeout} -> % Actually nothing to read
                           :
      -                {error, _} -> % Proper error
      +                {error, _} -> % Proper error
                           :
                   end;                    
       
      -        {error, {timeout, Data}} -> % Only on Windows
      +        {error, {timeout, Data}} -> % Only on Windows
                   "Do something with this data..."
                   ok;
               :

      Timeout = 0 only polls the OS receive call and doesn't /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/socket_usage.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/socket_usage.xhtml 2025-05-10 20:19:10.505203114 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/socket_usage.xhtml 2025-05-10 20:19:10.529203331 +0000 @@ -81,48 +81,48 @@ Example

      This example is intended to show how to create a simple (echo) server -(and client), handling both 'select' and 'completion' (Unix and Windows).

      -module(example).
      +(and client), handling both 'select' and 'completion' (Unix and Windows).

      -module(example).
       
      --export([client/2, client/3]).
      --export([server/0, server/1, server/2]).
      +-export([client/2, client/3]).
      +-export([server/0, server/1, server/2]).
       
       
       %% ======================================================================
       
       %% === Client ===
       
      -client(#{family := Family} = ServerSockAddr, Msg)
      -  when is_list(Msg) orelse is_binary(Msg) ->
      -    {ok, Sock} = socket:open(Family, stream, default),
      -    ok         = maybe_bind(Sock, Family),
      -    ok         = socket:connect(Sock, ServerSockAddr),
      -    client_exchange(Sock, Msg);
      +client(#{family := Family} = ServerSockAddr, Msg)
      +  when is_list(Msg) orelse is_binary(Msg) ->
      +    {ok, Sock} = socket:open(Family, stream, default),
      +    ok         = maybe_bind(Sock, Family),
      +    ok         = socket:connect(Sock, ServerSockAddr),
      +    client_exchange(Sock, Msg);
       
      -client(ServerPort, Msg)
      -  when is_integer(ServerPort) andalso (ServerPort > 0) ->
      +client(ServerPort, Msg)
      +  when is_integer(ServerPort) andalso (ServerPort > 0) ->
           Family   = inet, % Default
      -    Addr     = get_local_addr(Family), % Pick an address
      -    SockAddr = #{family => Family,
      +    Addr     = get_local_addr(Family), % Pick an address
      +    SockAddr = #{family => Family,
       		 addr   => Addr,
      -		 port   => ServerPort},
      -    client(SockAddr, Msg).
      +		 port   => ServerPort},
      +    client(SockAddr, Msg).
       
      -client(ServerPort, ServerAddr, Msg)
      -  when is_integer(ServerPort) andalso (ServerPort > 0) andalso
      -       is_tuple(ServerAddr) ->
      -    Family   = which_family(ServerAddr),
      -    SockAddr = #{family => Family,
      +client(ServerPort, ServerAddr, Msg)
      +  when is_integer(ServerPort) andalso (ServerPort > 0) andalso
      +       is_tuple(ServerAddr) ->
      +    Family   = which_family(ServerAddr),
      +    SockAddr = #{family => Family,
       		 addr   => ServerAddr,
      -		 port   => ServerPort},
      -    client(SockAddr, Msg).
      +		 port   => ServerPort},
      +    client(SockAddr, Msg).
       
       %% Send the message to the (echo) server and wait for the echo to come back.
      -client_exchange(Sock, Msg) when is_list(Msg) ->
      -    client_exchange(Sock, list_to_binary(Msg));
      -client_exchange(Sock, Msg) when is_binary(Msg) ->
      -    ok        = socket:send(Sock, Msg, infinity),
      -    {ok, Msg} = socket:recv(Sock, byte_size(Msg), infinity),
      -    ok        = socket:close(Sock),
      +client_exchange(Sock, Msg) when is_list(Msg) ->
      +    client_exchange(Sock, list_to_binary(Msg));
      +client_exchange(Sock, Msg) when is_binary(Msg) ->
      +    ok        = socket:send(Sock, Msg, infinity),
      +    {ok, Msg} = socket:recv(Sock, byte_size(Msg), infinity),
      +    ok        = socket:close(Sock),
           ok.
       
       
      @@ -130,131 +130,131 @@
       
       %% === Server ===
       
      -server() ->
      +server() ->
           %% Make system choose port (and address)
      -    server(0).
      +    server(0).
       
       %% This function return the port and address that it actually uses,
       %% in case server/0 or server/1 (with a port number) was used to start it.
       
      -server(#{family := Family, addr := Addr, port := _} = SockAddr) ->
      -    {ok, Sock} = socket:open(Family, stream, tcp),
      -    ok         = socket:bind(Sock, SockAddr),
      -    ok         = socket:listen(Sock),
      -    {ok, #{port := Port}} = socket:sockname(Sock),
      -    Acceptor = start_acceptor(Sock),
      -    {ok, {Port, Addr, Acceptor}};
      +server(#{family := Family, addr := Addr, port := _} = SockAddr) ->
      +    {ok, Sock} = socket:open(Family, stream, tcp),
      +    ok         = socket:bind(Sock, SockAddr),
      +    ok         = socket:listen(Sock),
      +    {ok, #{port := Port}} = socket:sockname(Sock),
      +    Acceptor = start_acceptor(Sock),
      +    {ok, {Port, Addr, Acceptor}};
       
      -server(Port) when is_integer(Port) ->
      +server(Port) when is_integer(Port) ->
           Family   = inet, % Default
      -    Addr     = get_local_addr(Family), % Pick an address
      -    SockAddr = #{family => Family,
      +    Addr     = get_local_addr(Family), % Pick an address
      +    SockAddr = #{family => Family,
       		 addr   => Addr,
      -		 port   => Port},
      -    server(SockAddr).
      +		 port   => Port},
      +    server(SockAddr).
       
      -server(Port, Addr)
      -  when is_integer(Port) andalso (Port >= 0) andalso
      -       is_tuple(Addr) ->
      -    Family   = which_family(Addr),
      -    SockAddr = #{family => Family,
      +server(Port, Addr)
      +  when is_integer(Port) andalso (Port >= 0) andalso
      +       is_tuple(Addr) ->
      +    Family   = which_family(Addr),
      +    SockAddr = #{family => Family,
       		 addr   => Addr,
      -		 port   => Port},
      -    server(SockAddr).
      +		 port   => Port},
      +    server(SockAddr).
       
       
       %% --- Echo Server - Acceptor ---
       
      -start_acceptor(LSock) ->
      -    Self = self(),
      -    {Pid, MRef} = spawn_monitor(fun() -> acceptor_init(Self, LSock) end),
      +start_acceptor(LSock) ->
      +    Self = self(),
      +    {Pid, MRef} = spawn_monitor(fun() -> acceptor_init(Self, LSock) end),
           receive
      -	{'DOWN', MRef, process, Pid, Info} ->
      -	    erlang:error({failed_starting_acceptor, Info});
      -	{Pid, started} ->
      +	{'DOWN', MRef, process, Pid, Info} ->
      +	    erlang:error({failed_starting_acceptor, Info});
      +	{Pid, started} ->
       	    %% Transfer ownership
      -	    socket:setopt(LSock, otp, owner, Pid),
      -	    Pid ! {self(), continue},
      -	    erlang:demonitor(MRef),
      +	    socket:setopt(LSock, otp, owner, Pid),
      +	    Pid ! {self(), continue},
      +	    erlang:demonitor(MRef),
       	    Pid
           end.
           
      -acceptor_init(Parent, LSock) ->
      -    Parent ! {self(), started},
      +acceptor_init(Parent, LSock) ->
      +    Parent ! {self(), started},
           receive
      -	{Parent, continue} ->
      +	{Parent, continue} ->
       	    ok
           end,
      -    acceptor_loop(LSock, undefined).
      +    acceptor_loop(LSock, undefined).
       
      -acceptor_loop(LSock, undefined = Info) ->
      -    case socket:accept(LSock, nowait) of
      -	{ok, ASock} ->
      -	    start_handler(ASock),
      -	    acceptor_loop(LSock, Info);
      -	{select, SelectInfo} ->
      -	    acceptor_loop(LSock, SelectInfo);
      -	{completion, CompletionInfo} ->
      -	    acceptor_loop(LSock, CompletionInfo);
      -	{error, Reason} ->
      -	    erlang:error({accept_failed, Reason})
      +acceptor_loop(LSock, undefined = Info) ->
      +    case socket:accept(LSock, nowait) of
      +	{ok, ASock} ->
      +	    start_handler(ASock),
      +	    acceptor_loop(LSock, Info);
      +	{select, SelectInfo} ->
      +	    acceptor_loop(LSock, SelectInfo);
      +	{completion, CompletionInfo} ->
      +	    acceptor_loop(LSock, CompletionInfo);
      +	{error, Reason} ->
      +	    erlang:error({accept_failed, Reason})
           end;
       
      -acceptor_loop(LSock, {select_info, accept, SelectHandle}) ->
      +acceptor_loop(LSock, {select_info, accept, SelectHandle}) ->
      /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/trace.xhtml differs (HTML document, ASCII text, with very long lines)
      --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/trace.xhtml	2025-05-10 20:19:10.505203114 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/kernel.epub/OEBPS/trace.xhtml	2025-05-10 20:19:10.529203331 +0000
      @@ -41,23 +41,23 @@
       messages. Several sessions can exist at the same time without interfering with
       each other. When a trace session is destroyed, all its trace settings are
       automatically cleaned up.

      Example:

      %% Create a tracer process that will receive the trace events
      -1> Tracer = spawn(fun F() -> receive M -> io:format("~p~n",[M]), F() end end).
      +1> Tracer = spawn(fun F() -> receive M -> io:format("~p~n",[M]), F() end end).
       <0.91.0>
       %% Create a session using the Tracer
      -2> Session = trace:session_create(my_session, Tracer, []).
      -{#Ref<0.1543805153.1548353537.92331>,{my_session, 0}}
      +2> Session = trace:session_create(my_session, Tracer, []).
      +{#Ref<0.1543805153.1548353537.92331>,{my_session, 0}}
       %% Setup call tracing on self()
      -3> trace:process(Session, self(), true, [call]).
      +3> trace:process(Session, self(), true, [call]).
       1
       %% Setup call tracing on lists:seq/2
      -4> trace:function(Session, {lists,seq,2}, [], []).
      +4> trace:function(Session, {lists,seq,2}, [], []).
       1
       %% Call the traced function
      -5> lists:seq(1, 10).
      -{trace,<0.89.0>,call,{lists,seq,[1,10]}} % The trace message
      -[1,2,3,4,5,6,7,8,9,10] % The return value
      +5> lists:seq(1, 10).
      +{trace,<0.89.0>,call,{lists,seq,[1,10]}} % The trace message
      +[1,2,3,4,5,6,7,8,9,10] % The return value
       %% Cleanup the trace session
      -6> trace:session_destroy(Session).
      +6> trace:session_destroy(Session).
       ok

      @@ -1205,9 +1205,9 @@ Match Specifications in Erlang in the User's Guide for the ERTS application.

    • true - Enable tracing for all received messages (to 'receive' traced processes). Any match specification is removed. This is the default.

    • false - Disable tracing for all received messages. Any match -specification is removed.

    Argument FlagList must be [] for receive tracing.

    The return value is always 1.

    Examples:

    Only trace messages from a specific process Pid:

    > trace:recv(Session, [{['_',Pid, '_'],[],[]}], []).
    -1

    Only trace messages matching {reply, _}:

    > trace:recv(Session, [{['_','_', {reply,'_'}],[],[]}], []).
    -1

    Only trace messages from other nodes:

    > trace:recv(Session, [{['$1', '_', '_'],[{'=/=','$1',{node}}],[]}], []).
    +specification is removed.

    Argument FlagList must be [] for receive tracing.

    The return value is always 1.

    Examples:

    Only trace messages from a specific process Pid:

    > trace:recv(Session, [{['_',Pid, '_'],[],[]}], []).
    +1

    Only trace messages matching {reply, _}:

    > trace:recv(Session, [{['_','_', {reply,'_'}],[],[]}], []).
    +1

    Only trace messages from other nodes:

    > trace:recv(Session, [{['$1', '_', '_'],[{'=/=','$1',{node}}],[]}], []).
     1

    Note

    A match specification for 'receive' trace can use all guard and body functions except caller, is_seq_trace, get_seq_token, set_seq_token, enable_trace, disable_trace, trace, silent, and process_dump.

    Fails by raising an error exception with an error reason of:

    • badarg - If an argument is invalid.

    • system_limit - If a match specification passed as argument has excessive @@ -1258,10 +1258,10 @@ Match Specifications in Erlang in the User's Guide for the ERTS application.

    • true - Enable tracing for all sent messages (from send traced processes). Any match specification is removed.

    • false - Disable tracing for all sent messages. Any match specification -is removed.

    Argument FlagList must be [].

    The return value is always 1.

    Examples:

    Only trace messages to a specific process Pid:

    > trace:send(Session, [{[Pid, '_'],[],[]}], []).
    -1

    Only trace messages matching {reply, _}:

    > trace:send(Session, [{['_', {reply,'_'}],[],[]}], []).
    -1

    Only trace messages sent to the sender itself:

    > trace:send(Session, [{['$1', '_'],[{'=:=','$1',{self}}],[]}], []).
    -1

    Only trace messages sent to other nodes:

    > trace:send(Session, [{['$1', '_'],[{'=/=',{node,'$1'},{node}}],[]}], []).
    +is removed.

    Argument FlagList must be [].

    The return value is always 1.

    Examples:

    Only trace messages to a specific process Pid:

    > trace:send(Session, [{[Pid, '_'],[],[]}], []).
    +1

    Only trace messages matching {reply, _}:

    > trace:send(Session, [{['_', {reply,'_'}],[],[]}], []).
    +1

    Only trace messages sent to the sender itself:

    > trace:send(Session, [{['$1', '_'],[{'=:=','$1',{self}}],[]}], []).
    +1

    Only trace messages sent to other nodes:

    > trace:send(Session, [{['$1', '_'],[{'=/=',{node,'$1'},{node}}],[]}], []).
     1

    Note

    A match specification for send trace can use all guard and body functions except caller.

    Fails by raising an error exception with an error reason of:

    Equivalent to log(Level, FormatOrFun, Args, #{}) if called as log(Level, FormatOrFun, Args).

    @@ -2431,12 +2431,12 @@ useful in scenarios when the message/metadata is very expensive to compute. This is because the fun is only evaluated when the message/metadata is actually needed, which may be not at all if the log event is not to be logged. Examples:

    %% A plain string with expensive metadata
    -1> logger:info(fun([]) -> {"Hello World", #{ meta => expensive() }} end,[]).
    +1> logger:info(fun([]) -> {"Hello World", #{ meta => expensive() }} end,[]).
     %% An expensive report
    -2> logger:debug(fun(What) -> #{ what => What, cause => expensive() } end,roof).
    +2> logger:debug(fun(What) -> #{ what => What, cause => expensive() } end,roof).
     %% A plain string with expensive metadata and normal metadata
    -3> logger:debug(fun([]) -> {"Hello World", #{ meta => expensive() }} end,[],
    -               #{ meta => data }).

    When metadata is given both as an argument and returned from the fun they are +3> logger:debug(fun([]) -> {"Hello World", #{ meta => expensive() }} end,[], + #{ meta => data }).

    When metadata is given both as an argument and returned from the fun they are merged. If equal keys exists the values are taken from the metadata returned by the fun.

    @@ -2759,26 +2759,26 @@ consistent no matter which handler the system uses. Normal usage is to add a call to logger:add_handlers/1 just after the processes that the handler needs are started, and pass the application's logger configuration as the argument. -For example:

    -behaviour(application).
    -start(_, []) ->
    -    case supervisor:start_link({local, my_sup}, my_sup, []) of
    -        {ok, Pid} ->
    -            ok = logger:add_handlers(my_app),
    -            {ok, Pid, []};
    +For example:

    -behaviour(application).
    +start(_, []) ->
    +    case supervisor:start_link({local, my_sup}, my_sup, []) of
    +        {ok, Pid} ->
    +            ok = logger:add_handlers(my_app),
    +            {ok, Pid, []};
             Error -> Error
          end.

    This reads the logger configuration parameter from the my_app application and starts the configured handlers. The contents of the configuration use the same rules as the logger handler configuration.

    If the handler is meant to replace the default handler, the Kernel's default handler have to be disabled before the new handler is added. A sys.config file -that disables the Kernel handler and adds a custom handler could look like this:

    [{kernel,
    -  [{logger,
    +that disables the Kernel handler and adds a custom handler could look like this:

    [{kernel,
    +  [{logger,
         %% Disable the default Kernel handler
    -    [{handler, default, undefined}]}]},
    - {my_app,
    -  [{logger,
    +    [{handler, default, undefined}]}]},
    + {my_app,
    +  [{logger,
         %% Enable this handler as the default
    -    [{handler, default, my_handler, #{}}]}]}].
    +
    [{handler, default, my_handler, #{}}]}]}].
    @@ -3733,8 +3733,8 @@ -

    Update the formatter configuration for the specified handler.

    The new configuration is merged with the existing formatter configuration.

    To overwrite the existing configuration without any merge, use

    set_handler_config(HandlerId, formatter,
    -	      {FormatterModule, FormatterConfig}).
    +

    Update the formatter configuration for the specified handler.

    The new configuration is merged with the existing formatter configuration.

    To overwrite the existing configuration without any merge, use

    set_handler_config(HandlerId, formatter,
    +	      {FormatterModule, FormatterConfig}).
    @@ -3797,8 +3797,8 @@

    Update configuration data for the specified handler. This function behaves as if -it was implemented as follows:

    {ok, {_, Old}} = logger:get_handler_config(HandlerId),
    -logger:set_handler_config(HandlerId, maps:merge(Old, Config)).

    To overwrite the existing configuration without any merge, use +it was implemented as follows:

    {ok, {_, Old}} = logger:get_handler_config(HandlerId),
    +logger:set_handler_config(HandlerId, maps:merge(Old, Config)).

    To overwrite the existing configuration without any merge, use set_handler_config/2 .

    @@ -3891,8 +3891,8 @@

    Update primary configuration data for Logger. This function behaves as if it was -implemented as follows:

    Old = logger:get_primary_config(),
    -logger:set_primary_config(maps:merge(Old, Config)).

    To overwrite the existing configuration without any merge, use +implemented as follows:

    Old = logger:get_primary_config(),
    +logger:set_primary_config(maps:merge(Old, Config)).

    To overwrite the existing configuration without any merge, use set_primary_config/1 .

    @@ -3924,7 +3924,7 @@

    Set or update metadata to use when logging from current process

    If process metadata exists for the current process, this function behaves as if -it was implemented as follows:

    logger:set_process_metadata(maps:merge(logger:get_process_metadata(), Meta)).

    If no process metadata exists, the function behaves as +it was implemented as follows:

    logger:set_process_metadata(maps:merge(logger:get_process_metadata(), Meta)).

    If no process metadata exists, the function behaves as set_process_metadata/1 .

    @@ -3956,8 +3956,8 @@

    Update configuration data for the Logger proxy. This function behaves as if it -was implemented as follows:

    Old = logger:get_proxy_config(),
    -logger:set_proxy_config(maps:merge(Old, Config)).

    To overwrite the existing configuration without any merge, use +was implemented as follows:

    Old = logger:get_proxy_config(),
    +logger:set_proxy_config(maps:merge(Old, Config)).

    To overwrite the existing configuration without any merge, use set_proxy_config/1 .

    For more information about the proxy, see section Logger Proxy in the Kernel User's Guide.

    @@ -4135,7 +4135,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_chapter.html 2025-05-10 20:19:11.081208336 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_chapter.html 2025-05-10 20:19:11.093208444 +0000 @@ -190,7 +190,7 @@

    The API for logging consists of a set of macros, and a set of functions on the form logger:Level/1,2,3, which are all shortcuts for logger:log(Level,Arg1[,Arg2[,Arg3]]).

    The macros are defined in logger.hrl, which is included in a module with the -directive

    -include_lib("kernel/include/logger.hrl").

    The difference between using the macros and the exported functions is that +directive

    -include_lib("kernel/include/logger.hrl").

    The difference between using the macros and the exported functions is that macros add location (originator) information to the metadata, and performs lazy evaluation by wrapping the logger call in a case statement, so it is only evaluated if the log level of the event passes the primary log level check.

    @@ -212,23 +212,23 @@

    The log message contains the information to be logged. The message can consist of a format string and arguments (given as two separate parameters in the Logger -API), a string or a report.

    Example, format string and arguments:

    logger:error("The file does not exist: ~ts",[Filename])

    Example, string:

    logger:notice("Something strange happened!")

    A report, which is either a map or a key-value list, is the preferred way to log +API), a string or a report.

    Example, format string and arguments:

    logger:error("The file does not exist: ~ts",[Filename])

    Example, string:

    logger:notice("Something strange happened!")

    A report, which is either a map or a key-value list, is the preferred way to log using Logger as it makes it possible for different backends to filter and format -the log event as it needs to.

    Example, report:

    ?LOG_ERROR(#{ user => joe, filename => Filename, reason => enoent })

    Reports can be accompanied by a report callback specified in the log event's +the log event as it needs to.

    Example, report:

    ?LOG_ERROR(#{ user => joe, filename => Filename, reason => enoent })

    Reports can be accompanied by a report callback specified in the log event's metadata. The report callback is a convenience function that the formatter can use to convert the report to a format string and arguments, or directly to a string. The formatter can also use its own conversion function, if no callback is provided, or if a customized formatting is desired.

    The report callback must be a fun with one or two arguments. If it takes one argument, this is the report itself, and the fun returns a format string and -arguments:

    fun((logger:report()) -> {io:format(),[term()]})

    If it takes two arguments, the first is the report, and the second is a map -containing extra data that allows direct conversion to a string:

    fun((logger:report(),logger:report_cb_config()) -> unicode:chardata())

    The fun must obey the depth and chars_limit parameters provided in the +arguments:

    fun((logger:report()) -> {io:format(),[term()]})

    If it takes two arguments, the first is the report, and the second is a map +containing extra data that allows direct conversion to a string:

    fun((logger:report(),logger:report_cb_config()) -> unicode:chardata())

    The fun must obey the depth and chars_limit parameters provided in the second argument, as the formatter cannot do anything useful of these parameters with the returned string. The extra data also contains a field named single_line, indicating if the printed log message may contain line breaks or not. This variant is used when the formatting of the report depends on the size -or single line parameters.

    Example, report, and metadata with report callback:

    logger:debug(#{got => connection_request, id => Id, state => State},
    -             #{report_cb => fun(R) -> {"~p",[R]} end})

    The log message can also be provided through a fun for lazy evaluation. The fun +or single line parameters.

    Example, report, and metadata with report callback:

    logger:debug(#{got => connection_request, id => Id, state => State},
    +             #{report_cb => fun(R) -> {"~p",[R]} end})

    The log message can also be provided through a fun for lazy evaluation. The fun is only evaluated if the primary log level check passes, and is therefore recommended if it is expensive to generate the message. The lazy fun must return a string, a report, or a tuple with format string and arguments.

    @@ -416,14 +416,14 @@ allows another application to add its own default handler.

    Only one entry of this type is allowed.

  • {handler, HandlerId, Module, HandlerConfig} - If HandlerId is default, then this entry modifies the default handler, equivalent to calling

            logger:remove_handler(default)
    -

    followed by

            logger:add_handler(default, Module, HandlerConfig)
    +

    followed by

            logger:add_handler(default, Module, HandlerConfig)
     

    For all other values of HandlerId, this entry adds a new handler, -equivalent to calling

            logger:add_handler(HandlerId, Module, HandlerConfig)
    +equivalent to calling

            logger:add_handler(HandlerId, Module, HandlerConfig)
     

    Multiple entries of this type are allowed.

  • {filters, FilterDefault, [Filter]} - Adds the specified primary -filters.

    • FilterDefault = log | stop

    • Filter = {FilterId, {FilterFun, FilterConfig}}

    Equivalent to calling

            logger:add_primary_filter(FilterId, {FilterFun, FilterConfig})
    +filters.

    • FilterDefault = log | stop

    • Filter = {FilterId, {FilterFun, FilterConfig}}

    Equivalent to calling

            logger:add_primary_filter(FilterId, {FilterFun, FilterConfig})
     

    for each Filter.

    FilterDefault specifies the behaviour if all primary filters return ignore, see section Filters.

    Only one entry of this type is allowed.

  • {module_level, Level, [Module]} - Sets module log level for the given -modules. Equivalent to calling

            logger:set_module_level(Module, Level)

    for each Module.

    Multiple entries of this type are allowed.

  • {proxy, ProxyConfig} - Sets the proxy configuration, equivalent to +modules. Equivalent to calling

            logger:set_module_level(Module, Level)

    for each Module.

    Multiple entries of this type are allowed.

  • {proxy, ProxyConfig} - Sets the proxy configuration, equivalent to calling

            logger:set_proxy_config(ProxyConfig)
     

    Only one entry of this type is allowed.

  • See section Configuration Examples for examples using the logger parameter for system configuration.

  • logger_metadata = map() - Specifies the primary @@ -446,31 +446,31 @@ file. See the config(4) manual page for more information about this file.

    Each of the following examples shows a simple system configuration file that configures Logger according to the description.

    Modify the default handler to print to a file instead of -standard_io:

    [{kernel,
    -  [{logger,
    -    [{handler, default, logger_std_h,  % {handler, HandlerId, Module,
    -      #{config => #{file => "log/erlang.log"}}}  % Config}
    -    ]}]}].

    Modify the default handler to print each log event as a single line:

    [{kernel,
    -  [{logger,
    -    [{handler, default, logger_std_h,
    -      #{formatter => {logger_formatter, #{single_line => true}}}}
    -    ]}]}].

    Modify the default handler to print the pid of the logging process for each log -event:

    [{kernel,
    -  [{logger,
    -    [{handler, default, logger_std_h,
    -      #{formatter => {logger_formatter,
    -                        #{template => [time," ",pid," ",msg,"\n"]}}}}
    -    ]}]}].

    Modify the default handler to only print errors and more severe log events to +standard_io:

    [{kernel,
    +  [{logger,
    +    [{handler, default, logger_std_h,  % {handler, HandlerId, Module,
    +      #{config => #{file => "log/erlang.log"}}}  % Config}
    +    ]}]}].

    Modify the default handler to print each log event as a single line:

    [{kernel,
    +  [{logger,
    +    [{handler, default, logger_std_h,
    +      #{formatter => {logger_formatter, #{single_line => true}}}}
    +    ]}]}].

    Modify the default handler to print the pid of the logging process for each log +event:

    [{kernel,
    +  [{logger,
    +    [{handler, default, logger_std_h,
    +      #{formatter => {logger_formatter,
    +                        #{template => [time," ",pid," ",msg,"\n"]}}}}
    +    ]}]}].

    Modify the default handler to only print errors and more severe log events to "log/erlang.log", and add another handler to print all log events to -"log/debug.log".

    [{kernel,
    -  [{logger,
    -    [{handler, default, logger_std_h,
    -      #{level => error,
    -        config => #{file => "log/erlang.log"}}},
    -     {handler, info, logger_std_h,
    -      #{level => debug,
    -        config => #{file => "log/debug.log"}}}
    -    ]}]}].

    +"log/debug.log".

    [{kernel,
    +  [{logger,
    +    [{handler, default, logger_std_h,
    +      #{level => error,
    +        config => #{file => "log/erlang.log"}}},
    +     {handler, info, logger_std_h,
    +      #{level => debug,
    +        config => #{file => "log/debug.log"}}}
    +    ]}]}].

    @@ -511,9 +511,9 @@ This field can be used by filters to stop or allow the log events.

    See section SASL User's Guide for more information about the old SASL error logging functionality.

  • Legacy Event Handlers
    To use event handlers written for error_logger, just add your event handler with

    error_logger:add_report_handler/1,2.

    This automatically starts the error logger event manager, and adds -error_logger as a handler to Logger, with the following configuration:

    #href_anchor"ss">level => info,
    +error_logger as a handler to Logger, with the following configuration:

    #href_anchor"ss">level => info,
       filter_default => log,
    -  filters => []}.

    Note

    This handler ignores events that do not originate from the error_logger + filters => []}.

    Note

    This handler ignores events that do not originate from the error_logger API, or from within OTP. This means that if your code uses the Logger API for logging, then your log events will be discarded by this handler.

    The handler is not overload protected.

  • @@ -539,19 +539,19 @@ level notice or more severe, are logged to the terminal via the default handler. To also log info events, you can either change the primary log level to info:

    1> logger:set_primary_config(level, info).
    -ok

    or set the level for one or a few modules only:

    2> logger:set_module_level(mymodule, info).
    +ok

    or set the level for one or a few modules only:

    2> logger:set_module_level(mymodule, info).
     ok

    This allows info events to pass through to the default handler, and be printed to the terminal as well. If there are many info events, it can be useful to print these to a file instead.

    First, set the log level of the default handler to notice, preventing it from -printing info events to the terminal:

    3> logger:set_handler_config(default, level, notice).
    +printing info events to the terminal:

    3> logger:set_handler_config(default, level, notice).
     ok

    Then, add a new handler which prints to file. You can use the handler module -logger_std_h, and configure it to log to file:

    4> Config = #href_anchor"ss">config => #{file => "./info.log"}, level => info}.
    -#{config => #{file => "./info.log"},level => info}
    -5> logger:add_handler(myhandler, logger_std_h, Config).
    +logger_std_h, and configure it to log to file:

    4> Config = #href_anchor"ss">config => #{file => "./info.log"}, level => info}.
    +#{config => #{file => "./info.log"},level => info}
    +5> logger:add_handler(myhandler, logger_std_h, Config).
     ok

    Since filter_default defaults to log, this handler now receives all log events. If you want info events only in the file, you must add a filter to stop -all non-info events. The built-in filter logger_filters:level/2 can do this:

    6> logger:add_handler_filter(myhandler, stop_non_info,
    -                             {fun logger_filters:level/2, {stop, neq, info}}).
    +all non-info events. The built-in filter logger_filters:level/2 can do this:

    6> logger:add_handler_filter(myhandler, stop_non_info,
    +                             {fun logger_filters:level/2, {stop, neq, info}}).
     ok

    See section Filters for more information about the filters and the filter_default configuration parameter.

    @@ -576,48 +576,48 @@ database.

    When logger:get_config/0 or logger:get_handler_config/0,1 is called, Logger calls HModule:filter_config(Config). This function must return the -handler configuration where internal data is removed.

    A simple handler that prints to the terminal can be implemented as follows:

    -module(myhandler1).
    --export([log/2]).
    +handler configuration where internal data is removed.

    A simple handler that prints to the terminal can be implemented as follows:

    -module(myhandler1).
    +-export([log/2]).
     
    -log(LogEvent, #{formatter := {FModule, FConfig}}) ->
    -    io:put_chars(FModule:format(LogEvent, FConfig)).

    Notice that the above handler does not have any overload protection, and all log +log(LogEvent, #{formatter := {FModule, FConfig}}) -> + io:put_chars(FModule:format(LogEvent, FConfig)).

    Notice that the above handler does not have any overload protection, and all log events are printed directly from the client process.

    For information and examples of overload protection, please refer to section Protecting the Handler from Overload, and the implementation of logger_std_h and logger_disk_log_h .

    The following is a simpler example of a handler which logs to a file through one -single process:

    -module(myhandler2).
    --export([adding_handler/1, removing_handler/1, log/2]).
    --export([init/1, handle_call/3, handle_cast/2, terminate/2]).
    -
    -adding_handler(Config) ->
    -    MyConfig = maps:get(config,Config,#href_anchor"ss">file => "myhandler2.log"}),
    -    {ok, Pid} = gen_server:start(?MODULE, MyConfig, []),
    -    {ok, Config#{config => MyConfig#{pid => Pid}}}.
    -
    -removing_handler(#{config := #{pid := Pid}}) ->
    -    gen_server:stop(Pid).
    -
    -log(LogEvent,#{config := #{pid := Pid}} = Config) ->
    -    gen_server:cast(Pid, {log, LogEvent, Config}).
    -
    -init(#{file := File}) ->
    -    {ok, Fd} = file:open(File, [append, {encoding, utf8}]),
    -    {ok, #{file => File, fd => Fd}}.
    -
    -handle_call(_, _, State) ->
    -    {reply, {error, bad_request}, State}.
    -
    -handle_cast({log, LogEvent, Config}, #{fd := Fd} = State) ->
    -    do_log(Fd, LogEvent, Config),
    -    {noreply, State}.
    +single process:

    -module(myhandler2).
    +-export([adding_handler/1, removing_handler/1, log/2]).
    +-export([init/1, handle_call/3, handle_cast/2, terminate/2]).
    /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_cookbook.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_cookbook.html	2025-05-10 20:19:11.121208698 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_cookbook.html	2025-05-10 20:19:11.129208770 +0000
    @@ -144,19 +144,19 @@
       
       Print the primary Logger configurations.
     

    -
    1> logger:i(primary).
    +
    1> logger:i(primary).
     Primary configuration:
         Level: notice
         Filter Default: log
         Filters:
    -        (none)

    It is also possible to fetch the configuration using + (none)

    It is also possible to fetch the configuration using logger:get_primary_config().

    See also

    -
    2> logger:i(handlers).
    +
    2> logger:i(handlers).
     Handler configuration:
         Id: default
             Module: logger_std_h
    @@ -173,10 +173,10 @@
                     Arg: stop
                 Id: domain
                     Fun: fun logger_filters:domain/2
    -                Arg: {log,super,[otp,sasl]}
    +                Arg: {log,super,[otp,sasl]}
                 Id: no_domain
                     Fun: fun logger_filters:domain/2
    -                Arg: {log,undefined,[]}
    +                Arg: {log,undefined,[]}
             Handler Config:
                 burst_limit_enable: true
                 burst_limit_max_count: 500
    @@ -215,7 +215,7 @@
     =PROGRESS REPORT==== 4-Nov-2019::16:33:11.746546 ===
         application: stdlib
         started_at: nonode@nohost
    -Eshell V10.5.3  (abort with ^G)
    +Eshell V10.5.3  (abort with ^G)
     1>

    @@ -233,17 +233,17 @@

    Since single line logging is the default of the built-in formatter you only have to provide the empty map as the configuration. The example below uses the sys.config to change the formatter configuration.

    $ cat sys.config
    -[{kernel,
    -  [{logger,
    -    [{handler, default, logger_std_h,
    -      #{ formatter => {logger_formatter, #{ }}}}]}]}].
    +[{kernel,
    +  [{logger,
    +    [{handler, default, logger_std_h,
    +      #{ formatter => {logger_formatter, #{ }}}}]}]}].
     $ erl -config sys
    -Eshell V10.5.1  (abort with ^G)
    -1> logger:error("Oh noes, an error").
    +Eshell V10.5.1  (abort with ^G)
    +1> logger:error("Oh noes, an error").
     1962-10-03T11:07:47.466763-04:00 error: Oh noes, an error

    However, if you just want to change it for the current session you can also do -that.

    1> logger:set_handler_config(default, formatter, {logger_formatter, #{}}).
    +that.

    1> logger:set_handler_config(default, formatter, {logger_formatter, #{}}).
     ok
    -2> logger:error("Oh noes, another error").
    +2> logger:error("Oh noes, another error").
     1962-10-04T15:34:02.648713-04:00 error: Oh noes, another error

    See also

    @@ -251,14 +251,14 @@ Add file and line number to log entries

    You can change what is printed to the log by using the formatter template:

    $ cat sys.config
    -[{kernel,
    -  [{logger,
    -    [{handler, default, logger_std_h,
    -      #{ formatter => {logger_formatter,
    -        #{ template => [time," ", file,":",line," ",level,": ",msg,"\n"] }}}}]}]}].
    +[{kernel,
    +  [{logger,
    +    [{handler, default, logger_std_h,
    +      #{ formatter => {logger_formatter,
    +        #{ template => [time," ", file,":",line," ",level,": ",msg,"\n"] }}}}]}]}].
     $ erl -config sys
    -Eshell V10.5.1  (abort with ^G)
    -1> logger:error("Oh noes, more errors",#{ file => "shell.erl", line => 1 }).
    +Eshell V10.5.1  (abort with ^G)
    +1> logger:error("Oh noes, more errors",#{ file => "shell.erl", line => 1 }).
     1962-10-05T07:37:44.104241+02:00 shell.erl:1 error: Oh noes, more errors

    Note that file and line have to be added in the metadata by the caller of logger:log/3 as otherwise Logger will not know from where it was called. The file and line number are automatically added if you use the ?LOG_ERROR macros @@ -275,18 +275,18 @@ Print logs to a file

    Instead of printing the logs to stdout we print them to a rotating file log.

    $ cat sys.config
    -[{kernel,
    -  [{logger,
    -    [{handler, default, logger_std_h,
    -      #{ config => #{ file => "log/erlang.log",
    +[{kernel,
    +  [{logger,
    +    [{handler, default, logger_std_h,
    +      #{ config => #{ file => "log/erlang.log",
                           max_no_bytes => 4096,
    -                      max_no_files => 5},
    -         formatter => {logger_formatter, #{}}}}]}]}].
    +                      max_no_files => 5},
    +         formatter => {logger_formatter, #{}}}}]}]}].
     $ erl -config sys
    -Eshell V10.5.1  (abort with ^G)
    -1> logger:error("Oh noes, even more errors").
    +Eshell V10.5.1  (abort with ^G)
    +1> logger:error("Oh noes, even more errors").
     ok
    -2> erlang:halt().
    +2> erlang:halt().
     $ cat log/erlang.log
     2019-10-07T11:47:16.837958+02:00 error: Oh noes, even more errors

    See also

    @@ -296,24 +296,24 @@

    Add a handler that prints debug log events to a file, while the default handler prints only up to notice level events to standard out.

    $ cat sys.config
    -[{kernel,
    -  [{logger_level, all},
    -   {logger,
    -    [{handler, default, logger_std_h,
    -      #{ level => notice }},
    -     {handler, debug, logger_std_h,
    -      #{ filters => [{debug,{fun logger_filters:level/2, {stop, neq, debug}}}],
    -         config => #{ file => "log/debug.log" } }}
    -    ]}]}].
    +[{kernel,
    +  [{logger_level, all},
    +   {logger,
    +    [{handler, default, logger_std_h,
    +      #{ level => notice }},
    +     {handler, debug, logger_std_h,
    +      #{ filters => [{debug,{fun logger_filters:level/2, {stop, neq, debug}}}],
    +         config => #{ file => "log/debug.log" } }}
    +    ]}]}].
     $ erl -config sys
    -Eshell V10.5.1  (abort with ^G)
    -1> logger:error("Oh noes, even more errors").
    +Eshell V10.5.1  (abort with ^G)
    +1> logger:error("Oh noes, even more errors").
     =ERROR REPORT==== 9-Oct-2019::14:40:54.784162 ===
     Oh noes, even more errors
     ok
    -2> logger:debug("A debug event").
    +2> logger:debug("A debug event").
     ok
    -3> erlang:halt().
    +3> erlang:halt().
     $ cat log/debug.log
     2019-10-09T14:41:03.680541+02:00 debug: A debug event

    In the configuration above we first raise the primary log level to max in order for the debug log events to get to the handlers. Then we configure the default @@ -321,13 +321,13 @@ is all. Then the debug handler is configured with a filter to stop any log message that is not a debug level message.

    It is also possible to do the same changes in an already running system using the logger module. Then you do like this:

    $ erl
    -1> logger:set_handler_config(default, level, notice).
    +1> logger:set_handler_config(default, level, notice).
     ok
    -2> logger:add_handler(debug, logger_std_h, #{
    -  filters => [{debug,{fun logger_filters:level/2, {stop, neq, debug}}}],
    -  config => #{ file => "log/debug.log" } }).
    +2> logger:add_handler(debug, logger_std_h, #{
    +  filters => [{debug,{fun logger_filters:level/2, {stop, neq, debug}}}],
    +  config => #{ file => "log/debug.log" } }).
     ok
    -3> logger:set_primary_config(level, all).
    +3> logger:set_primary_config(level, all).
     ok

    It is important that you do not raise the primary log level before adjusting the default handler's level as otherwise your standard out may be flooded by debug log messages.

    See also

    @@ -343,7 +343,7 @@ What to log and how

    The simplest way to log something is by using the Logger macros and give a -report to the macro. For example if you want to log an error:

    ?LOG_ERROR(#{ what => http_error, status => 418, src => ClientIP, dst => ServerIP }).

    This will print the following in the default log:

    =ERROR REPORT==== 10-Oct-2019::12:13:10.089073 ===
    +report to the macro. For example if you want to log an error:

    ?LOG_ERROR(#{ what => http_error, status => 418, src => ClientIP, dst => ServerIP }).

    This will print the following in the default log:

    =ERROR REPORT==== 10-Oct-2019::12:13:10.089073 ===
         dst: {8,8,4,4}
         src: {8,8,8,8}
         status: 418
    @@ -355,14 +355,14 @@
     

    If you want to do structured logging, but still want to have some control of how the final log message is formatted you can give a report_cb as part of the -metadata with your log event.

    ReportCB = fun(#{ what := What, status := Status, src := Src, dst := Dst }) ->
    -                   {ok, #hostent{ h_name = SrcName }} = inet:gethostbyaddr(Src),
    -                   {ok, #hostent{ h_name = DstName }} = inet:gethostbyaddr(Dst),
    -                   {"What: ~p~nStatus: ~p~nSrc: ~s (~s)~nDst: ~s (~s)~n",
    -                    [What, Status, inet:ntoa(Src), SrcName, inet:ntoa(Dst), DstName]}
    +metadata with your log event.

    ReportCB = fun(#{ what := What, status := Status, src := Src, dst := Dst }) ->
    +                   {ok, #hostent{ h_name = SrcName }} = inet:gethostbyaddr(Src),
    /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_disk_log_h.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_disk_log_h.html	2025-05-10 20:19:11.149208952 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_disk_log_h.html	2025-05-10 20:19:11.153208988 +0000
    @@ -164,12 +164,12 @@
     and the disk_log handler, and are documented in the
     User's Guide.

    Notice that when changing the configuration of the handler in runtime, the disk_log options (file, type, max_no_files, max_no_bytes) must not be -modified.

    Example of adding a disk_log handler:

    logger:add_handler(my_disk_log_h, logger_disk_log_h,
    -                   #{config => #{file => "./my_disk_log",
    +modified.

    Example of adding a disk_log handler:

    logger:add_handler(my_disk_log_h, logger_disk_log_h,
    +                   #{config => #{file => "./my_disk_log",
                                      type => wrap,
                                      max_no_files => 4,
                                      max_no_bytes => 10000,
    -                                 filesync_repeat_interval => 1000}}).

    To use the disk_log handler instead of the default standard handler when + filesync_repeat_interval => 1000}}).

    To use the disk_log handler instead of the default standard handler when starting an Erlang node, change the Kernel default logger to use logger_disk_log_h. Example:

    erl -kernel logger '[{handler,default,logger_disk_log_h,
                           #{config => #{file => "./system_disk_log"}}}]'

    @@ -275,7 +275,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_filters.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_filters.html 2025-05-10 20:19:11.173209170 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_filters.html 2025-05-10 20:19:11.181209242 +0000 @@ -251,8 +251,8 @@ events from, for example, a specific functional area. This allows filtering or other specialized treatment in a Logger handler.

    A domain field must be a list of atoms, creating smaller and more specialized domains as the list grows longer. The greatest domain is [], which comprises -all possible domains.

    For example, consider the following domains:

    D1 = [otp]
    -D2 = [otp, sasl]

    D1 is the greatest of the two, and is said to be a super-domain of D2. D2 +all possible domains.

    For example, consider the following domains:

    D1 = [otp]
    +D2 = [otp, sasl]

    D1 is the greatest of the two, and is said to be a super-domain of D2. D2 is a sub-domain D1. Both D1 and D2 are sub-domains of [].

    The above domains are used for logs originating from Erlang/OTP. D1 specifies that the log event comes from Erlang/OTP in general, and D2 indicates that the log event is a so called SASL report.

    The Extra parameter to the domain/2 function is specified when @@ -267,11 +267,11 @@ filter matches and Action is stop, the log event is stopped.

    If the filter does not match, it returns ignore, meaning that other filters, or the value of the configuration parameter filter_default, decide if the event is allowed or not.

    Log events that do not contain any domain field, match only when Compare is -equal to undefined or not_equal.

    Example: stop all events with domain [otp, sasl | _]

    1> logger:set_handler_config(h1, filter_default, log). % this is the default
    +equal to undefined or not_equal.

    Example: stop all events with domain [otp, sasl | _]

    1> logger:set_handler_config(h1, filter_default, log). % this is the default
     ok
    -2> Filter = {fun logger_filters:domain/2, {stop, sub, [otp, sasl]}}.
    +2> Filter = {fun logger_filters:domain/2, {stop, sub, [otp, sasl]}}.
     ...
    -3> logger:add_handler_filter(h1, no_sasl, Filter).
    +3> logger:add_handler_filter(h1, no_sasl, Filter).
     ok
    @@ -316,9 +316,9 @@ filter matches if the value of Operator is:

    • neq - and the compare function returns lt or gt.

    • eq - and the compare function returns eq.

    • lt - and the compare function returns lt.

    • gt - and the compare function returns gt.

    • lteq - and the compare function returns lt or eq.

    • gteq - and the compare function returns gt or eq.

    If the filter matches and Action is log, the log event is allowed. If the filter matches and Action is stop, the log event is stopped.

    If the filter does not match, it returns ignore, meaning that other filters, or the value of the configuration parameter filter_default, will decide if the -event is allowed or not.

    Example: only allow debug level log events

    logger:set_handler_config(h1, filter_default, stop).
    -Filter = {fun logger_filters:level/2, {log, eq, debug}}.
    -logger:add_handler_filter(h1, debug_only, Filter).
    +event is allowed or not.

    Example: only allow debug level log events

    logger:set_handler_config(h1, filter_default, stop).
    +Filter = {fun logger_filters:level/2, {log, eq, debug}}.
    +logger:add_handler_filter(h1, debug_only, Filter).
     ok
    @@ -414,7 +414,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_formatter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_formatter.html 2025-05-10 20:19:11.209209496 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_formatter.html 2025-05-10 20:19:11.213209532 +0000 @@ -625,7 +625,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_handler.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_handler.html 2025-05-10 20:19:11.237209750 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_handler.html 2025-05-10 20:19:11.241209786 +0000 @@ -600,7 +600,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_std_h.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_std_h.html 2025-05-10 20:19:11.265210004 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/logger_std_h.html 2025-05-10 20:19:11.269210040 +0000 @@ -185,9 +185,9 @@ protection behaviour. The same parameters are used both in the standard handler and the disk_log handler, and are documented in the User's Guide.

    Notice that if changing the configuration of the handler in runtime, the type, -file, or modes parameters must not be modified.

    Example of adding a standard handler:

    logger:add_handler(my_standard_h, logger_std_h,
    -                   #{config => #{file => "./system_info.log",
    -                                 filesync_repeat_interval => 1000}}).

    To set the default handler, that starts initially with the Kernel application, +file, or modes parameters must not be modified.

    Example of adding a standard handler:

    logger:add_handler(my_standard_h, logger_std_h,
    +                   #{config => #{file => "./system_info.log",
    +                                 filesync_repeat_interval => 1000}}).

    To set the default handler, that starts initially with the Kernel application, to log to file instead of standard_io, change the Kernel default logger configuration. Example:

    erl -kernel logger '[{handler,default,logger_std_h,
                           #{config => #{file => "./log.log"}}}]'

    An example of how to replace the standard handler with a disk_log handler at @@ -294,7 +294,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/net.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/net.html 2025-05-10 20:19:11.297210294 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/net.html 2025-05-10 20:19:11.305210367 +0000 @@ -565,13 +565,13 @@

    Interface address filtering selector function/0.

    For each ifaddrs entry, return either true to keep the entry or false to discard the entry.

    For example, to get an interface list which only contains -non-loopback inet interfaces:

    net:getifaddrs(
    -    fun (#{ addr  := #{family := inet},
    -            flags := Flags}) ->
    -          not lists:member(loopback, Flags);
    -        (_) ->
    +non-loopback inet interfaces:

    net:getifaddrs(
    +    fun (#{ addr  := #{family := inet},
    +            flags := Flags}) ->
    +          not lists:member(loopback, Flags);
    +        (_) ->
               false
    -    end).
    +
    end).
    @@ -1410,7 +1410,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/net_adm.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/net_adm.html 2025-05-10 20:19:11.333210621 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/net_adm.html 2025-05-10 20:19:11.337210657 +0000 @@ -491,8 +491,8 @@

    Returns the names and associated port numbers of the Erlang nodes that epmd -registered at the specified host.

    Similar to epmd -names, see erts:epmd.

    Returns {error, address} if epmd is not operational.

    Example:

    (arne@dunn)1> net_adm:names().
    -{ok,[{"arne",40262}]}
    +registered at the specified host.

    Similar to epmd -names, see erts:epmd.

    Returns {error, address} if epmd is not operational.

    Example:

    (arne@dunn)1> net_adm:names().
    +{ok,[{"arne",40262}]}
    @@ -668,7 +668,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/net_kernel.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/net_kernel.html 2025-05-10 20:19:11.369210947 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/net_kernel.html 2025-05-10 20:19:11.377211019 +0000 @@ -132,9 +132,9 @@ operational for distributed Erlang to work. The purpose of this process is to implement parts of the BIFs spawn/4 and spawn_link/4, and to provide monitoring of the network.

    An Erlang node is started using command-line flag -name or -sname:

    $ erl -sname foobar

    It is also possible to call net_kernel:start(foobar, #{}) -directly from the normal Erlang shell prompt:

    1> net_kernel:start(foobar, #{name_domain => shortnames}).
    -{ok,<0.64.0>}
    -(foobar@gringotts)2>

    If the node is started with command-line flag -sname, the node name is +directly from the normal Erlang shell prompt:

    1> net_kernel:start(foobar, #{name_domain => shortnames}).
    +{ok,<0.64.0>}
    +(foobar@gringotts)2>

    If the node is started with command-line flag -sname, the node name is foobar@Host, where Host is the short name of the host (not the fully qualified domain name). If started with flag -name, the node name is foobar@Host, where Host is the fully qualified domain name. For more @@ -668,13 +668,13 @@ delivered before a nodeup message due to a new connection to the same node. Prior to OTP 23.0, this was not guaranteed to be the case.

    The format of the node status change messages depends on Options. If Options is the empty list or if net_kernel:monitor_nodes/1 is called, the format is as -follows:

    {nodeup, Node} | {nodedown, Node}
    -  Node = node()

    When Options is the empty map or empty list, the caller will only subscribe +follows:

    {nodeup, Node} | {nodedown, Node}
    +  Node = node()

    When Options is the empty map or empty list, the caller will only subscribe for status change messages for visible nodes. That is, only nodes that appear in the result of erlang:nodes/0.

    If Options equals anything other than the empty list, the format of the status -change messages is as follows:

    {nodeup, Node, Info} | {nodedown, Node, Info}
    -  Node = node()
    -  Info = #{Tag => Val} | [{Tag, Val}]

    Info is either a map or a list of 2-tuples. Its content depends on Options. +change messages is as follows:

    {nodeup, Node, Info} | {nodedown, Node, Info}
    +  Node = node()
    +  Info = #{Tag => Val} | [{Tag, Val}]

    Info is either a map or a list of 2-tuples. Its content depends on Options. If Options is a map, Info will also be a map. If Options is a list, Info will also be a list.

    When Options is a map, currently the following associations are allowed:

    • connection_id => boolean() - If the value of the association equals true, a connection_id => ConnectionId association will be included in the @@ -708,23 +708,23 @@ {node_type, visible} tuple will be included in the Info list.

    • nodedown_reason - The tuple {nodedown_reason, Reason} will be included in the Info list for nodedown messages.

      See the documentation of the nodedown_reason => boolean() association -above for information about possible Reason values.

    Example:

    (a@localhost)1> net_kernel:monitor_nodes(true, #{connection_id=>true, node_type=>all, nodedown_reason=>true}).
    +above for information about possible Reason values.

    Example:

    (a@localhost)1> net_kernel:monitor_nodes(true, #{connection_id=>true, node_type=>all, nodedown_reason=>true}).
     ok
    -(a@localhost)2> flush().
    -Shell got {nodeup,b@localhost,
    -                  #{connection_id => 3067552,node_type => visible}}
    -Shell got {nodeup,c@localhost,
    -                  #{connection_id => 13892107,node_type => hidden}}
    -Shell got {nodedown,b@localhost,
    -                    #{connection_id => 3067552,node_type => visible,
    -                      nodedown_reason => connection_closed}}
    -Shell got {nodedown,c@localhost,
    -                    #{connection_id => 13892107,node_type => hidden,
    -                      nodedown_reason => net_tick_timeout}}
    -Shell got {nodeup,b@localhost,
    -                  #{connection_id => 3067553,node_type => visible}}
    +(a@localhost)2> flush().
    +Shell got {nodeup,b@localhost,
    +                  #{connection_id => 3067552,node_type => visible}}
    +Shell got {nodeup,c@localhost,
    +                  #{connection_id => 13892107,node_type => hidden}}
    +Shell got {nodedown,b@localhost,
    +                    #{connection_id => 3067552,node_type => visible,
    +                      nodedown_reason => connection_closed}}
    +Shell got {nodedown,c@localhost,
    +                    #{connection_id => 13892107,node_type => hidden,
    +                      nodedown_reason => net_tick_timeout}}
    +Shell got {nodeup,b@localhost,
    +                  #{connection_id => 3067553,node_type => visible}}
     ok
    -(a@localhost)3>
    +
    (a@localhost)3>
    @@ -1014,7 +1014,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/notes.html 2025-05-10 20:19:11.457211745 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/notes.html 2025-05-10 20:19:11.493212071 +0000 @@ -4124,12 +4124,12 @@ viewed as two operations performed atomically. Asynchronously send an unlink signal or a demonitor signal, and ignore any future results of the link or monitor.

    NOTE: This change can cause some obscure code to fail which previously did -not. For example, the following code might hang:

                Mon = erlang:monitor(process, Pid),
    +not. For example, the following code might hang:

                Mon = erlang:monitor(process, Pid),
                 %% ...
    -            exit(Pid, bang),
    -            erlang:demonitor(Mon),
    +            exit(Pid, bang),
    +            erlang:demonitor(Mon),
                 receive
    -                {'DOWN', Mon, process, Pid, _} -> ok
    +                {'DOWN', Mon, process, Pid, _} -> ok
                 %% We were previously guaranteed to get a down message
                 %% (since we exited the process ourself), so we could
                 %% in this case leave out:
    @@ -4556,7 +4556,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/os.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/os.html 2025-05-10 20:19:11.529212397 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/os.html 2025-05-10 20:19:11.537212470 +0000 @@ -658,13 +658,13 @@

    Executes Command in a command shell of the target OS, captures the standard output and standard error of the command, and returns this result as a string.

    The command shell can be set using the kernel configuration parameter, by default the -shell is detected upon system startup.

    Examples:

    LsOut = os:cmd("ls"), % on unix platform
    -DirOut = os:cmd("dir"), % on Win32 platform

    Notice that in some cases, standard output of a command when called from another +shell is detected upon system startup.

    Examples:

    LsOut = os:cmd("ls"), % on unix platform
    +DirOut = os:cmd("dir"), % on Win32 platform

    Notice that in some cases, standard output of a command when called from another program can differ, compared with the standard output of the command when called directly from an OS command shell.

    The possible options are:

    • max_size - The maximum size of the data returned by the os:cmd call. This option is a safety feature that should be used when the command executed -can return a very large, possibly infinite, result.

      > os:cmd("cat /dev/zero", #{ max_size => 20 }).
      -[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
    +can return a very large, possibly infinite, result.

    > os:cmd("cat /dev/zero", #{ max_size => 20 }).
    +[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
    @@ -954,7 +954,7 @@ resolution timestamp.

    This counter is read directly from the hardware or operating system with the same guarantees. This means that two consecutive calls to the function are not guaranteed to be monotonic, though it most likely will be. The performance -counter will be converted to the resolution passed as an argument.

    1> T1 = os:perf_counter(1000),receive after 10000 -> ok end,T2 = os:perf_counter(1000).
    +counter will be converted to the resolution passed as an argument.

    1> T1 = os:perf_counter(1000),receive after 10000 -> ok end,T2 = os:perf_counter(1000).
     176525861
     2> T2 - T1.
     10004
    @@ -1125,16 +1125,16 @@ allows you to log time stamps in high resolution and consistent with the time in the rest of the OS.

    Example of code formatting a string in format "DD Mon YYYY HH:MM:SS.mmmmmm", where DD is the day of month, Mon is the textual month name, YYYY is the year, -HH:MM:SS is the time, and mmmmmm is the microseconds in six positions:

    -module(print_time).
    --export([format_utc_timestamp/0]).
    -format_utc_timestamp() ->
    -    TS = {_,_,Micro} = os:timestamp(),
    -    {{Year,Month,Day},{Hour,Minute,Second}} =
    -calendar:now_to_universal_time(TS),
    -    Mstr = element(Month,{"Jan","Feb","Mar","Apr","May","Jun","Jul",
    -    "Aug","Sep","Oct","Nov","Dec"}),
    -    io_lib:format("~2w ~s ~4w ~2w:~2..0w:~2..0w.~6..0w",
    -    [Day,Mstr,Year,Hour,Minute,Second,Micro]).

    This module can be used as follows:

    1> io:format("~s~n",[print_time:format_utc_timestamp()]).
    +HH:MM:SS is the time, and mmmmmm is the microseconds in six positions:

    -module(print_time).
    +-export([format_utc_timestamp/0]).
    +format_utc_timestamp() ->
    +    TS = {_,_,Micro} = os:timestamp(),
    +    {{Year,Month,Day},{Hour,Minute,Second}} =
    +calendar:now_to_universal_time(TS),
    +    Mstr = element(Month,{"Jan","Feb","Mar","Apr","May","Jun","Jul",
    +    "Aug","Sep","Oct","Nov","Dec"}),
    +    io_lib:format("~2w ~s ~4w ~2w:~2..0w:~2..0w.~6..0w",
    +    [Day,Mstr,Year,Hour,Minute,Second,Micro]).

    This module can be used as follows:

    1> io:format("~s~n",[print_time:format_utc_timestamp()]).
     29 Apr 2009  9:55:30.051711

    OS system time can also be retrieved by system_time/0 and system_time/1.

    @@ -1262,7 +1262,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/pg.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/pg.html 2025-05-10 20:19:11.565212724 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/pg.html 2025-05-10 20:19:11.573212796 +0000 @@ -870,7 +870,7 @@

    Subscribes the caller to updates from the specified scope.

    Returns content of the entire scope and a reference to match the upcoming notifications.

    Whenever any group membership changes, an update message is sent to the -subscriber:

    {Ref, join, Group, [JoinPid1, JoinPid2]}
    {Ref, leave, Group, [LeavePid1]}
    +subscriber:

    {Ref, join, Group, [JoinPid1, JoinPid2]}
    {Ref, leave, Group, [LeavePid1]}
    @@ -1051,7 +1051,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/rpc.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/rpc.html 2025-05-10 20:19:11.605213086 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/rpc.html 2025-05-10 20:19:11.617213194 +0000 @@ -1079,10 +1079,10 @@ return values, or {badrpc, Reason} for failing calls. Timeout is a time (integer) in milliseconds, or infinity.

    The following example is useful when new object code is to be loaded on all nodes in the network, and indicates some side effects that RPCs can produce:

    %% Find object code for module Mod
    -{Mod, Bin, File} = code:get_object_code(Mod),
    +{Mod, Bin, File} = code:get_object_code(Mod),
     
     %% and load it on all nodes including this one
    -{ResL, _} = rpc:multicall(code, load_binary, [Mod, File, Bin]),
    +{ResL, _} = rpc:multicall(code, load_binary, [Mod, File, Bin]),
     
     %% and then maybe check the ResL list.

    Note

    If you want the ability to distinguish between results, you may want to consider using the erpc:multicall() function from the @@ -1452,7 +1452,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/search.html 2025-05-10 20:19:11.637213376 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/search.html 2025-05-10 20:19:11.637213376 +0000 @@ -145,7 +145,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/seq_trace.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/seq_trace.html 2025-05-10 20:19:11.665213630 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/seq_trace.html 2025-05-10 20:19:11.677213739 +0000 @@ -141,9 +141,9 @@ Trace Messages Sent to the System Tracer

    The format of the messages is one of the following, depending on if flag -timestamp of the trace token is set to true or false:

    {seq_trace, Label, SeqTraceInfo, TimeStamp}

    or

    {seq_trace, Label, SeqTraceInfo}

    Where:

    Label = int()
    -TimeStamp = {Seconds, Milliseconds, Microseconds}
    -  Seconds = Milliseconds = Microseconds = int()

    SeqTraceInfo can have the following formats:

    • {send, Serial, From, To, Message} - Used when a process From with its +timestamp of the trace token is set to true or false:

      {seq_trace, Label, SeqTraceInfo, TimeStamp}

      or

      {seq_trace, Label, SeqTraceInfo}

      Where:

      Label = int()
      +TimeStamp = {Seconds, Milliseconds, Microseconds}
      +  Seconds = Milliseconds = Microseconds = int()

      SeqTraceInfo can have the following formats:

      • {send, Serial, From, To, Message} - Used when a process From with its trace token flag send set to true has sent information. To may be a process identifier, a registered name on a node represented as {NameAtom, NodeAtom}, or a node name represented as an atom. From may be a @@ -287,68 +287,68 @@ Example of Use

        This example gives a rough idea of how the new primitives can be used and what -kind of output it produces.

        Assume that you have an initiating process with Pid == <0.30.0> like this:

        -module(seqex).
        --compile(export_all).
        +kind of output it produces.

        Assume that you have an initiating process with Pid == <0.30.0> like this:

        -module(seqex).
        +-compile(export_all).
         
        -loop(Port) ->
        +loop(Port) ->
             receive
        -        {Port,Message} ->
        -            seq_trace:set_token(label,17),
        -            seq_trace:set_token('receive',true),
        -            seq_trace:set_token(print,true),
        -            seq_trace:print(17,"**** Trace Started ****"),
        -            call_server ! {self(),the_message};
        -        {ack,Ack} ->
        +        {Port,Message} ->
        +            seq_trace:set_token(label,17),
        +            seq_trace:set_token('receive',true),
        +            seq_trace:set_token(print,true),
        +            seq_trace:print(17,"**** Trace Started ****"),
        +            call_server ! {self(),the_message};
        +        {ack,Ack} ->
                     ok
             end,
        -    loop(Port).

        And a registered process call_server with Pid == <0.31.0> like this:

        loop() ->
        +    loop(Port).

        And a registered process call_server with Pid == <0.31.0> like this:

        loop() ->
             receive
        -        {PortController,Message} ->
        -            Ack = {received, Message},
        -            seq_trace:print(17,"We are here now"),
        -            PortController ! {ack,Ack}
        +        {PortController,Message} ->
        +            Ack = {received, Message},
        +            seq_trace:print(17,"We are here now"),
        +            PortController ! {ack,Ack}
             end,
        -    loop().

        A possible output from the system's sequential_tracer can be like this:

        17:<0.30.0> Info {0,1} WITH
        +    loop().

        A possible output from the system's sequential_tracer can be like this:

        17:<0.30.0> Info {0,1} WITH
         "**** Trace Started ****"
        -17:<0.31.0> Received {0,2} FROM <0.30.0> WITH
        -{<0.30.0>,the_message}
        -17:<0.31.0> Info {2,3} WITH
        +17:<0.31.0> Received {0,2} FROM <0.30.0> WITH
        +{<0.30.0>,the_message}
        +17:<0.31.0> Info {2,3} WITH
         "We are here now"
        -17:<0.30.0> Received {2,4} FROM <0.31.0> WITH
        -{ack,{received,the_message}}

        The implementation of a system tracer process that produces this printout can -look like this:

        tracer() ->
        +17:<0.30.0> Received {2,4} FROM <0.31.0> WITH
        +{ack,{received,the_message}}

        The implementation of a system tracer process that produces this printout can +look like this:

        tracer() ->
             receive
        -        {seq_trace,Label,TraceInfo} ->
        -           print_trace(Label,TraceInfo,false);
        -        {seq_trace,Label,TraceInfo,Ts} ->
        -           print_trace(Label,TraceInfo,Ts);
        +        {seq_trace,Label,TraceInfo} ->
        +           print_trace(Label,TraceInfo,false);
        +        {seq_trace,Label,TraceInfo,Ts} ->
        +           print_trace(Label,TraceInfo,Ts);
                 _Other -> ignore
             end,
        -    tracer().
        +    tracer().
         
        -print_trace(Label,TraceInfo,false) ->
        -    io:format("~p:",[Label]),
        -    print_trace(TraceInfo);
        -print_trace(Label,TraceInfo,Ts) ->
        -    io:format("~p ~p:",[Label,Ts]),
        -    print_trace(TraceInfo).
        -
        -print_trace({print,Serial,From,_,Info}) ->
        -    io:format("~p Info ~p WITH~n~p~n", [From,Serial,Info]);
        -print_trace({'receive',Serial,From,To,Message}) ->
        -    io:format("~p Received ~p FROM ~p WITH~n~p~n",
        -              [To,Serial,From,Message]);
        -print_trace({send,Serial,From,To,Message}) ->
        -    io:format("~p Sent ~p TO ~p WITH~n~p~n",
        -              [From,Serial,To,Message]).

        The code that creates a process that runs this tracer function and sets that -process as the system tracer can look like this:

        start() ->
        -    Pid = spawn(?MODULE,tracer,[]),
        -    seq_trace:set_system_tracer(Pid), % set Pid as the system tracer
        -    ok.

        With a function like test/0, the whole example can be started:

        test() ->
        -    P = spawn(?MODULE, loop, [port]),
        -    register(call_server, spawn(?MODULE, loop, [])),
        -    start(),
        -    P ! {port,message}.
        +
        print_trace(Label,TraceInfo,false) -> + io:format("~p:",[Label]), + print_trace(TraceInfo); +print_trace(Label,TraceInfo,Ts) -> + io:format("~p ~p:",[Label,Ts]), + print_trace(TraceInfo). + +print_trace({print,Serial,From,_,Info}) -> + io:format("~p Info ~p WITH~n~p~n", [From,Serial,Info]); +print_trace({'receive',Serial,From,To,Message}) -> + io:format("~p Received ~p FROM ~p WITH~n~p~n", + [To,Serial,From,Message]); +print_trace({send,Serial,From,To,Message}) -> + io:format("~p Sent ~p TO ~p WITH~n~p~n", + [From,Serial,To,Message]).

        The code that creates a process that runs this tracer function and sets that +process as the system tracer can look like this:

        start() ->
        +    Pid = spawn(?MODULE,tracer,[]),
        +    seq_trace:set_system_tracer(Pid), % set Pid as the system tracer
        +    ok.

        With a function like test/0, the whole example can be started:

        test() ->
        +    P = spawn(?MODULE, loop, [port]),
        +    register(call_server, spawn(?MODULE, loop, [])),
        +    start(),
        +    P ! {port,message}.
        @@ -937,11 +937,11 @@ tracing is disabled, otherwise Token should be an Erlang term returned from get_token/0 or set_token/1. set_token/1 can be used to temporarily exclude message passing from the trace by setting the -trace token to empty like this:

        OldToken = seq_trace:set_token([]), % set to empty and save
        +trace token to empty like this:

        OldToken = seq_trace:set_token([]), % set to empty and save
                                             % old value
         % do something that should not be part of the trace
        -io:format("Exclude the signalling caused by this~n"),
        -seq_trace:set_token(OldToken), % activate the trace token again
        +io:format("Exclude the signalling caused by this~n"),
        +seq_trace:set_token(OldToken), % activate the trace token again
         ...

        Returns the previous value of the trace token.

        @@ -1033,7 +1033,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/socket.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/socket.html 2025-05-10 20:19:11.773214609 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/socket.html 2025-05-10 20:19:11.833215153 +0000 @@ -172,8 +172,8 @@ completion_info/0 and the received completion message.

        The compiler may then optimize a following receive statement to only scan the messages that arrive after the reference/0 is created. If the message queue is large this is a big optimization.

        The reference/0 has to be unique for the call.

        Repeating an Operation on a select Systems

        Onselect systems, if a call would be repeated before the select -message has been received it replaces the call in progress:

            {select, {select_info, Handle}} = socket:accept(LSock, nowait),
        -    {error, timeout} = socket:accept(LSock, 500),
        +message has been received it replaces the call in progress:

            {select, {select_info, Handle}} = socket:accept(LSock, nowait),
        +    {error, timeout} = socket:accept(LSock, 500),
             :

        Above, Handle is no longer valid once the second accept/2, call has been made (the first call is automatically canceled). After the second accept/2 call returns {error, timeout}, @@ -206,28 +206,28 @@ Examples -

        client(SAddr, SPort) ->
        -   {ok, Sock} = socket:open(inet, stream, tcp),
        -   ok = socket:connect(Sock, #{family => inet,
        +
        client(SAddr, SPort) ->
        +   {ok, Sock} = socket:open(inet, stream, tcp),
        +   ok = socket:connect(Sock, #{family => inet,
                                        addr   => SAddr,
        -                               port   => SPort}),
        +                               port   => SPort}),
            Msg = <<"hello">>,
        -   ok = socket:send(Sock, Msg),
        -   ok = socket:shutdown(Sock, write),
        -   {ok, Msg} = socket:recv(Sock),
        -   ok = socket:close(Sock).
        -
        -server(Addr, Port) ->
        -   {ok, LSock} = socket:open(inet, stream, tcp),
        -   ok = socket:bind(LSock, #{family => inet,
        +   ok = socket:send(Sock, Msg),
        +   ok = socket:shutdown(Sock, write),
        +   {ok, Msg} = socket:recv(Sock),
        +   ok = socket:close(Sock).
        +
        +server(Addr, Port) ->
        +   {ok, LSock} = socket:open(inet, stream, tcp),
        +   ok = socket:bind(LSock, #{family => inet,
                                      port   => Port,
        -                             addr   => Addr}),
        -   ok = socket:listen(LSock),
        -   {ok, Sock} = socket:accept(LSock),
        -   {ok, Msg} = socket:recv(Sock),
        -   ok = socket:send(Sock, Msg),
        -   ok = socket:close(Sock),
        -   ok = socket:close(LSock).
        +
        addr => Addr}), + ok = socket:listen(LSock), + {ok, Sock} = socket:accept(LSock), + {ok, Msg} = socket:recv(Sock), + ok = socket:send(Sock, Msg), + ok = socket:close(Sock), + ok = socket:close(LSock).
        @@ -4845,7 +4845,7 @@ (since OTP 26.1).

        Result; a boolean/0.

      • tcp_info - Get miscellaneous TCP related information for a connected socket (since OTP 26.1).

        Result; a map/0 with information items as key-value pairs.

      Note

      Not all requests are supported by all platforms. To see if a ioctl request is supported on the current platform:

            Request = nread,
      -      true = socket:is_supported(ioctl_requests, Request),
      +      true = socket:is_supported(ioctl_requests, Request),
             :
      @@ -5009,7 +5009,7 @@

      Check if a socket feature is supported.

      Returns true if supports/0 has a {Key1, true} tuple or a {Key1, list()} tuple in its returned list, -otherwise false (also for unknown keys).

      Example:

      true = socket:is_supported(local),
      +otherwise false (also for unknown keys).

      Example:

      true = socket:is_supported(local),
      @@ -5040,7 +5040,7 @@

      Check if a socket feature is supported.

      Returns true if supports(Key1) has a {Key2, true} tuple -in its returned list, otherwise false (also for unknown keys).

      Example:

      true = socket:is_supported(msg_flags, errqueue),
      +in its returned list, otherwise false (also for unknown keys).

      Example:

      true = socket:is_supported(msg_flags, errqueue),
      @@ -5137,7 +5137,7 @@

      Start a socket monitor.

      If the Socket doesn't exist or when later the monitor is triggered, a 'DOWN' message is sent to the process that called monitor/1 -with the following pattern:

      	    {'DOWN', MonitorRef, socket, Socket, Info}

      Info is the termination reason of the socket or nosock if +with the following pattern:

      	    {'DOWN', MonitorRef, socket, Socket, Info}

      Info is the termination reason of the socket or nosock if Socket did not exist when the monitor was started.

      Making several calls to socket:monitor/1 for the same Socket is not an error; each call creates an independent monitor instance.

      @@ -5564,25 +5564,25 @@ On Unix, if will return {error, timeout} either if no data has arrived or if not enough data (Length > 0) has arrived. It is then up to the caller to make another all to see if -some data has arrived (and was stored internally):

          case socket:recv(Socket, 10, 5000) of
      -        {ok, Data} -> % 10 bytes of data
      +some data has arrived (and was stored internally):

          case socket:recv(Socket, 10, 5000) of
      +        {ok, Data} -> % 10 bytes of data
                   "Do something with this data..."
                   ok;
       
      -        {error, timeout} ->
      +        {error, timeout} ->
                   %% We *may* have gotten *some* data, just less then 10,
                   %% so try read again.
      -            case socket:recv(Socket, 0, 0) of
      -                {ok, Data} -> % We *did* get some data
      +            case socket:recv(Socket, 0, 0) of
      +                {ok, Data} -> % We *did* get some data
                           "Do something with this data..."
                           ok;
      -                {error, timeout} -> % Actually nothing to read
      +                {error, timeout} -> % Actually nothing to read
                           :
      -                {error, _} -> % Proper error
      +                {error, _} -> % Proper error
                           :
                   end;                    
       
      -        {error, {timeout, Data}} -> % Only on Windows
      +        {error, {timeout, Data}} -> % Only on Windows
                   "Do something with this data..."
                   ok;
               :

      Timeout = 0 only polls the OS receive call and doesn't @@ -7365,7 +7365,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/socket_usage.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/socket_usage.html 2025-05-10 20:19:11.985216531 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/socket_usage.html 2025-05-10 20:19:11.981216495 +0000 @@ -186,48 +186,48 @@ Example

      This example is intended to show how to create a simple (echo) server -(and client), handling both 'select' and 'completion' (Unix and Windows).

      -module(example).
      +(and client), handling both 'select' and 'completion' (Unix and Windows).

      -module(example).
       
      --export([client/2, client/3]).
      --export([server/0, server/1, server/2]).
      +-export([client/2, client/3]).
      +-export([server/0, server/1, server/2]).
       
       
       %% ======================================================================
       
       %% === Client ===
       
      -client(#{family := Family} = ServerSockAddr, Msg)
      -  when is_list(Msg) orelse is_binary(Msg) ->
      -    {ok, Sock} = socket:open(Family, stream, default),
      -    ok         = maybe_bind(Sock, Family),
      -    ok         = socket:connect(Sock, ServerSockAddr),
      -    client_exchange(Sock, Msg);
      +client(#{family := Family} = ServerSockAddr, Msg)
      +  when is_list(Msg) orelse is_binary(Msg) ->
      +    {ok, Sock} = socket:open(Family, stream, default),
      +    ok         = maybe_bind(Sock, Family),
      +    ok         = socket:connect(Sock, ServerSockAddr),
      +    client_exchange(Sock, Msg);
       
      -client(ServerPort, Msg)
      -  when is_integer(ServerPort) andalso (ServerPort > 0) ->
      +client(ServerPort, Msg)
      +  when is_integer(ServerPort) andalso (ServerPort > 0) ->
           Family   = inet, % Default
      -    Addr     = get_local_addr(Family), % Pick an address
      -    SockAddr = #{family => Family,
      +    Addr     = get_local_addr(Family), % Pick an address
      +    SockAddr = #{family => Family,
       		 addr   => Addr,
      -		 port   => ServerPort},
      -    client(SockAddr, Msg).
      +		 port   => ServerPort},
      +    client(SockAddr, Msg).
       
      -client(ServerPort, ServerAddr, Msg)
      -  when is_integer(ServerPort) andalso (ServerPort > 0) andalso
      -       is_tuple(ServerAddr) ->
      -    Family   = which_family(ServerAddr),
      -    SockAddr = #{family => Family,
      +client(ServerPort, ServerAddr, Msg)
      +  when is_integer(ServerPort) andalso (ServerPort > 0) andalso
      +       is_tuple(ServerAddr) ->
      +    Family   = which_family(ServerAddr),
      +    SockAddr = #{family => Family,
       		 addr   => ServerAddr,
      -		 port   => ServerPort},
      -    client(SockAddr, Msg).
      +		 port   => ServerPort},
      +    client(SockAddr, Msg).
       
       %% Send the message to the (echo) server and wait for the echo to come back.
      -client_exchange(Sock, Msg) when is_list(Msg) ->
      -    client_exchange(Sock, list_to_binary(Msg));
      -client_exchange(Sock, Msg) when is_binary(Msg) ->
      -    ok        = socket:send(Sock, Msg, infinity),
      -    {ok, Msg} = socket:recv(Sock, byte_size(Msg), infinity),
      -    ok        = socket:close(Sock),
      +client_exchange(Sock, Msg) when is_list(Msg) ->
      +    client_exchange(Sock, list_to_binary(Msg));
      +client_exchange(Sock, Msg) when is_binary(Msg) ->
      +    ok        = socket:send(Sock, Msg, infinity),
      +    {ok, Msg} = socket:recv(Sock, byte_size(Msg), infinity),
      +    ok        = socket:close(Sock),
           ok.
       
       
      @@ -235,131 +235,131 @@
       
       %% === Server ===
       
      -server() ->
      +server() ->
           %% Make system choose port (and address)
      -    server(0).
      +    server(0).
       
       %% This function return the port and address that it actually uses,
       %% in case server/0 or server/1 (with a port number) was used to start it.
       
      -server(#{family := Family, addr := Addr, port := _} = SockAddr) ->
      -    {ok, Sock} = socket:open(Family, stream, tcp),
      -    ok         = socket:bind(Sock, SockAddr),
      -    ok         = socket:listen(Sock),
      -    {ok, #{port := Port}} = socket:sockname(Sock),
      -    Acceptor = start_acceptor(Sock),
      -    {ok, {Port, Addr, Acceptor}};
      +server(#{family := Family, addr := Addr, port := _} = SockAddr) ->
      +    {ok, Sock} = socket:open(Family, stream, tcp),
      +    ok         = socket:bind(Sock, SockAddr),
      +    ok         = socket:listen(Sock),
      +    {ok, #{port := Port}} = socket:sockname(Sock),
      +    Acceptor = start_acceptor(Sock),
      +    {ok, {Port, Addr, Acceptor}};
       
      -server(Port) when is_integer(Port) ->
      +server(Port) when is_integer(Port) ->
           Family   = inet, % Default
      -    Addr     = get_local_addr(Family), % Pick an address
      -    SockAddr = #{family => Family,
      +    Addr     = get_local_addr(Family), % Pick an address
      +    SockAddr = #{family => Family,
       		 addr   => Addr,
      -		 port   => Port},
      -    server(SockAddr).
      +		 port   => Port},
      +    server(SockAddr).
       
      -server(Port, Addr)
      -  when is_integer(Port) andalso (Port >= 0) andalso
      -       is_tuple(Addr) ->
      -    Family   = which_family(Addr),
      -    SockAddr = #{family => Family,
      +server(Port, Addr)
      +  when is_integer(Port) andalso (Port >= 0) andalso
      +       is_tuple(Addr) ->
      +    Family   = which_family(Addr),
      +    SockAddr = #{family => Family,
       		 addr   => Addr,
      -		 port   => Port},
      -    server(SockAddr).
      +		 port   => Port},
      +    server(SockAddr).
       
       
       %% --- Echo Server - Acceptor ---
       
      -start_acceptor(LSock) ->
      -    Self = self(),
      -    {Pid, MRef} = spawn_monitor(fun() -> acceptor_init(Self, LSock) end),
      +start_acceptor(LSock) ->
      +    Self = self(),
      +    {Pid, MRef} = spawn_monitor(fun() -> acceptor_init(Self, LSock) end),
           receive
      -	{'DOWN', MRef, process, Pid, Info} ->
      -	    erlang:error({failed_starting_acceptor, Info});
      -	{Pid, started} ->
      +	{'DOWN', MRef, process, Pid, Info} ->
      +	    erlang:error({failed_starting_acceptor, Info});
      +	{Pid, started} ->
       	    %% Transfer ownership
      -	    socket:setopt(LSock, otp, owner, Pid),
      -	    Pid ! {self(), continue},
      -	    erlang:demonitor(MRef),
      +	    socket:setopt(LSock, otp, owner, Pid),
      +	    Pid ! {self(), continue},
      +	    erlang:demonitor(MRef),
       	    Pid
           end.
           
      -acceptor_init(Parent, LSock) ->
      -    Parent ! {self(), started},
      +acceptor_init(Parent, LSock) ->
      +    Parent ! {self(), started},
           receive
      -	{Parent, continue} ->
      +	{Parent, continue} ->
       	    ok
           end,
      -    acceptor_loop(LSock, undefined).
      +    acceptor_loop(LSock, undefined).
       
      -acceptor_loop(LSock, undefined = Info) ->
      -    case socket:accept(LSock, nowait) of
      -	{ok, ASock} ->
      -	    start_handler(ASock),
      -	    acceptor_loop(LSock, Info);
      -	{select, SelectInfo} ->
      -	    acceptor_loop(LSock, SelectInfo);
      -	{completion, CompletionInfo} ->
      -	    acceptor_loop(LSock, CompletionInfo);
      -	{error, Reason} ->
      -	    erlang:error({accept_failed, Reason})
      +acceptor_loop(LSock, undefined = Info) ->
      +    case socket:accept(LSock, nowait) of
      +	{ok, ASock} ->
      +	    start_handler(ASock),
      +	    acceptor_loop(LSock, Info);
      +	{select, SelectInfo} ->
      +	    acceptor_loop(LSock, SelectInfo);
      +	{completion, CompletionInfo} ->
      +	    acceptor_loop(LSock, CompletionInfo);
      +	{error, Reason} ->
      +	    erlang:error({accept_failed, Reason})
           end;
       
      -acceptor_loop(LSock, {select_info, accept, SelectHandle}) ->
      +acceptor_loop(LSock, {select_info, accept, SelectHandle}) ->
      /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/trace.html differs (HTML document, UTF-8 Unicode text, with very long lines)
      --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/trace.html	2025-05-10 20:19:12.093217510 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/trace.html	2025-05-10 20:19:12.089217474 +0000
      @@ -146,23 +146,23 @@
       messages. Several sessions can exist at the same time without interfering with
       each other. When a trace session is destroyed, all its trace settings are
       automatically cleaned up.

      Example:

      %% Create a tracer process that will receive the trace events
      -1> Tracer = spawn(fun F() -> receive M -> io:format("~p~n",[M]), F() end end).
      +1> Tracer = spawn(fun F() -> receive M -> io:format("~p~n",[M]), F() end end).
       <0.91.0>
       %% Create a session using the Tracer
      -2> Session = trace:session_create(my_session, Tracer, []).
      -{#Ref<0.1543805153.1548353537.92331>,{my_session, 0}}
      +2> Session = trace:session_create(my_session, Tracer, []).
      +{#Ref<0.1543805153.1548353537.92331>,{my_session, 0}}
       %% Setup call tracing on self()
      -3> trace:process(Session, self(), true, [call]).
      +3> trace:process(Session, self(), true, [call]).
       1
       %% Setup call tracing on lists:seq/2
      -4> trace:function(Session, {lists,seq,2}, [], []).
      +4> trace:function(Session, {lists,seq,2}, [], []).
       1
       %% Call the traced function
      -5> lists:seq(1, 10).
      -{trace,<0.89.0>,call,{lists,seq,[1,10]}} % The trace message
      -[1,2,3,4,5,6,7,8,9,10] % The return value
      +5> lists:seq(1, 10).
      +{trace,<0.89.0>,call,{lists,seq,[1,10]}} % The trace message
      +[1,2,3,4,5,6,7,8,9,10] % The return value
       %% Cleanup the trace session
      -6> trace:session_destroy(Session).
      +6> trace:session_destroy(Session).
       ok

      @@ -1326,9 +1326,9 @@ Match Specifications in Erlang in the User's Guide for the ERTS application.

    • true - Enable tracing for all received messages (to 'receive' traced processes). Any match specification is removed. This is the default.

    • false - Disable tracing for all received messages. Any match -specification is removed.

    Argument FlagList must be [] for receive tracing.

    The return value is always 1.

    Examples:

    Only trace messages from a specific process Pid:

    > trace:recv(Session, [{[&#href_anchor"p">,Pid, '_'],[],[]}], []).
    -1

    Only trace messages matching {reply, _}:

    > trace:recv(Session, [{['_','_', {reply,'_'}],[],[]}], []).
    -1

    Only trace messages from other nodes:

    > trace:recv(Session, [{['$1', '_', '_'],[{'=/=','$1',{node}}],[]}], []).
    +specification is removed.

    Argument FlagList must be [] for receive tracing.

    The return value is always 1.

    Examples:

    Only trace messages from a specific process Pid:

    > trace:recv(Session, [{[&#href_anchor"p">,Pid, '_'],[],[]}], []).
    +1

    Only trace messages matching {reply, _}:

    > trace:recv(Session, [{['_','_', {reply,'_'}],[],[]}], []).
    +1

    Only trace messages from other nodes:

    > trace:recv(Session, [{['$1', '_', '_'],[{'=/=','$1',{node}}],[]}], []).
     1

    Note

    A match specification for 'receive' trace can use all guard and body functions except caller, is_seq_trace, get_seq_token, set_seq_token, enable_trace, disable_trace, trace, silent, and process_dump.

    Fails by raising an error exception with an error reason of:

    • badarg - If an argument is invalid.

    • system_limit - If a match specification passed as argument has excessive @@ -1379,10 +1379,10 @@ Match Specifications in Erlang in the User's Guide for the ERTS application.

    • true - Enable tracing for all sent messages (from send traced processes). Any match specification is removed.

    • false - Disable tracing for all sent messages. Any match specification -is removed.

    Argument FlagList must be [].

    The return value is always 1.

    Examples:

    Only trace messages to a specific process Pid:

    > trace:send(Session, [{[Pid, &#href_anchor"p" data-group-id="4409143958-4">],[],[]}], []).
    -1

    Only trace messages matching {reply, _}:

    > trace:send(Session, [{['_', {reply,'_'}],[],[]}], []).
    -1

    Only trace messages sent to the sender itself:

    > trace:send(Session, [{['$1', '_'],[{'=:=','$1',{self}}],[]}], []).
    -1

    Only trace messages sent to other nodes:

    > trace:send(Session, [{['$1', '_'],[{'=/=',{node,'$1'},{node}}],[]}], []).
    +is removed.

    Argument FlagList must be [].

    The return value is always 1.

    Examples:

    Only trace messages to a specific process Pid:

    > trace:send(Session, [{[Pid, &#href_anchor"p" data-group-id="6983029365-4">],[],[]}], []).
    +1

    Only trace messages matching {reply, _}:

    > trace:send(Session, [{['_', {reply,'_'}],[],[]}], []).
    +1

    Only trace messages sent to the sender itself:

    > trace:send(Session, [{['$1', '_'],[{'=:=','$1',{self}}],[]}], []).
    +1

    Only trace messages sent to other nodes:

    > trace:send(Session, [{['$1', '_'],[{'=/=',{node,'$1'},{node}}],[]}], []).
     1

    Note

    A match specification for send trace can use all guard and body functions except caller.

    Fails by raising an error exception with an error reason of:

    • badarg - If an argument is invalid.

    • system_limit - If a match specification passed as argument has excessive nesting which causes scheduler stack exhaustion for the scheduler that the @@ -1528,7 +1528,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/wrap_log_reader.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/wrap_log_reader.html 2025-05-10 20:19:12.161218127 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.7/doc/html/wrap_log_reader.html 2025-05-10 20:19:12.173218236 +0000 @@ -550,7 +550,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/404.html 2025-05-10 20:19:12.197218454 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/404.html 2025-05-10 20:19:12.197218454 +0000 @@ -147,7 +147,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/api-reference.html 2025-05-10 20:19:12.217218634 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/api-reference.html 2025-05-10 20:19:12.217218634 +0000 @@ -302,7 +302,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco.epub/OEBPS/content.opf 2025-05-10 20:19:12.241218852 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco.epub/OEBPS/content.opf 2025-05-10 20:19:12.249218925 +0000 @@ -4,10 +4,10 @@ version="3.0"> megaco - 4.7.2 - urn:uuid:485f8b7b-0bd2-11cc-a67b-546bc3d367ab + urn:uuid:4b7fdb10-c0e5-ec52-8fa1-64a37a9c6edb en - 2025-05-10T20:11:59Z + 2041-06-12T09:32:06Z /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco.epub/OEBPS/megaco.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco.epub/OEBPS/megaco.xhtml 2025-05-10 20:19:12.241218852 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco.epub/OEBPS/megaco.xhtml 2025-05-10 20:19:12.249218925 +0000 @@ -3073,7 +3073,7 @@

      Utility function to produce a formated printout of the versions info generated by the versions1 and versions2 functions.

      The function print_version_info/0 uses the result of function version1/0 as -VersionInfo.

      Example:

                 {ok, V} = megaco:versions1(), megaco:format_versions(V).
      +VersionInfo.

      Example:

                 {ok, V} = megaco:versions1(), megaco:format_versions(V).
      /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco.epub/OEBPS/megaco_debug.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco.epub/OEBPS/megaco_debug.xhtml 2025-05-10 20:19:12.241218852 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco.epub/OEBPS/megaco_debug.xhtml 2025-05-10 20:19:12.245218888 +0000 @@ -67,12 +67,12 @@ can be expected by the different codecs provided by the megaco application.

      The measurement is done by iterating over the decode/encode function for approx 2 seconds per message and counting the number of decodes/encodes.

      Is best run by modifying the meas.sh.skel skeleton script provided by the tool.

      To run it manually do the following:

              % erl -pa <path-megaco-ebin-dir> -pa <path-to-meas-module-dir>
      -        Erlang (BEAM) emulator version 5.6 [source]
      +        Erlang (BEAM) emulator version 5.6 [source]
       
      -        Eshell V12.2  (abort with ^G)
      -        1> megaco_codec_meas:start().
      +        Eshell V12.2  (abort with ^G)
      +        1> megaco_codec_meas:start().
               ...
      -        2> halt().

      or to make it even easier, assuming a measure shall be done on all the codecs + 2> halt().

    or to make it even easier, assuming a measure shall be done on all the codecs (as above):

            % erl -noshell -pa <path-megaco-ebin-dir> \\
                   -pa <path-to-meas-module-dir> \\
                   -s megaco_codec_meas -s init stop

    When run as above (this will take some time), the measurement process is done @@ -94,10 +94,10 @@ value.

    Both these tools use the message package (time_test.msgs) provided with the tool(s), although it can run on any message package as long as it has the same structure.

    Message package file

    This is simply an erlang compatible text-file with the following structure: -{codec_name(), messages_list()}.

    codec_name() = pretty | compact | ber | per | erlang      (how the messages are encoded)
    -messages_list() = [{message_name(), message()}]
    -message_name() = atom()
    -message() = binary()

    The codec name is the name of the codec with which all messages in the +{codec_name(), messages_list()}.

    codec_name() = pretty | compact | ber | per | erlang      (how the messages are encoded)
    +messages_list() = [{message_name(), message()}]
    +message_name() = atom()
    +message() = binary()

    The codec name is the name of the codec with which all messages in the message_list() has been encoded.

    This file can be exported to a file structure by calling the export_messages function. This can be usefull if a measurement shall be done with an external tool. Exporting the /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco.epub/OEBPS/megaco_encode.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco.epub/OEBPS/megaco_encode.xhtml 2025-05-10 20:19:12.241218852 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco.epub/OEBPS/megaco_encode.xhtml 2025-05-10 20:19:12.245218888 +0000 @@ -53,75 +53,75 @@ format using long keywords and an indentation style like the text examples in the Megaco/H.248 specification).

    Here follows an example of a text message to give a feeling of the difference between the pretty and compact versions of text messages. First the pretty, well -indented version with long keywords:

       MEGACO/1 [124.124.124.222]
    -   Transaction = 9998 {
    -           Context = - {
    -                   ServiceChange = ROOT {
    -                           Services {
    +indented version with long keywords:

       MEGACO/1 [124.124.124.222]
    +   Transaction = 9998 {
    +           Context = - {
    +                   ServiceChange = ROOT {
    +                           Services {
                                        Method = Restart,
                                        ServiceChangeAddress = 55555,
                                        Profile = ResGW/1,
                                        Reason = "901 Cold Boot"
    -                           }
    -                   }
    -           }
    -   }

    Then the compact version without indentation and with short keywords:

    
    +                           }
    +                   }
    +           }
    +   }

    Then the compact version without indentation and with short keywords:

    
        !/1 [124.124.124.222]
        T=9998{C=-{SC=ROOT{SV{MT=RS,AD=55555,PF=ResGW/1,RE="901 Cold Boot"}}}}

    And the programmers view of the same message. First a list of ActionRequest records are constructed and then it is sent with one of the send functions in -the API:

      Prof = #'ServiceChangeProfile'{profileName = "resgw", version = 1},
    -  Parm = #'ServiceChangeParm'{serviceChangeMethod  = restart,
    -                              serviceChangeAddress = {portNumber, 55555},
    +the API:

      Prof = #'ServiceChangeProfile'{profileName = "resgw", version = 1},
    +  Parm = #'ServiceChangeParm'{serviceChangeMethod  = restart,
    +                              serviceChangeAddress = {portNumber, 55555},
                                   serviceChangeReason  = "901 Cold Boot",
    -                              serviceChangeProfile = Prof},
    -  Req = #'ServiceChangeRequest'{terminationID = [?megaco_root_termination_id],
    -                                serviceChangeParms = Parm},
    -  Actions = [#'ActionRequest'{contextId = ?megaco_null_context_id,
    -                              commandRequests = {serviceChangeReq, Req}}],
    -  megaco:call(ConnHandle, Actions, Config).

    And finally a print-out of the entire internal form:

      {'MegacoMessage',
    +                              serviceChangeProfile = Prof},
    +  Req = #'ServiceChangeRequest'{terminationID = [?megaco_root_termination_id],
    +                                serviceChangeParms = Parm},
    +  Actions = [#'ActionRequest'{contextId = ?megaco_null_context_id,
    +                              commandRequests = {serviceChangeReq, Req}}],
    +  megaco:call(ConnHandle, Actions, Config).

    And finally a print-out of the entire internal form:

      {'MegacoMessage',
        asn1_NOVALUE,
    -   {'Message',
    +   {'Message',
         1,
    -    {ip4Address,{'IP4Address', [124,124,124,222], asn1_NOVALUE}},
    -    {transactions,
    -     [
    -      {transactionRequest,
    -       {'TransactionRequest',
    +    {ip4Address,{'IP4Address', [124,124,124,222], asn1_NOVALUE}},
    +    {transactions,
    +     [
    +      {transactionRequest,
    +       {'TransactionRequest',
              9998,
    -         [{'ActionRequest',
    +         [{'ActionRequest',
                0,
                asn1_NOVALUE,
                asn1_NOVALUE,
    -           [
    -            {'CommandRequest',
    -             {serviceChangeReq,
    -              {'ServiceChangeRequest',
    -               [
    -                {megaco_term_id, false, ["root"]}],
    -                {'ServiceChangeParm',
    +           [
    +            {'CommandRequest',
    +             {serviceChangeReq,
    +              {'ServiceChangeRequest',
    +               [
    +                {megaco_term_id, false, ["root"]}],
    +                {'ServiceChangeParm',
                      restart,
    -                 {portNumber, 55555},
    +                 {portNumber, 55555},
                      asn1_NOVALUE,
    -                 {'ServiceChangeProfile', "resgw", version = 1},
    +                 {'ServiceChangeProfile', "resgw", version = 1},
                      "901 MG Cold Boot",
                      asn1_NOVALUE,
                      asn1_NOVALUE,
                      asn1_NOVALUE
    -                }
    -              }
    -             },
    +                }
    +              }
    +             },
                  asn1_NOVALUE,
                  asn1_NOVALUE
    -            }
    -           ]
    -          }
    -         ]
    -       }
    -      }
    -     ]
    -    }
    -   }
    -  }

    The following encoding modules are provided:

    • megaco_pretty_text_encoder - encodes messages into pretty text format, decodes + } + ] + } + ] + } + } + ] + } + } + }

    The following encoding modules are provided:

    • megaco_pretty_text_encoder - encodes messages into pretty text format, decodes both pretty as well as compact text.
    • megaco_compact_text_encoder - encodes messages into compact text format, decodes both pretty as well as compact text.
    • megaco_binary_encoder - encode/decode ASN.1 BER messages. This encoder implements the fastest of the BER encoders/decoders. Recommended binary codec.
    • megaco_ber_encoder - encode/decode ASN.1 BER messages.
    • megaco_per_encoder - encode/decode ASN.1 PER messages. N.B. that this format /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco.epub/OEBPS/megaco_examples.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco.epub/OEBPS/megaco_examples.xhtml 2025-05-10 20:19:12.241218852 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco.epub/OEBPS/megaco_examples.xhtml 2025-05-10 20:19:12.245218888 +0000 @@ -54,10 +54,10 @@ erl -pa ../../../megaco/ebin -s megaco_filter -s megaco megaco_simple_mg:start().

    or simply 'gmake mg'.

    If you "only" want to start a single MG which tries to connect an MG on a host named "baidarka", you may use one of these functions (instead of the -megaco_simple_mg:start/0 above):

          megaco_simple_mg:start_tcp_text("baidarka", []).
    -      megaco_simple_mg:start_tcp_binary("baidarka", []).
    -      megaco_simple_mg:start_udp_text("baidarka", []).
    -      megaco_simple_mg:start_udp_binary("baidarka", []).

    The -s megaco_filter option to erl implies, the event tracing mechanism to be +megaco_simple_mg:start/0 above):

          megaco_simple_mg:start_tcp_text("baidarka", []).
    +      megaco_simple_mg:start_tcp_binary("baidarka", []).
    +      megaco_simple_mg:start_udp_text("baidarka", []).
    +      megaco_simple_mg:start_udp_binary("baidarka", []).

    The -s megaco_filter option to erl implies, the event tracing mechanism to be enabled and an interactive sequence chart tool to be started. This may be quite useful in order to visualize how your MG interacts with the Megaco/H.248 protocol stack.

    The event traces may alternatively be directed to a file for later analyze. By /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco.epub/OEBPS/megaco_performance.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco.epub/OEBPS/megaco_performance.xhtml 2025-05-10 20:19:12.241218852 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco.epub/OEBPS/megaco_performance.xhtml 2025-05-10 20:19:12.245218888 +0000 @@ -57,19 +57,19 @@ built-in functions.

    The actual encoded messages have been collected in one directory per encoding type, containing one file per encoded message.

    Here follows an example of a text message to give a feeling of the difference between the pretty and compact versions of text messages. First the pretty -printed, well indented version with long keywords:

    MEGACO/1 [124.124.124.222]
    -  Transaction = 9998 {
    -    Context = - {
    -      ServiceChange = ROOT {
    -        Services {
    +printed, well indented version with long keywords:

    MEGACO/1 [124.124.124.222]
    +  Transaction = 9998 {
    +    Context = - {
    +      ServiceChange = ROOT {
    +        Services {
               Method = Restart,
               ServiceChangeAddress = 55555,
               Profile = ResGW/1,
               Reason = "901 MG Cold Boot"
    -        }
    -      }
    -    }
    -  }

    Then the compact text version without indentation and with short keywords:

    !/1 [124.124.124.222] T=9998{
    +        }
    +      }
    +    }
    +  }

    Then the compact text version without indentation and with short keywords:

    !/1 [124.124.124.222] T=9998{
       C=-{SC=ROOT{SV{MT=RS,AD=55555,PF=ResGW/1,RE="901 MG Cold Boot"}}}}

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco.epub/OEBPS/megaco_user.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco.epub/OEBPS/megaco_user.xhtml 2025-05-10 20:19:12.241218852 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco.epub/OEBPS/megaco_user.xhtml 2025-05-10 20:19:12.245218888 +0000 @@ -26,9 +26,9 @@

    Callback module for users of the Megaco application

    This module defines the callback behaviour of Megaco users. A megaco_user compliant callback module must export the following functions:

    The semantics of them and their exact signatures are explained below.

    The user_args configuration parameter which may be used to extend the argument list of the callback functions. For example, the handle_connect function takes -by default two arguments:

    handle_connect(Handle, Version)

    but if the user_args parameter is set to a longer list, such as +by default two arguments:

    handle_connect(Handle, Version)

    but if the user_args parameter is set to a longer list, such as [SomePid,SomeTableRef], the callback function is expected to have these (in -this case two) extra arguments last in the argument list:

    handle_connect(Handle, Version, SomePid, SomeTableRef)

    Note

    Must of the functions below has an optional Extra argument (e.g. +this case two) extra arguments last in the argument list:

    handle_connect(Handle, Version, SomePid, SomeTableRef)

    Note

    Must of the functions below has an optional Extra argument (e.g. handle_unexpected_trans/4). The functions which takes this argument will be called if and only if one of the functions receive_message/5 or @@ -39,10 +39,10 @@ DATA TYPES

    -
    action_request() = #'ActionRequest'{}
    -action_reply() = #'ActionReply'{}
    -error_desc() = #'ErrorDescriptor'{}
    -segment_no() = integer()
    conn_handle() = #megaco_conn_handle{}

    The record initially returned by megaco:connect/4,5. It identifies a "virtual" +

    action_request() = #'ActionRequest'{}
    +action_reply() = #'ActionReply'{}
    +error_desc() = #'ErrorDescriptor'{}
    +segment_no() = integer()
    conn_handle() = #megaco_conn_handle{}

    The record initially returned by megaco:connect/4,5. It identifies a "virtual" connection and may be reused after a reconnect (disconnect + connect).

    protocol_version() = integer()

    Is the actual protocol version. In most cases the protocol version is retrieved from the processed message, but there are exceptions:

    In these cases, the ProtocolVersion default version is obtained from the static /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco.html 2025-05-10 20:19:12.413220411 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco.html 2025-05-10 20:19:12.413220411 +0000 @@ -3190,7 +3190,7 @@

    Utility function to produce a formated printout of the versions info generated by the versions1 and versions2 functions.

    The function print_version_info/0 uses the result of function version1/0 as -VersionInfo.

    Example:

               {ok, V} = megaco:versions1(), megaco:format_versions(V).
    +VersionInfo.

    Example:

               {ok, V} = megaco:versions1(), megaco:format_versions(V).
    @@ -4100,7 +4100,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_architecture.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_architecture.html 2025-05-10 20:19:12.437220629 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_architecture.html 2025-05-10 20:19:12.437220629 +0000 @@ -259,7 +259,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_codec_meas.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_codec_meas.html 2025-05-10 20:19:12.453220774 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_codec_meas.html 2025-05-10 20:19:12.453220774 +0000 @@ -251,7 +251,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_codec_mstone1.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_codec_mstone1.html 2025-05-10 20:19:12.477220992 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_codec_mstone1.html 2025-05-10 20:19:12.477220992 +0000 @@ -603,7 +603,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_codec_mstone2.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_codec_mstone2.html 2025-05-10 20:19:12.493221137 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_codec_mstone2.html 2025-05-10 20:19:12.497221173 +0000 @@ -257,7 +257,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_codec_transform.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_codec_transform.html 2025-05-10 20:19:12.513221318 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_codec_transform.html 2025-05-10 20:19:12.513221318 +0000 @@ -254,7 +254,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_debug.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_debug.html 2025-05-10 20:19:12.533221500 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_debug.html 2025-05-10 20:19:12.533221500 +0000 @@ -172,12 +172,12 @@ can be expected by the different codecs provided by the megaco application.

    The measurement is done by iterating over the decode/encode function for approx 2 seconds per message and counting the number of decodes/encodes.

    Is best run by modifying the meas.sh.skel skeleton script provided by the tool.

    To run it manually do the following:

            % erl -pa <path-megaco-ebin-dir> -pa <path-to-meas-module-dir>
    -        Erlang (BEAM) emulator version 5.6 [source]
    +        Erlang (BEAM) emulator version 5.6 [source]
     
    -        Eshell V12.2  (abort with ^G)
    -        1> megaco_codec_meas:start().
    +        Eshell V12.2  (abort with ^G)
    +        1> megaco_codec_meas:start().
             ...
    -        2> halt().

    or to make it even easier, assuming a measure shall be done on all the codecs + 2> halt().

    or to make it even easier, assuming a measure shall be done on all the codecs (as above):

            % erl -noshell -pa <path-megaco-ebin-dir> \\
                   -pa <path-to-meas-module-dir> \\
                   -s megaco_codec_meas -s init stop

    When run as above (this will take some time), the measurement process is done @@ -199,10 +199,10 @@ value.

    Both these tools use the message package (time_test.msgs) provided with the tool(s), although it can run on any message package as long as it has the same structure.

    Message package file

    This is simply an erlang compatible text-file with the following structure: -{codec_name(), messages_list()}.

    codec_name() = pretty | compact | ber | per | erlang      (how the messages are encoded)
    -messages_list() = [{message_name(), message()}]
    -message_name() = atom()
    -message() = binary()

    The codec name is the name of the codec with which all messages in the +{codec_name(), messages_list()}.

    codec_name() = pretty | compact | ber | per | erlang      (how the messages are encoded)
    +messages_list() = [{message_name(), message()}]
    +message_name() = atom()
    +message() = binary()

    The codec name is the name of the codec with which all messages in the message_list() has been encoded.

    This file can be exported to a file structure by calling the export_messages function. This can be usefull if a measurement shall be done with an external tool. Exporting the @@ -266,7 +266,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_digit_map.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_digit_map.html 2025-05-10 20:19:12.553221681 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_digit_map.html 2025-05-10 20:19:12.553221681 +0000 @@ -508,7 +508,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_edist_compress.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_edist_compress.html 2025-05-10 20:19:12.569221826 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_edist_compress.html 2025-05-10 20:19:12.569221826 +0000 @@ -281,7 +281,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_encode.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_encode.html 2025-05-10 20:19:12.593222044 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_encode.html 2025-05-10 20:19:12.593222044 +0000 @@ -158,75 +158,75 @@ format using long keywords and an indentation style like the text examples in the Megaco/H.248 specification).

    Here follows an example of a text message to give a feeling of the difference between the pretty and compact versions of text messages. First the pretty, well -indented version with long keywords:

       MEGACO/1 [124.124.124.222]
    -   Transaction = 9998 {
    -           Context = - {
    -                   ServiceChange = ROOT {
    -                           Services {
    +indented version with long keywords:

       MEGACO/1 [124.124.124.222]
    +   Transaction = 9998 {
    +           Context = - {
    +                   ServiceChange = ROOT {
    +                           Services {
                                        Method = Restart,
                                        ServiceChangeAddress = 55555,
                                        Profile = ResGW/1,
                                        Reason = "901 Cold Boot"
    -                           }
    -                   }
    -           }
    -   }

    Then the compact version without indentation and with short keywords:

    
    +                           }
    +                   }
    +           }
    +   }

    Then the compact version without indentation and with short keywords:

    
        !/1 [124.124.124.222]
        T=9998{C=-{SC=ROOT{SV{MT=RS,AD=55555,PF=ResGW/1,RE="901 Cold Boot"}}}}

    And the programmers view of the same message. First a list of ActionRequest records are constructed and then it is sent with one of the send functions in -the API:

      Prof = #'ServiceChangeProfile'{profileName = "resgw", version = 1},
    -  Parm = #'ServiceChangeParm'{serviceChangeMethod  = restart,
    -                              serviceChangeAddress = {portNumber, 55555},
    +the API:

      Prof = #'ServiceChangeProfile'{profileName = "resgw", version = 1},
    +  Parm = #'ServiceChangeParm'{serviceChangeMethod  = restart,
    +                              serviceChangeAddress = {portNumber, 55555},
                                   serviceChangeReason  = "901 Cold Boot",
    -                              serviceChangeProfile = Prof},
    -  Req = #'ServiceChangeRequest'{terminationID = [?megaco_root_termination_id],
    -                                serviceChangeParms = Parm},
    -  Actions = [#'ActionRequest'{contextId = ?megaco_null_context_id,
    -                              commandRequests = {serviceChangeReq, Req}}],
    -  megaco:call(ConnHandle, Actions, Config).

    And finally a print-out of the entire internal form:

      {'MegacoMessage',
    +                              serviceChangeProfile = Prof},
    +  Req = #'ServiceChangeRequest'{terminationID = [?megaco_root_termination_id],
    +                                serviceChangeParms = Parm},
    +  Actions = [#'ActionRequest'{contextId = ?megaco_null_context_id,
    +                              commandRequests = {serviceChangeReq, Req}}],
    +  megaco:call(ConnHandle, Actions, Config).

    And finally a print-out of the entire internal form:

      {'MegacoMessage',
        asn1_NOVALUE,
    -   {'Message',
    +   {'Message',
         1,
    -    {ip4Address,{'IP4Address', [124,124,124,222], asn1_NOVALUE}},
    -    {transactions,
    -     [
    -      {transactionRequest,
    -       {'TransactionRequest',
    +    {ip4Address,{'IP4Address', [124,124,124,222], asn1_NOVALUE}},
    +    {transactions,
    +     [
    +      {transactionRequest,
    +       {'TransactionRequest',
              9998,
    -         [{'ActionRequest',
    +         [{'ActionRequest',
                0,
                asn1_NOVALUE,
                asn1_NOVALUE,
    -           [
    -            {'CommandRequest',
    -             {serviceChangeReq,
    -              {'ServiceChangeRequest',
    -               [
    -                {megaco_term_id, false, ["root"]}],
    -                {'ServiceChangeParm',
    +           [
    +            {'CommandRequest',
    +             {serviceChangeReq,
    +              {'ServiceChangeRequest',
    +               [
    +                {megaco_term_id, false, ["root"]}],
    +                {'ServiceChangeParm',
                      restart,
    -                 {portNumber, 55555},
    +                 {portNumber, 55555},
                      asn1_NOVALUE,
    -                 {'ServiceChangeProfile', "resgw", version = 1},
    +                 {'ServiceChangeProfile', "resgw", version = 1},
                      "901 MG Cold Boot",
                      asn1_NOVALUE,
                      asn1_NOVALUE,
                      asn1_NOVALUE
    -                }
    -              }
    -             },
    +                }
    +              }
    +             },
                  asn1_NOVALUE,
                  asn1_NOVALUE
    -            }
    -           ]
    -          }
    -         ]
    -       }
    -      }
    -     ]
    -    }
    -   }
    -  }

    The following encoding modules are provided:

    • megaco_pretty_text_encoder - encodes messages into pretty text format, decodes + } + ] + } + ] + } + } + ] + } + } + }

    The following encoding modules are provided:

    • megaco_pretty_text_encoder - encodes messages into pretty text format, decodes both pretty as well as compact text.
    • megaco_compact_text_encoder - encodes messages into compact text format, decodes both pretty as well as compact text.
    • megaco_binary_encoder - encode/decode ASN.1 BER messages. This encoder implements the fastest of the BER encoders/decoders. Recommended binary codec.
    • megaco_ber_encoder - encode/decode ASN.1 BER messages.
    • megaco_per_encoder - encode/decode ASN.1 PER messages. N.B. that this format @@ -357,7 +357,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_encoder.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_encoder.html 2025-05-10 20:19:12.617222260 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_encoder.html 2025-05-10 20:19:12.621222298 +0000 @@ -1404,7 +1404,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_examples.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_examples.html 2025-05-10 20:19:12.637222442 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_examples.html 2025-05-10 20:19:12.637222442 +0000 @@ -159,10 +159,10 @@ erl -pa ../../../megaco/ebin -s megaco_filter -s megaco megaco_simple_mg:start().

    or simply 'gmake mg'.

    If you "only" want to start a single MG which tries to connect an MG on a host named "baidarka", you may use one of these functions (instead of the -megaco_simple_mg:start/0 above):

          megaco_simple_mg:start_tcp_text("baidarka", []).
    -      megaco_simple_mg:start_tcp_binary("baidarka", []).
    -      megaco_simple_mg:start_udp_text("baidarka", []).
    -      megaco_simple_mg:start_udp_binary("baidarka", []).

    The -s megaco_filter option to erl implies, the event tracing mechanism to be +megaco_simple_mg:start/0 above):

          megaco_simple_mg:start_tcp_text("baidarka", []).
    +      megaco_simple_mg:start_tcp_binary("baidarka", []).
    +      megaco_simple_mg:start_udp_text("baidarka", []).
    +      megaco_simple_mg:start_udp_binary("baidarka", []).

    The -s megaco_filter option to erl implies, the event tracing mechanism to be enabled and an interactive sequence chart tool to be started. This may be quite useful in order to visualize how your MG interacts with the Megaco/H.248 protocol stack.

    The event traces may alternatively be directed to a file for later analyze. By @@ -218,7 +218,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_flex_scanner.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_flex_scanner.html 2025-05-10 20:19:12.657222624 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_flex_scanner.html 2025-05-10 20:19:12.657222624 +0000 @@ -451,7 +451,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_intro.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_intro.html 2025-05-10 20:19:12.677222805 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_intro.html 2025-05-10 20:19:12.677222805 +0000 @@ -214,7 +214,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_mib.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_mib.html 2025-05-10 20:19:12.697222986 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_mib.html 2025-05-10 20:19:12.697222986 +0000 @@ -206,7 +206,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_performance.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_performance.html 2025-05-10 20:19:12.717223168 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_performance.html 2025-05-10 20:19:12.717223168 +0000 @@ -162,19 +162,19 @@ built-in functions.

    The actual encoded messages have been collected in one directory per encoding type, containing one file per encoded message.

    Here follows an example of a text message to give a feeling of the difference between the pretty and compact versions of text messages. First the pretty -printed, well indented version with long keywords:

    MEGACO/1 [124.124.124.222]
    -  Transaction = 9998 {
    -    Context = - {
    -      ServiceChange = ROOT {
    -        Services {
    +printed, well indented version with long keywords:

    MEGACO/1 [124.124.124.222]
    +  Transaction = 9998 {
    +    Context = - {
    +      ServiceChange = ROOT {
    +        Services {
               Method = Restart,
               ServiceChangeAddress = 55555,
               Profile = ResGW/1,
               Reason = "901 MG Cold Boot"
    -        }
    -      }
    -    }
    -  }

    Then the compact text version without indentation and with short keywords:

    !/1 [124.124.124.222] T=9998{
    +        }
    +      }
    +    }
    +  }

    Then the compact text version without indentation and with short keywords:

    !/1 [124.124.124.222] T=9998{
       C=-{SC=ROOT{SV{MT=RS,AD=55555,PF=ResGW/1,RE="901 MG Cold Boot"}}}}

    @@ -257,7 +257,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_run.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_run.html 2025-05-10 20:19:12.737223349 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_run.html 2025-05-10 20:19:12.737223349 +0000 @@ -335,7 +335,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_sdp.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_sdp.html 2025-05-10 20:19:12.761223567 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_sdp.html 2025-05-10 20:19:12.761223567 +0000 @@ -1240,7 +1240,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_tcp.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_tcp.html 2025-05-10 20:19:12.785223784 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_tcp.html 2025-05-10 20:19:12.785223784 +0000 @@ -861,7 +861,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_transport.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_transport.html 2025-05-10 20:19:12.805223966 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_transport.html 2025-05-10 20:19:12.805223966 +0000 @@ -334,7 +334,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_transport_mechanisms.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_transport_mechanisms.html 2025-05-10 20:19:12.825224147 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_transport_mechanisms.html 2025-05-10 20:19:12.825224147 +0000 @@ -191,7 +191,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_udp.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_udp.html 2025-05-10 20:19:12.849224365 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_udp.html 2025-05-10 20:19:12.849224365 +0000 @@ -891,7 +891,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_user.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_user.html 2025-05-10 20:19:12.881224655 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/megaco_user.html 2025-05-10 20:19:12.881224655 +0000 @@ -131,9 +131,9 @@

    Callback module for users of the Megaco application

    This module defines the callback behaviour of Megaco users. A megaco_user compliant callback module must export the following functions:

    The semantics of them and their exact signatures are explained below.

    The user_args configuration parameter which may be used to extend the argument list of the callback functions. For example, the handle_connect function takes -by default two arguments:

    handle_connect(Handle, Version)

    but if the user_args parameter is set to a longer list, such as +by default two arguments:

    handle_connect(Handle, Version)

    but if the user_args parameter is set to a longer list, such as [SomePid,SomeTableRef], the callback function is expected to have these (in -this case two) extra arguments last in the argument list:

    handle_connect(Handle, Version, SomePid, SomeTableRef)

    Note

    Must of the functions below has an optional Extra argument (e.g. +this case two) extra arguments last in the argument list:

    handle_connect(Handle, Version, SomePid, SomeTableRef)

    Note

    Must of the functions below has an optional Extra argument (e.g. handle_unexpected_trans/4). The functions which takes this argument will be called if and only if one of the functions receive_message/5 or @@ -144,10 +144,10 @@ DATA TYPES

    -
    action_request() = #'ActionRequest'{}
    -action_reply() = #'ActionReply'{}
    -error_desc() = #'ErrorDescriptor'{}
    -segment_no() = integer()
    conn_handle() = #megaco_conn_handle{}

    The record initially returned by megaco:connect/4,5. It identifies a "virtual" +

    action_request() = #'ActionRequest'{}
    +action_reply() = #'ActionReply'{}
    +error_desc() = #'ErrorDescriptor'{}
    +segment_no() = integer()
    conn_handle() = #megaco_conn_handle{}

    The record initially returned by megaco:connect/4,5. It identifies a "virtual" connection and may be reused after a reconnect (disconnect + connect).

    protocol_version() = integer()

    Is the actual protocol version. In most cases the protocol version is retrieved from the processed message, but there are exceptions:

    In these cases, the ProtocolVersion default version is obtained from the static @@ -1555,7 +1555,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/notes.html 2025-05-10 20:19:12.909224909 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/notes.html 2025-05-10 20:19:12.909224909 +0000 @@ -1020,7 +1020,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/search.html 2025-05-10 20:19:12.929225089 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7.2/doc/html/search.html 2025-05-10 20:19:12.929225089 +0000 @@ -145,7 +145,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/404.html 2025-05-10 20:19:12.945225235 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/404.html 2025-05-10 20:19:12.945225235 +0000 @@ -147,7 +147,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/api-reference.html 2025-05-10 20:19:12.961225380 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/api-reference.html 2025-05-10 20:19:12.961225380 +0000 @@ -203,7 +203,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/content.opf 2025-05-10 20:19:12.993225670 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/content.opf 2025-05-10 20:19:12.997225706 +0000 @@ -4,10 +4,10 @@ version="3.0"> mnesia - 4.23.5 - urn:uuid:161259c5-3220-e9e3-4b37-16c8bac9fbab + urn:uuid:8082e2f8-13b0-d987-478d-9f104111a304 en - 2025-05-10T20:11:37Z + 2041-06-12T09:31:44Z /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia.xhtml 2025-05-10 20:19:12.993225670 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia.xhtml 2025-05-10 20:19:12.997225706 +0000 @@ -61,11 +61,11 @@ specifies the types of the SNMP keys.

  • attributes. The names of the attributes for the records that are inserted in the table.

  • For information about the complete set of table properties and their details, see mnesia:create_table/2.

    This Reference Manual uses a table of persons to illustrate various examples. -The following record definition is assumed:

    -record(person, {name,
    +The following record definition is assumed:

    -record(person, {name,
                      age = 0,
                      address = unknown,
                      salary = 0,
    -                 children = []}),

    The first record attribute is the primary key, or key for short.

    The function descriptions are sorted in alphabetical order. It is recommended to + children = []}),

    The first record attribute is the primary key, or key for short.

    The function descriptions are sorted in alphabetical order. It is recommended to start to read about mnesia:create_table/2, mnesia:lock/2, and mnesia:activity/4 before you continue and learn about the rest.

    Writing or deleting in transaction-context creates a local copy of each modified record during the transaction. During iteration, that is, mnesia:foldl/4, @@ -2744,7 +2744,7 @@ -

    Change the storage type of a table.

    For example:

    mnesia:change_table_copy_type(person, node(), disc_copies)

    Transforms the person table from a RAM table into a disc-based table at +

    Change the storage type of a table.

    For example:

    mnesia:change_table_copy_type(person, node(), disc_copies)

    Transforms the person table from a RAM table into a disc-based table at Node.

    This function can also be used to change the storage type of the table named schema. The schema table can only have ram_copies or disc_copies as the storage type. If the storage type of the schema is ram_copies, no other table @@ -2995,22 +2995,22 @@ back end storage. Backend can currently be ets or dets. Properties is a list of options sent to the back end storage during table creation. Properties cannot contain properties already used by Mnesia, such as type -or named_table.

    For example:

    mnesia:create_table(table, [{ram_copies, [node()]}, {disc_only_copies, nodes()},
    -       {storage_properties,
    -        [{ets, [compressed]}, {dets, [{auto_save, 5000}]} ]}])
  • {type, Type}, where Type must be either of the atoms set, ordered_set, +or named_table.

    For example:

    mnesia:create_table(table, [{ram_copies, [node()]}, {disc_only_copies, nodes()},
    +       {storage_properties,
    +        [{ets, [compressed]}, {dets, [{auto_save, 5000}]} ]}])
  • {type, Type}, where Type must be either of the atoms set, ordered_set, or bag. Default is set. In a set, all records have unique keys. In a bag, several records can have the same key, but the record content is unique. If a non-unique record is stored, the old conflicting records are overwritten.

    Notice that currently ordered_set is not supported for disc_only_copies.

  • {local_content, Bool}, where Bool is true or false. Default is false.

  • For example, the following call creates the person table (defined earlier) and -replicates it on two nodes:

    mnesia:create_table(person,
    -    [{ram_copies, [N1, N2]},
    -     {attributes, record_info(fields, person)}]).

    If it is required that Mnesia must build and maintain an extra index table on +replicates it on two nodes:

    mnesia:create_table(person,
    +    [{ram_copies, [N1, N2]},
    +     {attributes, record_info(fields, person)}]).

    If it is required that Mnesia must build and maintain an extra index table on attribute address of all the person records that are inserted in the table, -the following code would be issued:

    mnesia:create_table(person,
    -    [{ram_copies, [N1, N2]},
    -     {index, [address]},
    -     {attributes, record_info(fields, person)}]).

    The specification of index and attributes can be hard-coded as +the following code would be issued:

    mnesia:create_table(person,
    +    [{ram_copies, [N1, N2]},
    +     {index, [address]},
    +     {attributes, record_info(fields, person)}]).

    The specification of index and attributes can be hard-coded as {index, [2]} and {attributes, [name, age, address, salary, children]}, respectively.

    mnesia:create_table/2 writes records into the table schema. This function, and all other schema manipulation functions, are implemented with the normal @@ -5260,10 +5260,10 @@ argument. Default is read. The return value depends on MatchSpec.

    Notice that for best performance, select is to be used before any modifying operations are done on that table in the same transaction. That is, do not use write or delete before a select.

    In its simplest forms, the match_spec look as follows:

    • MatchSpec = [MatchFunction]
    • MatchFunction = {MatchHead, [Guard], [Result]}
    • MatchHead = tuple() | record()

    • Guard = {"Guardtest name", ...}
    • Result = "Term construct"

    For a complete description of select, see the ERTS -User's Guide and the ets manual page in STDLIB.

    For example, to find the names of all male persons older than 30 in table Tab:

    MatchHead = #person{name='$1', sex=male, age='$2', _='_'},
    -Guard = {'>', '$2', 30},
    +User's Guide and the ets manual page in STDLIB.

    For example, to find the names of all male persons older than 30 in table Tab:

    MatchHead = #person{name='$1', sex=male, age='$2', _='_'},
    +Guard = {'>', '$2', 30},
     Result = '$1',
    -mnesia:select(Tab,[{MatchHead, [Guard], [Result]}]),
    +
    mnesia:select(Tab,[{MatchHead, [Guard], [Result]}]),
    @@ -5558,9 +5558,9 @@ specified as a tuple of atoms describing the types. The only significant type is fix_string. This means that a string has a fixed size.

    For example, the following causes table person to be ordered as an SNMP table:

    mnesia:snmp_open_table(person, [{key, string}])

    Consider the following schema for a table of company employees. Each employee is identified by department number and name. The other table column stores the -telephone number:

    mnesia:create_table(employee,
    -    [{snmp, [{key, {integer, string}}]},
    -     {attributes, record_info(fields, employees)}]),

    The corresponding SNMP table would have three columns: department, name, and +telephone number:

    mnesia:create_table(employee,
    +    [{snmp, [{key, {integer, string}}]},
    +     {attributes, record_info(fields, employees)}]),

    The corresponding SNMP table would have three columns: department, name, and telno.

    An option is to have table columns that are not visible through the SNMP protocol. These columns must be the last columns of the table. In the previous example, the SNMP table could have columns department and name only. The @@ -6163,17 +6163,17 @@ transaction is terminated and the function transaction/1 returns the tuple {aborted, Reason}.

    If all is going well, {atomic, ResultOfFun} is returned, where ResultOfFun is the value of the last expression in Fun.

    A function that adds a family to the database can be written as follows if there -is a structure {family, Father, Mother, ChildrenList}:

    add_family({family, F, M, Children}) ->
    -    ChildOids = lists:map(fun oid/1, Children),
    -    Trans = fun() ->
    -        mnesia:write(F#person{children = ChildOids}),
    -        mnesia:write(M#person{children = ChildOids}),
    -        Write = fun(Child) -> mnesia:write(Child) end,
    -        lists:foreach(Write, Children)
    +is a structure {family, Father, Mother, ChildrenList}:

    add_family({family, F, M, Children}) ->
    +    ChildOids = lists:map(fun oid/1, Children),
    +    Trans = fun() ->
    +        mnesia:write(F#person{children = ChildOids}),
    +        mnesia:write(M#person{children = ChildOids}),
    +        Write = fun(Child) -> mnesia:write(Child) end,
    +        lists:foreach(Write, Children)
         end,
    -    mnesia:transaction(Trans).
    +    mnesia:transaction(Trans).
     
    -oid(Rec) -> {element(1, Rec), element(2, Rec)}.

    This code adds a set of people to the database. Running this code within one +oid(Rec) -> {element(1, Rec), element(2, Rec)}.

    This code adds a set of people to the database. Running this code within one transaction ensures that either the whole family is added to the database, or the whole transaction terminates. For example, if the last child is badly formatted, or the executing process terminates because of an 'EXIT' signal @@ -6181,17 +6181,17 @@ where half a family is added can never occur.

    It is also useful to update the database within a transaction if several processes concurrently update the same records. For example, the function raise(Name, Amount), which adds Amount to the salary field of a person, is -to be implemented as follows:

    raise(Name, Amount) ->
    -    mnesia:transaction(fun() ->
    -        case mnesia:wread({person, Name}) of
    -            [P] ->
    +to be implemented as follows:

    raise(Name, Amount) ->
    +    mnesia:transaction(fun() ->
    +        case mnesia:wread({person, Name}) of
    +            [P] ->
                     Salary = Amount + P#person.salary,
    -                P2 = P#person{salary = Salary},
    -                mnesia:write(P2);
    +                P2 = P#person{salary = Salary},
    +                mnesia:write(P2);
                 _ ->
    -                mnesia:abort("No such person")
    +                mnesia:abort("No such person")
             end
    -    end).

    When this function executes within a transaction, several processes running on + end).

    When this function executes within a transaction, several processes running on different nodes can concurrently execute the function raise/2 without interfering with each other.

    Since Mnesia detects deadlocks, a transaction can be restarted any number of times and therefore the Fun shall not have any side effects such as waiting /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia_app_a.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia_app_a.xhtml 2025-05-10 20:19:12.989225633 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia_app_a.xhtml 2025-05-10 20:19:12.997225706 +0000 @@ -54,11 +54,11 @@ %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --module(mnesia_backup). +-module(mnesia_backup). --include_lib("kernel/include/file.hrl"). +-include_lib("kernel/include/file.hrl"). --export([ +-export([ %% Write access open_write/1, write/2, @@ -69,105 +69,105 @@ open_read/1, read/1, close_read/1 - ]). + ]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Backup callback interface --record(backup, {tmp_file, file, file_desc}). +-record(backup, {tmp_file, file, file_desc}). %% Opens backup media for write %% %% Returns {ok, OpaqueData} or {error, Reason} -open_write(OpaqueData) -> +open_write(OpaqueData) -> File = OpaqueData, - Tmp = lists:concat([File,".BUPTMP"]), - file:delete(Tmp), - case disk_log:open([{name, make_ref()}, - {file, Tmp}, - {repair, false}, - {linkto, self()}]) of - {ok, Fd} -> - {ok, #backup{tmp_file = Tmp, file = File, file_desc = Fd}}; - {error, Reason} -> - {error, Reason} + Tmp = lists:concat([File,".BUPTMP"]), + file:delete(Tmp), + case disk_log:open([{name, make_ref()}, + {file, Tmp}, + {repair, false}, + {linkto, self()}]) of + {ok, Fd} -> + {ok, #backup{tmp_file = Tmp, file = File, file_desc = Fd}}; + {error, Reason} -> + {error, Reason} end. %% Writes BackupItems to the backup media %% %% Returns {ok, OpaqueData} or {error, Reason} -write(OpaqueData, BackupItems) -> +write(OpaqueData, BackupItems) -> B = OpaqueData, - case disk_log:log_terms(B#backup.file_desc, BackupItems) of + case disk_log:log_terms(B#backup.file_desc, BackupItems) of ok -> - {ok, B}; - {error, Reason} -> - abort_write(B), - {error, Reason} + {ok, B}; + {error, Reason} -> + abort_write(B), + {error, Reason} end. %% Closes the backup media after a successful backup %% %% Returns {ok, ReturnValueToUser} or {error, Reason} -commit_write(OpaqueData) -> +commit_write(OpaqueData) -> B = OpaqueData, - case disk_log:sync(B#backup.file_desc) of + case disk_log:sync(B#backup.file_desc) of ok -> - case disk_log:close(B#backup.file_desc) of + case disk_log:close(B#backup.file_desc) of ok -> - file:delete(B#backup.file), - case file:rename(B#backup.tmp_file, B#backup.file) of + file:delete(B#backup.file), + case file:rename(B#backup.tmp_file, B#backup.file) of ok -> - {ok, B#backup.file}; - {error, Reason} -> - {error, Reason} + {ok, B#backup.file}; + {error, Reason} -> + {error, Reason} end; - {error, Reason} -> - {error, Reason} + {error, Reason} -> + {error, Reason} end; - {error, Reason} -> - {error, Reason} + {error, Reason} -> + {error, Reason} end. %% Closes the backup media after an interrupted backup %% %% Returns {ok, ReturnValueToUser} or {error, Reason} -abort_write(BackupRef) -> - Res = disk_log:close(BackupRef#backup.file_desc), - file:delete(BackupRef#backup.tmp_file), +abort_write(BackupRef) -> + Res = disk_log:close(BackupRef#backup.file_desc), + file:delete(BackupRef#backup.tmp_file), case Res of ok -> - {ok, BackupRef#backup.file}; - {error, Reason} -> - {error, Reason} + {ok, BackupRef#backup.file}; + {error, Reason} -> + {error, Reason} end. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Restore callback interface --record(restore, {file, file_desc, cont}). +-record(restore, {file, file_desc, cont}). %% Opens backup media for read %% %% Returns {ok, OpaqueData} or {error, Reason} -open_read(OpaqueData) -> +open_read(OpaqueData) -> File = OpaqueData, - case file:read_file_info(File) of - {error, Reason} -> - {error, Reason}; + case file:read_file_info(File) of + {error, Reason} -> + {error, Reason}; _FileInfo -> %% file exists - case disk_log:open([{file, File}, - {name, make_ref()}, - {repair, false}, - {mode, read_only}, - {linkto, self()}]) of - {ok, Fd} -> - {ok, #restore{file = File, file_desc = Fd, cont = start}}; - {repaired, Fd, _, {badbytes, 0}} -> - {ok, #restore{file = File, file_desc = Fd, cont = start}}; - {repaired, Fd, _, _} -> - {ok, #restore{file = File, file_desc = Fd, cont = start}}; - {error, Reason} -> - {error, Reason} + case disk_log:open([{file, File}, + {name, make_ref()}, + {repair, false}, + {mode, read_only}, + {linkto, self()}]) of + {ok, Fd} -> + {ok, #restore{file = File, file_desc = Fd, cont = start}}; + {repaired, Fd, _, {badbytes, 0}} -> + {ok, #restore{file = File, file_desc = Fd, cont = start}}; + {repaired, Fd, _, _} -> + {ok, #restore{file = File, file_desc = Fd, cont = start}}; + {error, Reason} -> + {error, Reason} end end. @@ -176,30 +176,30 @@ %% Returns {ok, OpaqueData, BackupItems} or {error, Reason} %% %% BackupItems == [] is interpreted as eof -read(OpaqueData) -> +read(OpaqueData) -> R = OpaqueData, Fd = R#restore.file_desc, - case disk_log:chunk(Fd, R#restore.cont) of - {error, Reason} -> - {error, {"Possibly truncated", Reason}}; + case disk_log:chunk(Fd, R#restore.cont) of + {error, Reason} -> + {error, {"Possibly truncated", Reason}}; eof -> - {ok, R, []}; - {Cont, []} -> - read(R#restore{cont = Cont}); - {Cont, BackupItems, _BadBytes} -> - {ok, R#restore{cont = Cont}, BackupItems}; - {Cont, BackupItems} -> - {ok, R#restore{cont = Cont}, BackupItems} /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia_app_b.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia_app_b.xhtml 2025-05-10 20:19:12.989225633 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia_app_b.xhtml 2025-05-10 20:19:12.997225706 +0000 @@ -26,10 +26,10 @@ mnesia_access Callback Behavior -

    -module(mnesia_frag).
    +
    -module(mnesia_frag).
     
     %% Callback functions when accessed within an activity
    --export([
    +-export([
              lock/4,
              write/5, delete/5, delete_object/5,
              read/5, match_object/5, all_keys/4,
    @@ -38,242 +38,242 @@
              foldl/6, foldr/6, table_info/4,
              first/3, next/4, prev/4, last/3,
              clear_table/4
    -        ]).
    +        ]).
     
     %% Callback functions which provides transparent
     %% access of fragmented tables from any activity
     %% access context.
     
    -lock(ActivityId, Opaque, {table , Tab}, LockKind) ->
    -    case frag_names(Tab) of
    -        [Tab] ->
    -            mnesia:lock(ActivityId, Opaque, {table, Tab}, LockKind);
    +lock(ActivityId, Opaque, {table , Tab}, LockKind) ->
    +    case frag_names(Tab) of
    +        [Tab] ->
    +            mnesia:lock(ActivityId, Opaque, {table, Tab}, LockKind);
             Frags ->
    -            DeepNs = [mnesia:lock(ActivityId, Opaque, {table, F}, LockKind) ||
    -                         F <- Frags],
    -            mnesia_lib:uniq(lists:append(DeepNs))
    +            DeepNs = [mnesia:lock(ActivityId, Opaque, {table, F}, LockKind) ||
    +                         F <- Frags],
    +            mnesia_lib:uniq(lists:append(DeepNs))
         end;
     
    -lock(ActivityId, Opaque, LockItem, LockKind) ->
    -    mnesia:lock(ActivityId, Opaque, LockItem, LockKind).
    +lock(ActivityId, Opaque, LockItem, LockKind) ->
    +    mnesia:lock(ActivityId, Opaque, LockItem, LockKind).
     
    -write(ActivityId, Opaque, Tab, Rec, LockKind) ->
    -    Frag = record_to_frag_name(Tab, Rec),
    -    mnesia:write(ActivityId, Opaque, Frag, Rec, LockKind).
    -
    -delete(ActivityId, Opaque, Tab, Key, LockKind) ->
    -    Frag = key_to_frag_name(Tab, Key),
    -    mnesia:delete(ActivityId, Opaque, Frag, Key, LockKind).
    -
    -delete_object(ActivityId, Opaque, Tab, Rec, LockKind) ->
    -    Frag = record_to_frag_name(Tab, Rec),
    -    mnesia:delete_object(ActivityId, Opaque, Frag, Rec, LockKind).
    -
    -read(ActivityId, Opaque, Tab, Key, LockKind) ->
    -    Frag = key_to_frag_name(Tab, Key),
    -    mnesia:read(ActivityId, Opaque, Frag, Key, LockKind).
    -
    -match_object(ActivityId, Opaque, Tab, HeadPat, LockKind) ->
    -    MatchSpec = [{HeadPat, [], ['$_']}],
    -    select(ActivityId, Opaque, Tab, MatchSpec, LockKind).
    -
    -select(ActivityId, Opaque, Tab, MatchSpec, LockKind) ->
    -    do_select(ActivityId, Opaque, Tab, MatchSpec, LockKind).
    -
    -
    -select(ActivityId, Opaque, Tab, MatchSpec, Limit, LockKind) ->
    -    init_select(ActivityId, Opaque, Tab, MatchSpec, Limit, LockKind).
    -
    -select_cont(_Tid,_,{frag_cont, '$end_of_table', [],_}) -> '$end_of_table';
    -select_cont(Tid,Ts,{frag_cont, '$end_of_table', [{Tab,Node,Type}|Rest],Args}) ->
    -    {Spec,LockKind,Limit} = Args,
    -    InitFun = fun(FixedSpec) -> mnesia:dirty_sel_init(Node,Tab,FixedSpec,Limit,Type) end,
    -    Res = mnesia:fun_select(Tid,Ts,Tab,Spec,LockKind,Tab,InitFun,Limit,Node,Type),
    -    frag_sel_cont(Res, Rest, Args);
    -select_cont(Tid,Ts,{frag_cont, Cont, TabL, Args}) ->
    -    frag_sel_cont(mnesia:select_cont(Tid,Ts,Cont),TabL,Args);
    -select_cont(Tid,Ts,Else) ->
    -    mnesia:select_cont(Tid,Ts,Else).
    -
    -all_keys(ActivityId, Opaque, Tab, LockKind) ->
    -    Match = [mnesia:all_keys(ActivityId, Opaque, Frag, LockKind)
    -             || Frag <- frag_names(Tab)],
    -    lists:append(Match).
    +write(ActivityId, Opaque, Tab, Rec, LockKind) ->
    +    Frag = record_to_frag_name(Tab, Rec),
    +    mnesia:write(ActivityId, Opaque, Frag, Rec, LockKind).
    +
    +delete(ActivityId, Opaque, Tab, Key, LockKind) ->
    +    Frag = key_to_frag_name(Tab, Key),
    +    mnesia:delete(ActivityId, Opaque, Frag, Key, LockKind).
    +
    +delete_object(ActivityId, Opaque, Tab, Rec, LockKind) ->
    +    Frag = record_to_frag_name(Tab, Rec),
    +    mnesia:delete_object(ActivityId, Opaque, Frag, Rec, LockKind).
    +
    +read(ActivityId, Opaque, Tab, Key, LockKind) ->
    +    Frag = key_to_frag_name(Tab, Key),
    +    mnesia:read(ActivityId, Opaque, Frag, Key, LockKind).
    +
    +match_object(ActivityId, Opaque, Tab, HeadPat, LockKind) ->
    +    MatchSpec = [{HeadPat, [], ['$_']}],
    +    select(ActivityId, Opaque, Tab, MatchSpec, LockKind).
    +
    +select(ActivityId, Opaque, Tab, MatchSpec, LockKind) ->
    +    do_select(ActivityId, Opaque, Tab, MatchSpec, LockKind).
    +
    +
    +select(ActivityId, Opaque, Tab, MatchSpec, Limit, LockKind) ->
    +    init_select(ActivityId, Opaque, Tab, MatchSpec, Limit, LockKind).
    +
    +select_cont(_Tid,_,{frag_cont, '$end_of_table', [],_}) -> '$end_of_table';
    +select_cont(Tid,Ts,{frag_cont, '$end_of_table', [{Tab,Node,Type}|Rest],Args}) ->
    +    {Spec,LockKind,Limit} = Args,
    +    InitFun = fun(FixedSpec) -> mnesia:dirty_sel_init(Node,Tab,FixedSpec,Limit,Type) end,
    +    Res = mnesia:fun_select(Tid,Ts,Tab,Spec,LockKind,Tab,InitFun,Limit,Node,Type),
    +    frag_sel_cont(Res, Rest, Args);
    +select_cont(Tid,Ts,{frag_cont, Cont, TabL, Args}) ->
    +    frag_sel_cont(mnesia:select_cont(Tid,Ts,Cont),TabL,Args);
    +select_cont(Tid,Ts,Else) ->
    +    mnesia:select_cont(Tid,Ts,Else).
    +
    +all_keys(ActivityId, Opaque, Tab, LockKind) ->
    +    Match = [mnesia:all_keys(ActivityId, Opaque, Frag, LockKind)
    +             || Frag <- frag_names(Tab)],
    +    lists:append(Match).
     
    -clear_table(ActivityId, Opaque, Tab, Obj) ->
    -    [mnesia:clear_table(ActivityId, Opaque, Frag, Obj)  || Frag <- frag_names(Tab)],
    +clear_table(ActivityId, Opaque, Tab, Obj) ->
    +    [mnesia:clear_table(ActivityId, Opaque, Frag, Obj)  || Frag <- frag_names(Tab)],
         ok.
     
    -index_match_object(ActivityId, Opaque, Tab, Pat, Attr, LockKind) ->
    +index_match_object(ActivityId, Opaque, Tab, Pat, Attr, LockKind) ->
         Match =
    -        [mnesia:index_match_object(ActivityId, Opaque, Frag, Pat, Attr, LockKind)
    -         || Frag <- frag_names(Tab)],
    -    lists:append(Match).
    +        [mnesia:index_match_object(ActivityId, Opaque, Frag, Pat, Attr, LockKind)
    +         || Frag <- frag_names(Tab)],
    +    lists:append(Match).
     
    -index_read(ActivityId, Opaque, Tab, Key, Attr, LockKind) ->
    +index_read(ActivityId, Opaque, Tab, Key, Attr, LockKind) ->
         Match =
    -        [mnesia:index_read(ActivityId, Opaque, Frag, Key, Attr, LockKind)
    -         || Frag <- frag_names(Tab)],
    -    lists:append(Match).
    -
    -foldl(ActivityId, Opaque, Fun, Acc, Tab, LockKind) ->
    -    Fun2 = fun(Frag, A) ->
    -                   mnesia:foldl(ActivityId, Opaque, Fun, A, Frag, LockKind)
    +        [mnesia:index_read(ActivityId, Opaque, Frag, Key, Attr, LockKind)
    +         || Frag <- frag_names(Tab)],
    +    lists:append(Match).
    +
    +foldl(ActivityId, Opaque, Fun, Acc, Tab, LockKind) ->
    +    Fun2 = fun(Frag, A) ->
    +                   mnesia:foldl(ActivityId, Opaque, Fun, A, Frag, LockKind)
                end,
    -    lists:foldl(Fun2, Acc, frag_names(Tab)).
    +    lists:foldl(Fun2, Acc, frag_names(Tab)).
     
    -foldr(ActivityId, Opaque, Fun, Acc, Tab, LockKind) ->
    -    Fun2 = fun(Frag, A) ->
    -                   mnesia:foldr(ActivityId, Opaque, Fun, A, Frag, LockKind)
    +foldr(ActivityId, Opaque, Fun, Acc, Tab, LockKind) ->
    +    Fun2 = fun(Frag, A) ->
    +                   mnesia:foldr(ActivityId, Opaque, Fun, A, Frag, LockKind)
                end,
    -    lists:foldr(Fun2, Acc, frag_names(Tab)).
    +    lists:foldr(Fun2, Acc, frag_names(Tab)).
     
    -table_info(ActivityId, Opaque, {Tab, Key}, Item) ->
    -    Frag = key_to_frag_name(Tab, Key),
    -    table_info2(ActivityId, Opaque, Tab, Frag, Item);
    -table_info(ActivityId, Opaque, Tab, Item) ->
    -    table_info2(ActivityId, Opaque, Tab, Tab, Item).
    +table_info(ActivityId, Opaque, {Tab, Key}, Item) ->
    +    Frag = key_to_frag_name(Tab, Key),
    +    table_info2(ActivityId, Opaque, Tab, Frag, Item);
    +table_info(ActivityId, Opaque, Tab, Item) ->
    +    table_info2(ActivityId, Opaque, Tab, Tab, Item).
     
    -table_info2(ActivityId, Opaque, Tab, Frag, Item) ->
    +table_info2(ActivityId, Opaque, Tab, Frag, Item) ->
         case Item of
             size ->
    -            SumFun = fun({_, Size}, Acc) -> Acc + Size end,
    -            lists:foldl(SumFun, 0, frag_size(ActivityId, Opaque, Tab));
    +            SumFun = fun({_, Size}, Acc) -> Acc + Size end,
    +            lists:foldl(SumFun, 0, frag_size(ActivityId, Opaque, Tab));
             memory ->
    /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia_app_c.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia_app_c.xhtml	2025-05-10 20:19:12.989225633 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia_app_c.xhtml	2025-05-10 20:19:12.997225706 +0000
    @@ -26,140 +26,140 @@
       
       mnesia_frag_hash Callback Behavior
     
    -
    -module(mnesia_frag_hash).
    --compile([{nowarn_deprecated_function, [{erlang,phash,2}]}]).
    +
    -module(mnesia_frag_hash).
    +-compile([{nowarn_deprecated_function, [{erlang,phash,2}]}]).
     
     %% Fragmented Table Hashing callback functions
    --export([
    +-export([
              init_state/2,
              add_frag/1,
              del_frag/1,
              key_to_frag_number/2,
              match_spec_to_frag_numbers/2
    -        ]).
    -record(hash_state,
    -    {n_fragments,
    +        ]).
    -record(hash_state,
    +    {n_fragments,
          next_n_to_split,
          n_doubles,
    -     function}).
    +     function}).
     
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    --spec init_state(Tab, State) -> NewState when
    -      Tab :: atom(),
    -      State :: term(),
    -      NewState :: term().
    -init_state(_Tab, State) when State == undefined ->
    -    #hash_state{n_fragments     = 1,
    +-spec init_state(Tab, State) -> NewState when
    +      Tab :: atom(),
    +      State :: term(),
    +      NewState :: term().
    +init_state(_Tab, State) when State == undefined ->
    +    #hash_state{n_fragments     = 1,
                     next_n_to_split = 1,
                     n_doubles       = 0,
    -                function        = phash2}.
    +                function        = phash2}.
     
    -convert_old_state({hash_state, N, P, L}) ->
    -    #hash_state{n_fragments     = N,
    +convert_old_state({hash_state, N, P, L}) ->
    +    #hash_state{n_fragments     = N,
                     next_n_to_split = P,
                     n_doubles       = L,
    -                function        = phash}.
    +                function        = phash}.
     
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    --spec add_frag(State :: term()) -> {NewState, IterFrags, AdditionalLockFrags} when
    -      NewState :: term(),
    -      IterFrags :: [integer()],
    -      AdditionalLockFrags :: [integer()].
    -add_frag(#hash_state{next_n_to_split = SplitN, n_doubles = L, n_fragments = N} = State) ->
    +-spec add_frag(State :: term()) -> {NewState, IterFrags, AdditionalLockFrags} when
    +      NewState :: term(),
    +      IterFrags :: [integer()],
    +      AdditionalLockFrags :: [integer()].
    +add_frag(#hash_state{next_n_to_split = SplitN, n_doubles = L, n_fragments = N} = State) ->
         P = SplitN + 1,
         NewN = N + 1,
    -    State2 = case power2(L) + 1 of
    +    State2 = case power2(L) + 1 of
             P2 when P2 == P ->
    -            State#hash_state{n_fragments      = NewN,
    +            State#hash_state{n_fragments      = NewN,
                                  n_doubles        = L + 1,
    -                             next_n_to_split  = 1};
    +                             next_n_to_split  = 1};
             _ ->
    -            State#hash_state{n_fragments     = NewN,
    -                             next_n_to_split = P}
    +            State#hash_state{n_fragments     = NewN,
    +                             next_n_to_split = P}
         end,
    -    {State2, [SplitN], [NewN]};
    -add_frag(OldState) ->
    -    State = convert_old_state(OldState),
    -    add_frag(State).
    +    {State2, [SplitN], [NewN]};
    +add_frag(OldState) ->
    +    State = convert_old_state(OldState),
    +    add_frag(State).
     
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    --spec del_frag(State :: term()) -> {NewState, IterFrags, AdditionalLockFrags} when
    -      NewState :: term(),
    -      IterFrags :: [integer()],
    -      AdditionalLockFrags :: [integer()].
    -del_frag(#hash_state{next_n_to_split = SplitN, n_doubles = L, n_fragments = N} = State) ->
    +-spec del_frag(State :: term()) -> {NewState, IterFrags, AdditionalLockFrags} when
    +      NewState :: term(),
    +      IterFrags :: [integer()],
    +      AdditionalLockFrags :: [integer()].
    +del_frag(#hash_state{next_n_to_split = SplitN, n_doubles = L, n_fragments = N} = State) ->
         P = SplitN - 1,
         if
             P < 1 ->
                 L2 = L - 1,
    -            MergeN = power2(L2),
    -            State2 = State#hash_state{n_fragments     = N - 1,
    +            MergeN = power2(L2),
    +            State2 = State#hash_state{n_fragments     = N - 1,
                                           next_n_to_split = MergeN,
    -                                      n_doubles       = L2},
    -            {State2, [N], [MergeN]};
    +                                      n_doubles       = L2},
    +            {State2, [N], [MergeN]};
             true ->
                 MergeN = P,
    -            State2 = State#hash_state{n_fragments     = N - 1,
    -                                      next_n_to_split = MergeN},
    -            {State2, [N], [MergeN]}
    +            State2 = State#hash_state{n_fragments     = N - 1,
    +                                      next_n_to_split = MergeN},
    +            {State2, [N], [MergeN]}
         end;
    -del_frag(OldState) ->
    -    State = convert_old_state(OldState),
    -    del_frag(State).
    +del_frag(OldState) ->
    +    State = convert_old_state(OldState),
    +    del_frag(State).
     
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    --spec key_to_frag_number(State, Key) -> Fragnum when
    -      State :: term(),
    -      Key :: term(),
    -      Fragnum :: integer().
    -key_to_frag_number(#hash_state{function = phash, n_fragments = N, n_doubles = L}, Key) ->
    -    A = erlang:phash(Key, power2(L + 1)),
    +-spec key_to_frag_number(State, Key) -> Fragnum when
    +      State :: term(),
    +      Key :: term(),
    +      Fragnum :: integer().
    +key_to_frag_number(#hash_state{function = phash, n_fragments = N, n_doubles = L}, Key) ->
    +    A = erlang:phash(Key, power2(L + 1)),
         if
             A > N ->
    -            A - power2(L);
    +            A - power2(L);
             true ->
                 A
         end;
    -key_to_frag_number(#hash_state{function = phash2, n_fragments = N, n_doubles = L}, Key) ->
    -    A = erlang:phash2(Key, power2(L + 1)) + 1,
    +key_to_frag_number(#hash_state{function = phash2, n_fragments = N, n_doubles = L}, Key) ->
    +    A = erlang:phash2(Key, power2(L + 1)) + 1,
         if
             A > N ->
    -            A - power2(L);
    +            A - power2(L);
             true ->
                 A
         end;
    -key_to_frag_number(OldState, Key) ->
    -    State = convert_old_state(OldState),
    -    key_to_frag_number(State, Key).
    +key_to_frag_number(OldState, Key) ->
    +    State = convert_old_state(OldState),
    +    key_to_frag_number(State, Key).
     
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    --spec match_spec_to_frag_numbers(State, MatchSpec) -> Fragnums when
    -      State :: term(),
    -      MatchSpec :: ets:match_spec(),
    -      Fragnums :: [integer()].
    -match_spec_to_frag_numbers(#hash_state{n_fragments = N} = State, MatchSpec) ->
    +-spec match_spec_to_frag_numbers(State, MatchSpec) -> Fragnums when
    +      State :: term(),
    +      MatchSpec :: ets:match_spec(),
    +      Fragnums :: [integer()].
    +match_spec_to_frag_numbers(#hash_state{n_fragments = N} = State, MatchSpec) ->
         case MatchSpec of
    -        [{HeadPat, _, _}] when is_tuple(HeadPat), tuple_size(HeadPat) > 2 ->
    -            KeyPat = element(2, HeadPat),
    -            case has_var(KeyPat) of
    +        [{HeadPat, _, _}] when is_tuple(HeadPat), tuple_size(HeadPat) > 2 ->
    +            KeyPat = element(2, HeadPat),
    +            case has_var(KeyPat) of
                     false ->
    -                    [key_to_frag_number(State, KeyPat)];
    +                    [key_to_frag_number(State, KeyPat)];
                     true ->
    -                    lists:seq(1, N)
    +                    lists:seq(1, N)
                 end;
             _ ->
    -            lists:seq(1, N)
    +            lists:seq(1, N)
         end;
    /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia_chap2.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia_chap2.xhtml	2025-05-10 20:19:12.989225633 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia_chap2.xhtml	2025-05-10 20:19:12.997225706 +0000
    @@ -32,16 +32,16 @@
     
     

    This section provides a simplified demonstration of a Mnesia system startup. The dialogue from the Erlang shell is as follows:

    % erl -mnesia dir '"/tmp/funky"'
    -Erlang/OTP 27 [erts-15.1.2]
    +Erlang/OTP 27 [erts-15.1.2]
     
    -Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
    -1> mnesia:create_schema([node()]).
    +Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
    +1> mnesia:create_schema([node()]).
     ok
    -2> mnesia:start().
    +2> mnesia:start().
     ok
    -3> mnesia:create_table(funky, []).
    -{atomic,ok}
    -4> mnesia:info().
    +3> mnesia:create_table(funky, []).
    +{atomic,ok}
    +4> mnesia:info().
     ---> Processes holding locks <--- 
     ---> Processes waiting for locks <--- 
     ---> Participant transactions <--- 
    @@ -53,18 +53,18 @@
     ===> System info in version "4.23.2", debug level = none <===
     opt_disc. Directory "/tmp/funky" is used.
     use fallback at restart = false
    -running db nodes   = [nonode@nohost]
    -stopped db nodes   = []
    -master node tables = []
    -remote             = []
    -ram_copies         = [funky]
    -disc_copies        = [schema]
    -disc_only_copies   = []
    -[{nonode@nohost,disc_copies}] = [schema]
    -[{nonode@nohost,ram_copies}] = [funky]
    +running db nodes   = [nonode@nohost]
    +stopped db nodes   = []
    +master node tables = []
    +remote             = []
    +ram_copies         = [funky]
    +disc_copies        = [schema]
    +disc_only_copies   = []
    +[{nonode@nohost,disc_copies}] = [schema]
    +[{nonode@nohost,ram_copies}] = [funky]
     3 transactions committed, 0 aborted, 0 restarted, 2 logged to disc
     0 held locks, 0 in queue; 0 local transactions, 0 remote
    -0 transactions waits for other nodes: []
    +0 transactions waits for other nodes: []
     ok

    In this example, the following actions are performed:

    • Step 1: The Erlang system is started from the UNIX prompt with a flag -mnesia dir '"/tmp/funky"', which indicates in which directory to store the data.
    • Step 2: A new empty schema is initialized on the local node by evaluating @@ -124,28 +124,28 @@ Defining Structure and Content

      First the record definitions are entered into a text file named company.hrl. -This file defines the following structure for the example database:

      -record(employee, {emp_no,
      +This file defines the following structure for the example database:

      -record(employee, {emp_no,
                          name,
                          salary,
                          sex,
                          phone,
      -                   room_no}).
      +                   room_no}).
       
      --record(dept, {id,
      -               name}).
      +-record(dept, {id,
      +               name}).
       
      --record(project, {name,
      -                  number}).
      +-record(project, {name,
      +                  number}).
       
       
      --record(manager, {emp,
      -                  dept}).
      +-record(manager, {emp,
      +                  dept}).
       
      --record(at_dep, {emp,
      -                 dept_id}).
      +-record(at_dep, {emp,
      +                 dept_id}).
       
      --record(in_proj, {emp,
      -                  proj_name}).

      The structure defines six tables in the database. In Mnesia, the function +-record(in_proj, {emp, + proj_name}).

      The structure defines six tables in the database. In Mnesia, the function mnesia:create_table(Name, Opts) creates tables. Name is the table name.

      Note

      The current version of Mnesia does not require that the name of the table is the same as the record name, see @@ -162,28 +162,28 @@

      The following shell interaction starts Mnesia and initializes the schema for the Company database:

      % erl -mnesia dir '"/ldisc/scratch/Mnesia.Company"'
      -Erlang/OTP 27 [erts-15.1.2]
      +Erlang/OTP 27 [erts-15.1.2]
       
      -Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
      -1> mnesia:create_schema([node()]).
      +Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
      +1> mnesia:create_schema([node()]).
       ok
      -2> mnesia:start().
      -ok

      The following program module creates and populates previously defined tables:

      -include_lib("stdlib/include/qlc.hrl").
      --include("company.hrl").
      -
      -init() ->
      -    mnesia:create_table(employee,
      -                        [{attributes, record_info(fields, employee)}]),
      -    mnesia:create_table(dept,
      -                        [{attributes, record_info(fields, dept)}]),
      -    mnesia:create_table(project,
      -                        [{attributes, record_info(fields, project)}]),
      -    mnesia:create_table(manager, [{type, bag},
      -                                  {attributes, record_info(fields, manager)}]),
      -    mnesia:create_table(at_dep,
      -                         [{attributes, record_info(fields, at_dep)}]),
      -    mnesia:create_table(in_proj, [{type, bag},
      -                                  {attributes, record_info(fields, in_proj)}]).

      +2> mnesia:start(). +ok

    The following program module creates and populates previously defined tables:

    -include_lib("stdlib/include/qlc.hrl").
    +-include("company.hrl").
    +
    +init() ->
    +    mnesia:create_table(employee,
    +                        [{attributes, record_info(fields, employee)}]),
    +    mnesia:create_table(dept,
    +                        [{attributes, record_info(fields, dept)}]),
    +    mnesia:create_table(project,
    +                        [{attributes, record_info(fields, project)}]),
    +    mnesia:create_table(manager, [{type, bag},
    +                                  {attributes, record_info(fields, manager)}]),
    +    mnesia:create_table(at_dep,
    +                         [{attributes, record_info(fields, at_dep)}]),
    +    mnesia:create_table(in_proj, [{type, bag},
    +                                  {attributes, record_info(fields, in_proj)}]).

    @@ -197,9 +197,9 @@ the format mnesia:create_schema(DiscNodeList) and initiates a new schema. In this example, a non-distributed system using only one node is created. Schemas are fully explained in Define a Schema.
  • mnesia:start(). This function starts Mnesia and is fully -explained in Start Mnesia.
  • Continuing the dialogue with the Erlang shell produces the following:

    3> company:init().
    -{atomic,ok}
    -4> mnesia:info().
    +explained in Start Mnesia.

    Continuing the dialogue with the Erlang shell produces the following:

    3> company:init().
    +{atomic,ok}
    +4> mnesia:info().
     ---> Processes holding locks <--- 
     ---> Processes waiting for locks <--- 
     ---> Participant transactions <--- 
    @@ -216,18 +216,18 @@
     ===> System info in version "4.23.2", debug level = none <===
     opt_disc. Directory "/ldisc/scratch/Mnesia.Company" is used.
     use fallback at restart = false
    -running db nodes   = [nonode@nohost]
    -stopped db nodes   = []
    -master node tables = []
    -remote             = []
    -ram_copies         = [at_dep,dept,employee,in_proj,manager,project]
    -disc_copies        = [schema]
    -disc_only_copies   = []
    -[{nonode@nohost,disc_copies}] = [schema]
    -[{nonode@nohost,ram_copies}] = [employee,dept,project,manager,at_dep,in_proj]
    +running db nodes   = [nonode@nohost]
    +stopped db nodes   = []
    +master node tables = []
    +remote             = []
    +ram_copies         = [at_dep,dept,employee,in_proj,manager,project]
    +disc_copies        = [schema]
    +disc_only_copies   = []
    +[{nonode@nohost,disc_copies}] = [schema]
    +[{nonode@nohost,ram_copies}] = [employee,dept,project,manager,at_dep,in_proj]
     8 transactions committed, 0 aborted, 0 restarted, 12 logged to disc
     0 held locks, 0 in queue; 0 local transactions, 0 remote
    -0 transactions waits for other nodes: []
    +0 transactions waits for other nodes: []
     ok

    A set of tables is created. The function mnesia:create_table(Name, Opts) creates the required database tables. The options available with Opts are explained in @@ -241,32 +241,32 @@ transactions have been committed, as six successful transactions were run when creating the tables.

    To write a function that inserts an employee record into the database, there must be an at_dep record and a set of in_proj records inserted. Examine the -following code used to complete this action:

    insert_emp(Emp, DeptId, ProjNames) ->
    +following code used to complete this action:

    insert_emp(Emp, DeptId, ProjNames) ->
         Ename = Emp#employee.name,
    -    Fun = fun() ->
    -                  mnesia:write(Emp),
    -                  AtDep = #at_dep{emp = Ename, dept_id = DeptId},
    -                  mnesia:write(AtDep),
    -                  mk_projs(Ename, ProjNames)
    +    Fun = fun() ->
    /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia_chap3.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia_chap3.xhtml	2025-05-10 20:19:12.989225633 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia_chap3.xhtml	2025-05-10 20:19:12.997225706 +0000
    @@ -70,18 +70,18 @@
     changes the format on all records in table Tab. It applies argument Fun to
     all records in the table. Fun must be a function that takes a record of the
     old type, and returns the record of the new type. The table key must not be
    -changed.

    Example:

    -record(old, {key, val}).
    --record(new, {key, val, extra}).
    +changed.

    Example:

    -record(old, {key, val}).
    +-record(new, {key, val, extra}).
     
     Transformer =
    -   fun(X) when record(X, old) ->
    -      #new{key = X#old.key,
    +   fun(X) when record(X, old) ->
    +      #new{key = X#old.key,
                val = X#old.val,
    -           extra = 42}
    +           extra = 42}
        end,
    -{atomic, ok} = mnesia:transform_table(foo, Transformer,
    -                                      record_info(fields, new),
    -                                      new),

    Argument Fun can also be the atom ignore, which indicates that only the +{atomic, ok} = mnesia:transform_table(foo, Transformer, + record_info(fields, new), + new),

    Argument Fun can also be the atom ignore, which indicates that only the metadata about the table is updated. Use of ignore is not recommended (as it creates inconsistencies between the metadata and the actual data) but it is included as a possibility for the user do to an own (offline) transform.

  • mnesia:change_table_copy_type(Tab, Node, ToType) @@ -133,29 +133,29 @@ when starting the Erlang shell or in the application script. Previously, the following example was used to create the directory for the Company database:

    % erl -mnesia dir '"/ldisc/scratch/Mnesia.Company"'
  • If no command-line flag is entered, the Mnesia directory becomes the current working directory on the node where the Erlang shell is started.

  • To start the Company database and get it running on the two specified nodes, -enter the following commands:

    1. On the node a@gin:
     gin % erl -sname a  -mnesia dir '"/ldisc/scratch/Mnesia.company"'
    1. On the node b@skeppet:
    skeppet % erl -sname b -mnesia dir '"/ldisc/scratch/Mnesia.company"'
    1. On one of the two nodes:
    (a@gin)1> mnesia:create_schema([a@gin, b@skeppet]).
    1. The function mnesia:start() is called on both nodes.
    2. To initialize the database, execute the following code on one of the two -nodes:
    dist_init() ->
    -    mnesia:create_table(employee,
    -                         [{ram_copies, [a@gin, b@skeppet]},
    -                          {attributes, record_info(fields,
    -                                                   employee)}]),
    -    mnesia:create_table(dept,
    -                         [{ram_copies, [a@gin, b@skeppet]},
    -                          {attributes, record_info(fields, dept)}]),
    -    mnesia:create_table(project,
    -                         [{ram_copies, [a@gin, b@skeppet]},
    -                          {attributes, record_info(fields, project)}]),
    -    mnesia:create_table(manager, [{type, bag},
    -                                  {ram_copies, [a@gin, b@skeppet]},
    -                                  {attributes, record_info(fields,
    -                                                           manager)}]),
    -    mnesia:create_table(at_dep,
    -                         [{ram_copies, [a@gin, b@skeppet]},
    -                          {attributes, record_info(fields, at_dep)}]),
    -    mnesia:create_table(in_proj,
    -                        [{type, bag},
    -                         {ram_copies, [a@gin, b@skeppet]},
    -                         {attributes, record_info(fields, in_proj)}]).

    As illustrated, the two directories reside on different nodes, because +enter the following commands:

    1. On the node a@gin:
     gin % erl -sname a  -mnesia dir '"/ldisc/scratch/Mnesia.company"'
    1. On the node b@skeppet:
    skeppet % erl -sname b -mnesia dir '"/ldisc/scratch/Mnesia.company"'
    1. On one of the two nodes:
    (a@gin)1> mnesia:create_schema([a@gin, b@skeppet]).
    1. The function mnesia:start() is called on both nodes.
    2. To initialize the database, execute the following code on one of the two +nodes:
    dist_init() ->
    +    mnesia:create_table(employee,
    +                         [{ram_copies, [a@gin, b@skeppet]},
    +                          {attributes, record_info(fields,
    +                                                   employee)}]),
    +    mnesia:create_table(dept,
    +                         [{ram_copies, [a@gin, b@skeppet]},
    +                          {attributes, record_info(fields, dept)}]),
    +    mnesia:create_table(project,
    +                         [{ram_copies, [a@gin, b@skeppet]},
    +                          {attributes, record_info(fields, project)}]),
    +    mnesia:create_table(manager, [{type, bag},
    +                                  {ram_copies, [a@gin, b@skeppet]},
    +                                  {attributes, record_info(fields,
    +                                                           manager)}]),
    +    mnesia:create_table(at_dep,
    +                         [{ram_copies, [a@gin, b@skeppet]},
    +                          {attributes, record_info(fields, at_dep)}]),
    +    mnesia:create_table(in_proj,
    +                        [{type, bag},
    +                         {ram_copies, [a@gin, b@skeppet]},
    +                         {attributes, record_info(fields, in_proj)}]).

    As illustrated, the two directories reside on different nodes, because /ldisc/scratch (the "local" disc) exists on the two different nodes.

    By executing these commands, two Erlang nodes are configured to run the Company database, and therefore, initialize the database. This is required only once when setting up. The next time the system is started, @@ -172,7 +172,7 @@ Startup Procedure

    -

    Start Mnesia by calling the following function:

    mnesia:start().

    This function initiates the DBMS locally.

    The choice of configuration alters the location and load order of the tables. +

    Start Mnesia by calling the following function:

    mnesia:start().

    This function initiates the DBMS locally.

    The choice of configuration alters the location and load order of the tables. The alternatives are as follows:

    1. Tables that are only stored locally are initialized from the local Mnesia directory.
    2. Replicated tables that reside locally as well as somewhere else are either initiated from disc or by copying the entire table from the other node, @@ -195,9 +195,9 @@ from disc at a faster rate. The function forces tables to be loaded from disc regardless of the network situation.

      Thus, it can be assumed that if an application wants to use tables a and b, the application must perform some action similar to following before it can use -the tables:

      case mnesia:wait_for_tables([a, b], 20000) of
      -  {timeout, RemainingTabs} ->
      -    panic(RemainingTabs);
      +the tables:

      case mnesia:wait_for_tables([a, b], 20000) of
      +  {timeout, RemainingTabs} ->
      +    panic(RemainingTabs);
         ok ->
           synced
       end.

      Warning

      When tables are forcefully loaded from the local disc, all operations that @@ -223,13 +223,13 @@ key, whereas a table of type bag can have an arbitrary number of records per key. The key for each record is always the first attribute of the record.

      The following example illustrates the difference between type set and -bag:

       f() ->
      -    F = fun() ->
      -          mnesia:write({foo, 1, 2}),
      -          mnesia:write({foo, 1, 3}),
      -          mnesia:read({foo, 1})
      +bag:

       f() ->
      +    F = fun() ->
      +          mnesia:write({foo, 1, 2}),
      +          mnesia:write({foo, 1, 3}),
      +          mnesia:read({foo, 1})
               end,
      -    mnesia:transaction(F).

      This transaction returns the list [{foo,1,3}] if table foo is of type + mnesia:transaction(F).

      This transaction returns the list [{foo,1,3}] if table foo is of type set. However, the list [{foo,1,2}, {foo,1,3}] is returned if the table is of type bag.

      Mnesia tables can never contain duplicates of the same record in the same table. Duplicate records have attributes with the same contents and key.

    3. {disc_copies, NodeList}, where NodeList is a list of the nodes where @@ -273,11 +273,11 @@ table. All records stored in the table must have this name as their first element. record_name defaults to the name of the table. For more information, see -Record Names versus Table Names.

    4. As an example, consider the following record definition:

      -record(funky, {x, y}).

      The following call would create a table that is replicated on two nodes, has an -extra index on attribute y, and is of type bag.

      mnesia:create_table(funky, [{disc_copies, [N1, N2]}, {index, [y]},
      -                            {type, bag}, {attributes, record_info(fields, funky)}]).

      Whereas a call to the following default code values would return a table with a +Record Names versus Table Names.

      As an example, consider the following record definition:

      -record(funky, {x, y}).

      The following call would create a table that is replicated on two nodes, has an +extra index on attribute y, and is of type bag.

      mnesia:create_table(funky, [{disc_copies, [N1, N2]}, {index, [y]},
      +                            {type, bag}, {attributes, record_info(fields, funky)}]).

      Whereas a call to the following default code values would return a table with a RAM copy on the local node, no extra indexes, and the attributes defaulted to -the list [key,val].

      mnesia:create_table(stuff, [])
      +the list [key,val].

      mnesia:create_table(stuff, [])
      /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia_chap4.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia_chap4.xhtml 2025-05-10 20:19:12.989225633 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia_chap4.xhtml 2025-05-10 20:19:12.997225706 +0000 @@ -40,14 +40,14 @@ and delete Mnesia records. The Fun is evaluated as a transaction that either commits or terminates. If a transaction succeeds in executing the Fun, it replicates the action on all nodes involved, or terminates if an error occurs.

      The following example shows a transaction that raises the salary of certain -employee numbers:

      raise(Eno, Raise) ->
      -    F = fun() ->
      -                [E] = mnesia:read(employee, Eno, write),
      +employee numbers:

      raise(Eno, Raise) ->
      +    F = fun() ->
      +                [E] = mnesia:read(employee, Eno, write),
                       Salary = E#employee.salary + Raise,
      -                New = E#employee{salary = Salary},
      -                mnesia:write(New)
      +                New = E#employee{salary = Salary},
      +                mnesia:write(New)
               end,
      -    mnesia:transaction(F).

      The function raise/2 contains a Fun made up of four code lines. This Fun is + mnesia:transaction(F).

      The function raise/2 contains a Fun made up of four code lines. This Fun is called by the statement mnesia:transaction(F) and returns a value.

      The Mnesia transaction system facilitates the construction of reliable, distributed systems by providing the following important properties:

      • The transaction handler ensures that a Fun, which is placed inside a transaction, does not interfere with operations embedded in other transactions @@ -141,15 +141,15 @@ The Fun in the transaction is evaluated once more.

        It is therefore important that the code inside the Fun given to mnesia:transaction/1 is pure. Some strange results can occur if, for example, messages are sent by the transaction Fun. The following example illustrates this -situation:

        bad_raise(Eno, Raise) ->
        -    F = fun() ->
        -                [E] = mnesia:read({employee, Eno}),
        +situation:

        bad_raise(Eno, Raise) ->
        +    F = fun() ->
        +                [E] = mnesia:read({employee, Eno}),
                         Salary = E#employee.salary + Raise,
        -                New = E#employee{salary = Salary},
        -                io:format("Trying to write ... ~n", []),
        -                mnesia:write(New)
        +                New = E#employee{salary = Salary},
        +                io:format("Trying to write ... ~n", []),
        +                mnesia:write(New)
                 end,
        -    mnesia:transaction(F).

        This transaction can write the text "Trying to write ... " 1000 times to the + mnesia:transaction(F).

        This transaction can write the text "Trying to write ... " 1000 times to the terminal. However, Mnesia guarantees that each transaction will eventually run. As a result, Mnesia is not only deadlock free, but also livelock free.

        The Mnesia programmer cannot prioritize one particular transaction to execute before other transactions that are waiting to execute. As a result, the Mnesia @@ -196,13 +196,13 @@ fails. Such applications can benefit from using sticky locks instead of the normal locking scheme.

        A sticky lock is a lock that stays in place at a node, after the transaction that first acquired the lock has terminated. To illustrate this, assume that the -following transaction is executed:

        F = fun() ->
        -      mnesia:write(#foo{a = kalle})
        +following transaction is executed:

        F = fun() ->
        +      mnesia:write(#foo{a = kalle})
             end,
        -mnesia:transaction(F).

        The foo table is replicated on the two nodes N1 and N2.

        Normal locking requires the following:

        • One network RPC (two messages) to acquire the write lock
        • Three network messages to execute the two-phase commit protocol

        If sticky locks are used, the code must first be changed as follows:

        F = fun() ->
        -      mnesia:s_write(#foo{a = kalle})
        +mnesia:transaction(F).

        The foo table is replicated on the two nodes N1 and N2.

        Normal locking requires the following:

        • One network RPC (two messages) to acquire the write lock
        • Three network messages to execute the two-phase commit protocol

        If sticky locks are used, the code must first be changed as follows:

        F = fun() ->
        +      mnesia:s_write(#foo{a = kalle})
             end,
        -mnesia:transaction(F).

        This code uses the function s_write/1 instead of the +mnesia:transaction(F).

        This code uses the function s_write/1 instead of the function write/1 The function s_write/1 sets a sticky lock instead of a normal lock. If the table is not replicated, sticky locks have no special effect. If the table is replicated, and a sticky lock is set on node @@ -228,8 +228,8 @@ following two functions are used to set explicit table locks for read and write operations:

        Alternative syntax for acquisition of table locks is as follows:

        mnesia:lock({table, Tab}, read)
        -mnesia:lock({table, Tab}, write)

        The matching operations in Mnesia can either lock the entire table or only a +on table Tab.

      Alternative syntax for acquisition of table locks is as follows:

      mnesia:lock({table, Tab}, read)
      +mnesia:lock({table, Tab}, write)

      The matching operations in Mnesia can either lock the entire table or only a single record (when the key is bound in the pattern).

      @@ -320,78 +320,78 @@ necessarily have to be the same as the table name, although this is the case in most of the examples in this User's Guide. If a table is created without property record_name, the following code ensures that all records in the -tables have the same name as the table:

      mnesia:create_table(subscriber, [])

      However, if the table is created with an explicit record name as argument, as +tables have the same name as the table:

      mnesia:create_table(subscriber, [])

      However, if the table is created with an explicit record name as argument, as shown in the following example, subscriber records can be stored in both of the -tables regardless of the table names:

      TabDef = [{record_name, subscriber}],
      -mnesia:create_table(my_subscriber, TabDef),
      -mnesia:create_table(your_subscriber, TabDef).

      To access such tables, simplified access functions (as described earlier) cannot +tables regardless of the table names:

      TabDef = [{record_name, subscriber}],
      +mnesia:create_table(my_subscriber, TabDef),
      +mnesia:create_table(your_subscriber, TabDef).

      To access such tables, simplified access functions (as described earlier) cannot be used. For example, writing a subscriber record into a table requires the function mnesia:write/3 instead of the simplified functions mnesia:write/1 -and mnesia:s_write/1:

      mnesia:write(subscriber, #subscriber{}, write)
      -mnesia:write(my_subscriber, #subscriber{}, sticky_write)
      -mnesia:write(your_subscriber, #subscriber{}, write)

      The following simple code illustrates the relationship between the simplified +and mnesia:s_write/1:

      mnesia:write(subscriber, #subscriber{}, write)
      +mnesia:write(my_subscriber, #subscriber{}, sticky_write)
      +mnesia:write(your_subscriber, #subscriber{}, write)

      The following simple code illustrates the relationship between the simplified access functions used in most of the examples and their more flexible -counterparts:

      mnesia:dirty_write(Record) ->
      -  Tab = element(1, Record),
      -  mnesia:dirty_write(Tab, Record).
      +counterparts:

      mnesia:dirty_write(Record) ->
      +  Tab = element(1, Record),
      +  mnesia:dirty_write(Tab, Record).
       
      -mnesia:dirty_delete({Tab, Key}) ->
      -  mnesia:dirty_delete(Tab, Key).
      +mnesia:dirty_delete({Tab, Key}) ->
      +  mnesia:dirty_delete(Tab, Key).
       
      -mnesia:dirty_delete_object(Record) ->
      -  Tab = element(1, Record),
      -  mnesia:dirty_delete_object(Tab, Record)
      +mnesia:dirty_delete_object(Record) ->
      +  Tab = element(1, Record),
      +  mnesia:dirty_delete_object(Tab, Record)
       
      -mnesia:dirty_update_counter({Tab, Key}, Incr) ->
      -  mnesia:dirty_update_counter(Tab, Key, Incr).
      +mnesia:dirty_update_counter({Tab, Key}, Incr) ->
      +  mnesia:dirty_update_counter(Tab, Key, Incr).
       
      -mnesia:dirty_read({Tab, Key}) ->
      -  Tab = element(1, Record),
      -  mnesia:dirty_read(Tab, Key).
      +mnesia:dirty_read({Tab, Key}) ->
      +  Tab = element(1, Record),
      +  mnesia:dirty_read(Tab, Key).
       
      -mnesia:dirty_match_object(Pattern) ->
      -  Tab = element(1, Pattern),
      -  mnesia:dirty_match_object(Tab, Pattern).
      +mnesia:dirty_match_object(Pattern) ->
      +  Tab = element(1, Pattern),
      +  mnesia:dirty_match_object(Tab, Pattern).
       
      -mnesia:dirty_index_match_object(Pattern, Attr)
      -  Tab = element(1, Pattern),
      -  mnesia:dirty_index_match_object(Tab, Pattern, Attr).
      +mnesia:dirty_index_match_object(Pattern, Attr)
      +  Tab = element(1, Pattern),
      +  mnesia:dirty_index_match_object(Tab, Pattern, Attr).
       
      -mnesia:write(Record) ->
      -  Tab = element(1, Record),
      -  mnesia:write(Tab, Record, write).
      +mnesia:write(Record) ->
      +  Tab = element(1, Record),
      +  mnesia:write(Tab, Record, write).
       
      -mnesia:s_write(Record) ->
      -  Tab = element(1, Record),
      -  mnesia:write(Tab, Record, sticky_write).
      +mnesia:s_write(Record) ->
      +  Tab = element(1, Record),
      +  mnesia:write(Tab, Record, sticky_write).
       
      -mnesia:delete({Tab, Key}) ->
      -  mnesia:delete(Tab, Key, write).
      +mnesia:delete({Tab, Key}) ->
      +  mnesia:delete(Tab, Key, write).
       
      -mnesia:s_delete({Tab, Key}) ->
      -  mnesia:delete(Tab, Key, sticky_write).
      +mnesia:s_delete({Tab, Key}) ->
      +  mnesia:delete(Tab, Key, sticky_write).
       
      -mnesia:delete_object(Record) ->
      -  Tab = element(1, Record),
      -  mnesia:delete_object(Tab, Record, write).
      +mnesia:delete_object(Record) ->
      +  Tab = element(1, Record),
      +  mnesia:delete_object(Tab, Record, write).
       
      -mnesia:s_delete_object(Record) ->
      -  Tab = element(1, Record),
      -  mnesia:delete_object(Tab, Record, sticky_write).
      +mnesia:s_delete_object(Record) ->
      +  Tab = element(1, Record),
      +  mnesia:delete_object(Tab, Record, sticky_write).
       
      -mnesia:read({Tab, Key}) ->
      -  mnesia:read(Tab, Key, read).
      +mnesia:read({Tab, Key}) ->
      +  mnesia:read(Tab, Key, read).
       
      -mnesia:wread({Tab, Key}) ->
      -  mnesia:read(Tab, Key, write).
      +mnesia:wread({Tab, Key}) ->
      +  mnesia:read(Tab, Key, write).
       
      -mnesia:match_object(Pattern) ->
      -  Tab = element(1, Pattern),
      -  mnesia:match_object(Tab, Pattern, read).
      +mnesia:match_object(Pattern) ->
      +  Tab = element(1, Pattern),
      +  mnesia:match_object(Tab, Pattern, read).
       
      -mnesia:index_match_object(Pattern, Attr) ->
      -  Tab = element(1, Pattern),
      /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia_chap5.xhtml differs (HTML document, ASCII text, with very long lines)
      --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia_chap5.xhtml	2025-05-10 20:19:12.989225633 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia_chap5.xhtml	2025-05-10 20:19:12.997225706 +0000
      @@ -62,9 +62,9 @@
       whether the data resides on the local node or on a remote node.

      Notice that the program runs slower if the data is located on a remote node.

    5. The database can be reconfigured, and tables can be moved between nodes. These operations do not affect the user programs.

    6. It has previously been shown that each table has a number of system attributes, such as index and type.

      Table attributes are specified when the table is created. For example, the -following function creates a table with two RAM replicas:

      mnesia:create_table(foo,
      -                    [{ram_copies, [N1, N2]},
      -                     {attributes, record_info(fields, foo)}]).

      Tables can also have the following properties, where each attribute has a list +following function creates a table with two RAM replicas:

      mnesia:create_table(foo,
      +                    [{ram_copies, [N1, N2]},
      +                     {attributes, record_info(fields, foo)}]).

      Tables can also have the following properties, where each attribute has a list of Erlang nodes as its value:

      • ram_copies. The value of the node list is a list of Erlang nodes, and a RAM replica of the table resides on each node in the list.

        Notice that no disc operations are performed when a program executes write operations to these replicas. However, if permanent RAM replicas are required, @@ -117,52 +117,52 @@ searched for matching records.

        Notice that in ordered_set tables, the records are ordered per fragment, and the order is undefined in results returned by select and match_object, as well as first, next, prev and last.

        The following code illustrates how a Mnesia table is converted to be a -fragmented table and how more fragments are added later:

        Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
        -(a@sam)1> mnesia:start().
        +fragmented table and how more fragments are added later:

        Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
        +(a@sam)1> mnesia:start().
         ok
        -(a@sam)2> mnesia:system_info(running_db_nodes).
        -[b@sam,c@sam,a@sam]
        +(a@sam)2> mnesia:system_info(running_db_nodes).
        +[b@sam,c@sam,a@sam]
         (a@sam)3> Tab = dictionary.
         dictionary
        -(a@sam)4> mnesia:create_table(Tab, [{ram_copies, [a@sam, b@sam]}]).
        -{atomic,ok}
        -(a@sam)5> Write = fun(Keys) -> [mnesia:write({Tab,K,-K}) || K <- Keys], ok end.
        +(a@sam)4> mnesia:create_table(Tab, [{ram_copies, [a@sam, b@sam]}]).
        +{atomic,ok}
        +(a@sam)5> Write = fun(Keys) -> [mnesia:write({Tab,K,-K}) || K <- Keys], ok end.
         #Fun<erl_eval>
        -(a@sam)6> mnesia:activity(sync_dirty, Write, [lists:seq(1, 256)], mnesia_frag).
        +(a@sam)6> mnesia:activity(sync_dirty, Write, [lists:seq(1, 256)], mnesia_frag).
         ok
        -(a@sam)7> mnesia:change_table_frag(Tab, {activate, []}).
        -{atomic,ok}
        -(a@sam)8> mnesia:table_info(Tab, frag_properties).
        -[{base_table,dictionary},
        - {foreign_key,undefined},
        - {hash_module,mnesia_frag_hash},
        - {hash_state,{hash_state,1,1,0,phash2}},
        - {n_fragments,1},
        - {node_pool,[a@sam,b@sam,c@sam]}]
        -(a@sam)9> Info = fun(Item) -> mnesia:table_info(Tab, Item) end.
        +(a@sam)7> mnesia:change_table_frag(Tab, {activate, []}).
        +{atomic,ok}
        +(a@sam)8> mnesia:table_info(Tab, frag_properties).
        +[{base_table,dictionary},
        + {foreign_key,undefined},
        + {hash_module,mnesia_frag_hash},
        + {hash_state,{hash_state,1,1,0,phash2}},
        + {n_fragments,1},
        + {node_pool,[a@sam,b@sam,c@sam]}]
        +(a@sam)9> Info = fun(Item) -> mnesia:table_info(Tab, Item) end.
         #Fun<erl_eval>
        -(a@sam)10> Dist = mnesia:activity(sync_dirty, Info, [frag_dist], mnesia_frag).
        -[{c@sam,0},{a@sam,1},{b@sam,1}]
        -(a@sam)11> mnesia:change_table_frag(Tab, {add_frag, Dist}).
        -{atomic,ok}
        -(a@sam)12> Dist2 = mnesia:activity(sync_dirty, Info, [frag_dist], mnesia_frag).
        -[{b@sam,1},{c@sam,1},{a@sam,2}]
        -(a@sam)13> mnesia:change_table_frag(Tab, {add_frag, Dist2}).
        -{atomic,ok}
        -(a@sam)14> Dist3 = mnesia:activity(sync_dirty, Info, [frag_dist], mnesia_frag).
        -[{a@sam,2},{b@sam,2},{c@sam,2}]
        -(a@sam)15> mnesia:change_table_frag(Tab, {add_frag, Dist3}).
        -{atomic,ok}
        -(a@sam)16> Read = fun(Key) -> mnesia:read({Tab, Key}) end.
        +(a@sam)10> Dist = mnesia:activity(sync_dirty, Info, [frag_dist], mnesia_frag).
        +[{c@sam,0},{a@sam,1},{b@sam,1}]
        +(a@sam)11> mnesia:change_table_frag(Tab, {add_frag, Dist}).
        +{atomic,ok}
        +(a@sam)12> Dist2 = mnesia:activity(sync_dirty, Info, [frag_dist], mnesia_frag).
        +[{b@sam,1},{c@sam,1},{a@sam,2}]
        +(a@sam)13> mnesia:change_table_frag(Tab, {add_frag, Dist2}).
        +{atomic,ok}
        +(a@sam)14> Dist3 = mnesia:activity(sync_dirty, Info, [frag_dist], mnesia_frag).
        +[{a@sam,2},{b@sam,2},{c@sam,2}]
        +(a@sam)15> mnesia:change_table_frag(Tab, {add_frag, Dist3}).
        +{atomic,ok}
        +(a@sam)16> Read = fun(Key) -> mnesia:read({Tab, Key}) end.
         #Fun<erl_eval>
        -(a@sam)17> mnesia:activity(transaction, Read, [12], mnesia_frag).
        -[{dictionary,12,-12}]
        -(a@sam)18> mnesia:activity(sync_dirty, Info, [frag_size], mnesia_frag).
        -[{dictionary,57},
        - {dictionary_frag2,63},
        - {dictionary_frag3,62},
        - {dictionary_frag4,74}]
        -(a@sam)19>

        +(a@sam)17> mnesia:activity(transaction, Read, [12], mnesia_frag). +[{dictionary,12,-12}] +(a@sam)18> mnesia:activity(sync_dirty, Info, [frag_size], mnesia_frag). +[{dictionary,57}, + {dictionary_frag2,63}, + {dictionary_frag3,62}, + {dictionary_frag4,74}] +(a@sam)19>

        @@ -204,64 +204,64 @@ This property can explicitly be set at table creation. Default is mnesia_frag_hash.

      • {hash_state, Term} - Enables a table-specific parameterization of a generic hash module. This property can explicitly be set at table creation. -Default is undefined.

        Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
        -(a@sam)1> mnesia:start().
        +Default is undefined.

        Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
        +(a@sam)1> mnesia:start().
         ok
        -(a@sam)2> PrimProps = [{n_fragments, 7}, {node_pool, [node()]}].
        -[{n_fragments,7},{node_pool,[a@sam]}]
        -(a@sam)3> mnesia:create_table(prim_dict,
        -                              [{frag_properties, PrimProps},
        -                               {attributes, [prim_key, prim_val]}]).
        -{atomic,ok}
        -(a@sam)4> SecProps = [{foreign_key, {prim_dict, sec_val}}].
        -[{foreign_key,{prim_dict,sec_val}}]
        -(a@sam)5> mnesia:create_table(sec_dict,
        -                              [{frag_properties, SecProps},
        -                               {attributes, [sec_key, sec_val]}]).
        -{atomic,ok}
        -(a@sam)6> Write = fun(Rec) -> mnesia:write(Rec) end.
        +(a@sam)2> PrimProps = [{n_fragments, 7}, {node_pool, [node()]}].
        +[{n_fragments,7},{node_pool,[a@sam]}]
        +(a@sam)3> mnesia:create_table(prim_dict,
        +                              [{frag_properties, PrimProps},
        +                               {attributes, [prim_key, prim_val]}]).
        +{atomic,ok}
        +(a@sam)4> SecProps = [{foreign_key, {prim_dict, sec_val}}].
        +[{foreign_key,{prim_dict,sec_val}}]
        +(a@sam)5> mnesia:create_table(sec_dict,
        +                              [{frag_properties, SecProps},
        +                               {attributes, [sec_key, sec_val]}]).
        +{atomic,ok}
        +(a@sam)6> Write = fun(Rec) -> mnesia:write(Rec) end.
         #Fun<erl_eval>
         (a@sam)7> PrimKey = 11.
         11
         (a@sam)8> SecKey = 42.
         42
        -(a@sam)9> mnesia:activity(sync_dirty, Write,
        -                          [{prim_dict, PrimKey, -11}], mnesia_frag).
        +(a@sam)9> mnesia:activity(sync_dirty, Write,
        +                          [{prim_dict, PrimKey, -11}], mnesia_frag).
         ok
        -(a@sam)10> mnesia:activity(sync_dirty, Write,
        -                           [{sec_dict, SecKey, PrimKey}], mnesia_frag).
        +(a@sam)10> mnesia:activity(sync_dirty, Write,
        +                           [{sec_dict, SecKey, PrimKey}], mnesia_frag).
         ok
        -(a@sam)11> mnesia:change_table_frag(prim_dict, {add_frag, [node()]}).
        -{atomic,ok}
        -(a@sam)12> SecRead = fun(PrimKey, SecKey) ->
        -               mnesia:read({sec_dict, PrimKey}, SecKey, read) end.
        +(a@sam)11> mnesia:change_table_frag(prim_dict, {add_frag, [node()]}).
        +{atomic,ok}
        +(a@sam)12> SecRead = fun(PrimKey, SecKey) ->
        +               mnesia:read({sec_dict, PrimKey}, SecKey, read) end.
         #Fun<erl_eval>
        -(a@sam)13> mnesia:activity(transaction, SecRead,
        -                           [PrimKey, SecKey], mnesia_frag).
        -[{sec_dict,42,11}]
        -(a@sam)14> Info = fun(Tab, Item) -> mnesia:table_info(Tab, Item) end.
        +(a@sam)13> mnesia:activity(transaction, SecRead,
        +                           [PrimKey, SecKey], mnesia_frag).
        +[{sec_dict,42,11}]
        +(a@sam)14> Info = fun(Tab, Item) -> mnesia:table_info(Tab, Item) end.
         #Fun<erl_eval>
        -(a@sam)15> mnesia:activity(sync_dirty, Info,
        -                           [prim_dict, frag_size], mnesia_frag).
        -[{prim_dict,0},
        - {prim_dict_frag2,0},
        - {prim_dict_frag3,1},
        - {prim_dict_frag4,0},
        - {prim_dict_frag5,0},
        - {prim_dict_frag6,0},
        - {prim_dict_frag7,0},
        - {prim_dict_frag8,0}]
        -(a@sam)16> mnesia:activity(sync_dirty, Info,
        -                           [sec_dict, frag_size], mnesia_frag).
        -[{sec_dict,0},
        - {sec_dict_frag2,0},
        - {sec_dict_frag3,1},
        - {sec_dict_frag4,0},
        - {sec_dict_frag5,0},
        - {sec_dict_frag6,0},
        - {sec_dict_frag7,0},
        - {sec_dict_frag8,0}]
        -(a@sam)17>

      +(a@sam)15> mnesia:activity(sync_dirty, Info, + [prim_dict, frag_size], mnesia_frag). +[{prim_dict,0}, + {prim_dict_frag2,0}, /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia_chap7.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia_chap7.xhtml 2025-05-10 20:19:12.989225633 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia_chap7.xhtml 2025-05-10 20:19:12.993225670 +0000 @@ -128,26 +128,26 @@ for starting Mnesia:

      • An Erlang session must be started and a Mnesia directory must be specified for the database.
      • A database schema must be initiated, using the function mnesia:create_schema/1.

      The following example shows how these tasks are performed:

      Step 1: Start an Erlang session and specify a Mnesia directory for the -database:

      % erl -sname klacke -mnesia dir '"/ldisc/scratch/klacke"'
      Erlang/OTP 27 [erts-15.1.2]
      +database:

      % erl -sname klacke -mnesia dir '"/ldisc/scratch/klacke"'
      Erlang/OTP 27 [erts-15.1.2]
       
      -Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
      -(klacke@gin)1> mnesia:create_schema([node()]).
      +Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
      +(klacke@gin)1> mnesia:create_schema([node()]).
       ok
      -(klacke@gin)2>
      +(klacke@gin)2>
       Ctrl+Z
      -[1]+  Stopped                 erl

      Step 2: You can inspect the Mnesia directory to see what files have been +[1]+ Stopped erl

      Step 2: You can inspect the Mnesia directory to see what files have been created:

      % ls -l /ldisc/scratch/klacke
       -rw-rw-r--   1 klacke   staff       247 Aug 12 15:06 FALLBACK.BUP

      The response shows that the file FALLBACK.BUP has been created. This is called a backup file, and it contains an initial schema. If more than one node in the function mnesia:create_schema/1 had been specified, identical backup files -would have been created on all nodes.

      Step 3: Start Mnesia:

      (klacke@gin)3> mnesia:start().
      +would have been created on all nodes.

      Step 3: Start Mnesia:

      (klacke@gin)3> mnesia:start().
       ok

      Step 4: You can see the following listing in the Mnesia directory:

      -rw-rw-r--   1 klacke   staff         86 May 26 19:03 LATEST.LOG
       -rw-rw-r--   1 klacke   staff      34507 May 26 19:03 schema.DAT

      The schema in the backup file FALLBACK.BUP has been used to generate the file schema.DAT. Since there are no other disc resident tables than the schema, no other data files were created. The file FALLBACK.BUP was removed after the successful "restoration". You also see some files that are for internal use by -Mnesia.

      Step 5: Create a table:

      (klacke@gin)4> mnesia:create_table(foo,[{disc_copies, [node()]}]).
      -{atomic,ok}

      Step 6: You can see the following listing in the Mnesia directory:

      % ls -l /ldisc/scratch/klacke
      +Mnesia.

      Step 5: Create a table:

      (klacke@gin)4> mnesia:create_table(foo,[{disc_copies, [node()]}]).
      +{atomic,ok}

      Step 6: You can see the following listing in the Mnesia directory:

      % ls -l /ldisc/scratch/klacke
       -rw-rw-r-- 1 klacke staff    86 May 26 19:07 LATEST.LOG
       -rw-rw-r-- 1 klacke staff    94 May 26 19:07 foo.DCD
       -rw-rw-r-- 1 klacke staff  6679 May 26 19:07 schema.DAT

      The file foo.DCD has been created. This file will eventually store all data @@ -191,11 +191,11 @@ the Mnesia data files. For example, dets contains the function dets:traverse/2, which can be used to view the contents of a Mnesia DAT file. However, this can only be done when Mnesia is not running. So, to view -the schema file, do as follows;

      {ok, N} = dets:open_file(schema, [{file, "./schema.DAT"},{repair,false},
      -{keypos, 2}]),
      -F = fun(X) -> io:format("~p~n", [X]), continue end,
      -dets:traverse(N, F),
      -dets:close(N).

      Warning

      The DAT files must always be opened with option {repair, false}. This +the schema file, do as follows;

      {ok, N} = dets:open_file(schema, [{file, "./schema.DAT"},{repair,false},
      +{keypos, 2}]),
      +F = fun(X) -> io:format("~p~n", [X]), continue end,
      +dets:traverse(N, F),
      +dets:close(N).

      Warning

      The DAT files must always be opened with option {repair, false}. This ensures that these files are not automatically repaired. Without this option, the database can become inconsistent, because Mnesia can believe that the files were properly closed. For information about configuration parameter @@ -429,38 +429,38 @@ located first in the backup.

      The schema itself is a table and is possibly included in the backup. Each node where the schema table resides is regarded as a db_node.

      The following example shows how mnesia:traverse_backup can be used to rename a -db_node in a backup file:

      change_node_name(Mod, From, To, Source, Target) ->
      +db_node in a backup file:

      change_node_name(Mod, From, To, Source, Target) ->
           Switch =
      -        fun(Node) when Node == From -> To;
      -           (Node) when Node == To -> throw({error, already_exists});
      -           (Node) -> Node
      +        fun(Node) when Node == From -> To;
      +           (Node) when Node == To -> throw({error, already_exists});
      +           (Node) -> Node
               end,
           Convert =
      -        fun({schema, version, Version}, Acc) ->
      -                {[{schema, version, Version}], Acc};
      -           ({schema, cookie, Cookie}, Acc) ->
      -                {[{schema, cookie, Cookie}], Acc};
      -           ({schema, Tab, CreateList}, Acc) ->
      -                Keys = [ram_copies, disc_copies, disc_only_copies],
      +        fun({schema, version, Version}, Acc) ->
      +                {[{schema, version, Version}], Acc};
      +           ({schema, cookie, Cookie}, Acc) ->
      +                {[{schema, cookie, Cookie}], Acc};
      +           ({schema, Tab, CreateList}, Acc) ->
      +                Keys = [ram_copies, disc_copies, disc_only_copies],
                       OptSwitch =
      -                    fun({Key, Val}) ->
      -                            case lists:member(Key, Keys) of
      -                                true -> {Key, lists:map(Switch, Val)};
      -                                false-> {Key, Val}
      +                    fun({Key, Val}) ->
      +                            case lists:member(Key, Keys) of
      +                                true -> {Key, lists:map(Switch, Val)};
      +                                false-> {Key, Val}
                                   end
                           end,
      -                {[{schema, Tab, lists:map(OptSwitch, CreateList)}], Acc};
      -           (Other, Acc) ->
      -                {[Other], Acc}
      +                {[{schema, Tab, lists:map(OptSwitch, CreateList)}], Acc};
      +           (Other, Acc) ->
      +                {[Other], Acc}
               end,
      -    mnesia:traverse_backup(Source, Mod, Target, Mod, Convert, switched).
      +    mnesia:traverse_backup(Source, Mod, Target, Mod, Convert, switched).
       
      -view(Source, Mod) ->
      -    View = fun(Item, Acc) ->
      -                   io:format("~p.~n",[Item]),
      -                   {[Item], Acc + 1}
      +view(Source, Mod) ->
      +    View = fun(Item, Acc) ->
      +                   io:format("~p.~n",[Item]),
      +                   {[Item], Acc + 1}
                  end,
      -    mnesia:traverse_backup(Source, Mod, dummy, read_only, View, 0).

      + mnesia:traverse_backup(Source, Mod, dummy, read_only, View, 0).

      /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia_registry.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia_registry.xhtml 2025-05-10 20:19:12.985225597 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.epub/OEBPS/mnesia_registry.xhtml 2025-05-10 20:19:12.993225670 +0000 @@ -142,8 +142,8 @@

      Warning

      This function is deprecated. Do not use it.

      A wrapper function for mnesia:create_table/2, which creates a table (if there is no existing table) with an appropriate set of attributes. The attributes and TabDef are forwarded to mnesia:create_table/2. For example, if the table -is to reside as disc_only_copies on all nodes, a call looks as follows:

                TabDef = [{{disc_only_copies, node()|nodes()]}],
      -          mnesia_registry:create_table(my_reg, TabDef)
      +is to reside as disc_only_copies on all nodes, a call looks as follows:

                TabDef = [{{disc_only_copies, node()|nodes()]}],
      +          mnesia_registry:create_table(my_reg, TabDef)

    /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.html 2025-05-10 20:19:13.209227628 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia.html 2025-05-10 20:19:13.249227991 +0000 @@ -166,11 +166,11 @@ specifies the types of the SNMP keys.

  • attributes. The names of the attributes for the records that are inserted in the table.

  • For information about the complete set of table properties and their details, see mnesia:create_table/2.

    This Reference Manual uses a table of persons to illustrate various examples. -The following record definition is assumed:

    -record(person, {name,
    +The following record definition is assumed:

    -record(person, {name,
                      age = 0,
                      address = unknown,
                      salary = 0,
    -                 children = []}),

    The first record attribute is the primary key, or key for short.

    The function descriptions are sorted in alphabetical order. It is recommended to + children = []}),

    The first record attribute is the primary key, or key for short.

    The function descriptions are sorted in alphabetical order. It is recommended to start to read about mnesia:create_table/2, mnesia:lock/2, and mnesia:activity/4 before you continue and learn about the rest.

    Writing or deleting in transaction-context creates a local copy of each modified record during the transaction. During iteration, that is, mnesia:foldl/4, @@ -2865,7 +2865,7 @@ -

    Change the storage type of a table.

    For example:

    mnesia:change_table_copy_type(person, node(), disc_copies)

    Transforms the person table from a RAM table into a disc-based table at +

    Change the storage type of a table.

    For example:

    mnesia:change_table_copy_type(person, node(), disc_copies)

    Transforms the person table from a RAM table into a disc-based table at Node.

    This function can also be used to change the storage type of the table named schema. The schema table can only have ram_copies or disc_copies as the storage type. If the storage type of the schema is ram_copies, no other table @@ -3116,22 +3116,22 @@ back end storage. Backend can currently be ets or dets. Properties is a list of options sent to the back end storage during table creation. Properties cannot contain properties already used by Mnesia, such as type -or named_table.

    For example:

    mnesia:create_table(table, [{ram_copies, [node()]}, {disc_only_copies, nodes()},
    -       {storage_properties,
    -        [{ets, [compressed]}, {dets, [{auto_save, 5000}]} ]}])
  • {type, Type}, where Type must be either of the atoms set, ordered_set, +or named_table.

    For example:

    mnesia:create_table(table, [{ram_copies, [node()]}, {disc_only_copies, nodes()},
    +       {storage_properties,
    +        [{ets, [compressed]}, {dets, [{auto_save, 5000}]} ]}])
  • {type, Type}, where Type must be either of the atoms set, ordered_set, or bag. Default is set. In a set, all records have unique keys. In a bag, several records can have the same key, but the record content is unique. If a non-unique record is stored, the old conflicting records are overwritten.

    Notice that currently ordered_set is not supported for disc_only_copies.

  • {local_content, Bool}, where Bool is true or false. Default is false.

  • For example, the following call creates the person table (defined earlier) and -replicates it on two nodes:

    mnesia:create_table(person,
    -    [{ram_copies, [N1, N2]},
    -     {attributes, record_info(fields, person)}]).

    If it is required that Mnesia must build and maintain an extra index table on +replicates it on two nodes:

    mnesia:create_table(person,
    +    [{ram_copies, [N1, N2]},
    +     {attributes, record_info(fields, person)}]).

    If it is required that Mnesia must build and maintain an extra index table on attribute address of all the person records that are inserted in the table, -the following code would be issued:

    mnesia:create_table(person,
    -    [{ram_copies, [N1, N2]},
    -     {index, [address]},
    -     {attributes, record_info(fields, person)}]).

    The specification of index and attributes can be hard-coded as +the following code would be issued:

    mnesia:create_table(person,
    +    [{ram_copies, [N1, N2]},
    +     {index, [address]},
    +     {attributes, record_info(fields, person)}]).

    The specification of index and attributes can be hard-coded as {index, [2]} and {attributes, [name, age, address, salary, children]}, respectively.

    mnesia:create_table/2 writes records into the table schema. This function, and all other schema manipulation functions, are implemented with the normal @@ -5381,10 +5381,10 @@ argument. Default is read. The return value depends on MatchSpec.

    Notice that for best performance, select is to be used before any modifying operations are done on that table in the same transaction. That is, do not use write or delete before a select.

    In its simplest forms, the match_spec look as follows:

    • MatchSpec = [MatchFunction]
    • MatchFunction = {MatchHead, [Guard], [Result]}
    • MatchHead = tuple() | record()

    • Guard = {"Guardtest name", ...}
    • Result = "Term construct"

    For a complete description of select, see the ERTS -User's Guide and the ets manual page in STDLIB.

    For example, to find the names of all male persons older than 30 in table Tab:

    MatchHead = #href_anchor"ss">person{name='$1', sex=male, age='$2', _='_'},
    -Guard = {'>', '$2', 30},
    +User's Guide and the ets manual page in STDLIB.

    For example, to find the names of all male persons older than 30 in table Tab:

    MatchHead = #href_anchor"ss">person{name='$1', sex=male, age='$2', _='_'},
    +Guard = {'>', '$2', 30},
     Result = '$1',
    -mnesia:select(Tab,[{MatchHead, [Guard], [Result]}]),
    +
    mnesia:select(Tab,[{MatchHead, [Guard], [Result]}]),
    @@ -5679,9 +5679,9 @@ specified as a tuple of atoms describing the types. The only significant type is fix_string. This means that a string has a fixed size.

    For example, the following causes table person to be ordered as an SNMP table:

    mnesia:snmp_open_table(person, [{key, string}])

    Consider the following schema for a table of company employees. Each employee is identified by department number and name. The other table column stores the -telephone number:

    mnesia:create_table(employee,
    -    [{snmp, [{key, {integer, string}}]},
    -     {attributes, record_info(fields, employees)}]),

    The corresponding SNMP table would have three columns: department, name, and +telephone number:

    mnesia:create_table(employee,
    +    [{snmp, [{key, {integer, string}}]},
    +     {attributes, record_info(fields, employees)}]),

    The corresponding SNMP table would have three columns: department, name, and telno.

    An option is to have table columns that are not visible through the SNMP protocol. These columns must be the last columns of the table. In the previous example, the SNMP table could have columns department and name only. The @@ -6284,17 +6284,17 @@ transaction is terminated and the function transaction/1 returns the tuple {aborted, Reason}.

    If all is going well, {atomic, ResultOfFun} is returned, where ResultOfFun is the value of the last expression in Fun.

    A function that adds a family to the database can be written as follows if there -is a structure {family, Father, Mother, ChildrenList}:

    add_family({family, F, M, Children}) ->
    -    ChildOids = lists:map(fun oid/1, Children),
    -    Trans = fun() ->
    -        mnesia:write(F#person{children = ChildOids}),
    -        mnesia:write(M#person{children = ChildOids}),
    -        Write = fun(Child) -> mnesia:write(Child) end,
    -        lists:foreach(Write, Children)
    +is a structure {family, Father, Mother, ChildrenList}:

    add_family({family, F, M, Children}) ->
    +    ChildOids = lists:map(fun oid/1, Children),
    +    Trans = fun() ->
    +        mnesia:write(F#person{children = ChildOids}),
    +        mnesia:write(M#person{children = ChildOids}),
    +        Write = fun(Child) -> mnesia:write(Child) end,
    +        lists:foreach(Write, Children)
         end,
    -    mnesia:transaction(Trans).
    +    mnesia:transaction(Trans).
     
    -oid(Rec) -> {element(1, Rec), element(2, Rec)}.

    This code adds a set of people to the database. Running this code within one +oid(Rec) -> {element(1, Rec), element(2, Rec)}.

    This code adds a set of people to the database. Running this code within one transaction ensures that either the whole family is added to the database, or the whole transaction terminates. For example, if the last child is badly formatted, or the executing process terminates because of an 'EXIT' signal @@ -6302,17 +6302,17 @@ where half a family is added can never occur.

    It is also useful to update the database within a transaction if several processes concurrently update the same records. For example, the function raise(Name, Amount), which adds Amount to the salary field of a person, is -to be implemented as follows:

    raise(Name, Amount) ->
    -    mnesia:transaction(fun() ->
    -        case mnesia:wread({person, Name}) of
    -            [P] ->
    +to be implemented as follows:

    raise(Name, Amount) ->
    +    mnesia:transaction(fun() ->
    +        case mnesia:wread({person, Name}) of
    +            [P] ->
                     Salary = Amount + P#person.salary,
    -                P2 = P#person{salary = Salary},
    -                mnesia:write(P2);
    +                P2 = P#person{salary = Salary},
    +                mnesia:write(P2);
                 _ ->
    -                mnesia:abort("No such person")
    +                mnesia:abort("No such person")
             end
    -    end).

    When this function executes within a transaction, several processes running on + end).

    When this function executes within a transaction, several processes running on different nodes can concurrently execute the function raise/2 without interfering with each other.

    Since Mnesia detects deadlocks, a transaction can be restarted any number of times and therefore the Fun shall not have any side effects such as waiting @@ -6721,7 +6721,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_app_a.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_app_a.html 2025-05-10 20:19:13.289228353 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_app_a.html 2025-05-10 20:19:13.289228353 +0000 @@ -159,11 +159,11 @@ %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --module(mnesia_backup). +-module(mnesia_backup). --include_lib("kernel/include/file.hrl"). +-include_lib("kernel/include/file.hrl"). --export([ +-export([ %% Write access open_write/1, write/2, @@ -174,105 +174,105 @@ open_read/1, read/1, close_read/1 - ]). + ]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Backup callback interface --record(backup, {tmp_file, file, file_desc}). +-record(backup, {tmp_file, file, file_desc}). %% Opens backup media for write %% %% Returns {ok, OpaqueData} or {error, Reason} -open_write(OpaqueData) -> +open_write(OpaqueData) -> File = OpaqueData, - Tmp = lists:concat([File,".BUPTMP"]), - file:delete(Tmp), - case disk_log:open([{name, make_ref()}, - {file, Tmp}, - {repair, false}, - {linkto, self()}]) of - {ok, Fd} -> - {ok, #backup{tmp_file = Tmp, file = File, file_desc = Fd}}; - {error, Reason} -> - {error, Reason} + Tmp = lists:concat([File,".BUPTMP"]), + file:delete(Tmp), + case disk_log:open([{name, make_ref()}, + {file, Tmp}, + {repair, false}, + {linkto, self()}]) of + {ok, Fd} -> + {ok, #backup{tmp_file = Tmp, file = File, file_desc = Fd}}; + {error, Reason} -> + {error, Reason} end. %% Writes BackupItems to the backup media %% %% Returns {ok, OpaqueData} or {error, Reason} -write(OpaqueData, BackupItems) -> +write(OpaqueData, BackupItems) -> B = OpaqueData, - case disk_log:log_terms(B#backup.file_desc, BackupItems) of + case disk_log:log_terms(B#backup.file_desc, BackupItems) of ok -> - {ok, B}; - {error, Reason} -> - abort_write(B), - {error, Reason} + {ok, B}; + {error, Reason} -> + abort_write(B), + {error, Reason} end. %% Closes the backup media after a successful backup %% %% Returns {ok, ReturnValueToUser} or {error, Reason} -commit_write(OpaqueData) -> +commit_write(OpaqueData) -> B = OpaqueData, - case disk_log:sync(B#backup.file_desc) of + case disk_log:sync(B#backup.file_desc) of ok -> - case disk_log:close(B#backup.file_desc) of + case disk_log:close(B#backup.file_desc) of ok -> - file:delete(B#backup.file), - case file:rename(B#backup.tmp_file, B#backup.file) of + file:delete(B#backup.file), + case file:rename(B#backup.tmp_file, B#backup.file) of ok -> - {ok, B#backup.file}; - {error, Reason} -> - {error, Reason} + {ok, B#backup.file}; + {error, Reason} -> + {error, Reason} end; - {error, Reason} -> - {error, Reason} + {error, Reason} -> + {error, Reason} end; - {error, Reason} -> - {error, Reason} + {error, Reason} -> + {error, Reason} end. %% Closes the backup media after an interrupted backup %% %% Returns {ok, ReturnValueToUser} or {error, Reason} -abort_write(BackupRef) -> - Res = disk_log:close(BackupRef#backup.file_desc), - file:delete(BackupRef#backup.tmp_file), +abort_write(BackupRef) -> + Res = disk_log:close(BackupRef#backup.file_desc), + file:delete(BackupRef#backup.tmp_file), case Res of ok -> - {ok, BackupRef#backup.file}; - {error, Reason} -> - {error, Reason} + {ok, BackupRef#backup.file}; + {error, Reason} -> + {error, Reason} end. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Restore callback interface --record(restore, {file, file_desc, cont}). +-record(restore, {file, file_desc, cont}). %% Opens backup media for read %% %% Returns {ok, OpaqueData} or {error, Reason} -open_read(OpaqueData) -> +open_read(OpaqueData) -> File = OpaqueData, - case file:read_file_info(File) of - {error, Reason} -> - {error, Reason}; + case file:read_file_info(File) of + {error, Reason} -> + {error, Reason}; _FileInfo -> %% file exists - case disk_log:open([{file, File}, - {name, make_ref()}, - {repair, false}, - {mode, read_only}, - {linkto, self()}]) of - {ok, Fd} -> - {ok, #restore{file = File, file_desc = Fd, cont = start}}; - {repaired, Fd, _, {badbytes, 0}} -> - {ok, #restore{file = File, file_desc = Fd, cont = start}}; - {repaired, Fd, _, _} -> - {ok, #restore{file = File, file_desc = Fd, cont = start}}; - {error, Reason} -> - {error, Reason} + case disk_log:open([{file, File}, + {name, make_ref()}, + {repair, false}, + {mode, read_only}, + {linkto, self()}]) of + {ok, Fd} -> + {ok, #restore{file = File, file_desc = Fd, cont = start}}; + {repaired, Fd, _, {badbytes, 0}} -> + {ok, #restore{file = File, file_desc = Fd, cont = start}}; + {repaired, Fd, _, _} -> + {ok, #restore{file = File, file_desc = Fd, cont = start}}; + {error, Reason} -> + {error, Reason} end end. @@ -281,30 +281,30 @@ %% Returns {ok, OpaqueData, BackupItems} or {error, Reason} %% %% BackupItems == [] is interpreted as eof -read(OpaqueData) -> +read(OpaqueData) -> R = OpaqueData, Fd = R#restore.file_desc, - case disk_log:chunk(Fd, R#restore.cont) of - {error, Reason} -> - {error, {"Possibly truncated", Reason}}; + case disk_log:chunk(Fd, R#restore.cont) of + {error, Reason} -> + {error, {"Possibly truncated", Reason}}; eof -> - {ok, R, []}; - {Cont, []} -> - read(R#restore{cont = Cont}); - {Cont, BackupItems, _BadBytes} -> - {ok, R#restore{cont = Cont}, BackupItems}; - {Cont, BackupItems} -> - {ok, R#restore{cont = Cont}, BackupItems} /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_app_b.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_app_b.html 2025-05-10 20:19:13.329228716 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_app_b.html 2025-05-10 20:19:13.329228716 +0000 @@ -131,10 +131,10 @@ mnesia_access Callback Behavior -
    -module(mnesia_frag).
    +
    -module(mnesia_frag).
     
     %% Callback functions when accessed within an activity
    --export([
    +-export([
              lock/4,
              write/5, delete/5, delete_object/5,
              read/5, match_object/5, all_keys/4,
    @@ -143,242 +143,242 @@
              foldl/6, foldr/6, table_info/4,
              first/3, next/4, prev/4, last/3,
              clear_table/4
    -        ]).
    +        ]).
     
     %% Callback functions which provides transparent
     %% access of fragmented tables from any activity
     %% access context.
     
    -lock(ActivityId, Opaque, {table , Tab}, LockKind) ->
    -    case frag_names(Tab) of
    -        [Tab] ->
    -            mnesia:lock(ActivityId, Opaque, {table, Tab}, LockKind);
    +lock(ActivityId, Opaque, {table , Tab}, LockKind) ->
    +    case frag_names(Tab) of
    +        [Tab] ->
    +            mnesia:lock(ActivityId, Opaque, {table, Tab}, LockKind);
             Frags ->
    -            DeepNs = [mnesia:lock(ActivityId, Opaque, {table, F}, LockKind) ||
    -                         F <- Frags],
    -            mnesia_lib:uniq(lists:append(DeepNs))
    +            DeepNs = [mnesia:lock(ActivityId, Opaque, {table, F}, LockKind) ||
    +                         F <- Frags],
    +            mnesia_lib:uniq(lists:append(DeepNs))
         end;
     
    -lock(ActivityId, Opaque, LockItem, LockKind) ->
    -    mnesia:lock(ActivityId, Opaque, LockItem, LockKind).
    +lock(ActivityId, Opaque, LockItem, LockKind) ->
    +    mnesia:lock(ActivityId, Opaque, LockItem, LockKind).
     
    -write(ActivityId, Opaque, Tab, Rec, LockKind) ->
    -    Frag = record_to_frag_name(Tab, Rec),
    -    mnesia:write(ActivityId, Opaque, Frag, Rec, LockKind).
    -
    -delete(ActivityId, Opaque, Tab, Key, LockKind) ->
    -    Frag = key_to_frag_name(Tab, Key),
    -    mnesia:delete(ActivityId, Opaque, Frag, Key, LockKind).
    -
    -delete_object(ActivityId, Opaque, Tab, Rec, LockKind) ->
    -    Frag = record_to_frag_name(Tab, Rec),
    -    mnesia:delete_object(ActivityId, Opaque, Frag, Rec, LockKind).
    -
    -read(ActivityId, Opaque, Tab, Key, LockKind) ->
    -    Frag = key_to_frag_name(Tab, Key),
    -    mnesia:read(ActivityId, Opaque, Frag, Key, LockKind).
    -
    -match_object(ActivityId, Opaque, Tab, HeadPat, LockKind) ->
    -    MatchSpec = [{HeadPat, [], ['$_']}],
    -    select(ActivityId, Opaque, Tab, MatchSpec, LockKind).
    -
    -select(ActivityId, Opaque, Tab, MatchSpec, LockKind) ->
    -    do_select(ActivityId, Opaque, Tab, MatchSpec, LockKind).
    -
    -
    -select(ActivityId, Opaque, Tab, MatchSpec, Limit, LockKind) ->
    -    init_select(ActivityId, Opaque, Tab, MatchSpec, Limit, LockKind).
    -
    -select_cont(_Tid,_,{frag_cont, '$end_of_table', [],_}) -> '$end_of_table';
    -select_cont(Tid,Ts,{frag_cont, '$end_of_table', [{Tab,Node,Type}|Rest],Args}) ->
    -    {Spec,LockKind,Limit} = Args,
    -    InitFun = fun(FixedSpec) -> mnesia:dirty_sel_init(Node,Tab,FixedSpec,Limit,Type) end,
    -    Res = mnesia:fun_select(Tid,Ts,Tab,Spec,LockKind,Tab,InitFun,Limit,Node,Type),
    -    frag_sel_cont(Res, Rest, Args);
    -select_cont(Tid,Ts,{frag_cont, Cont, TabL, Args}) ->
    -    frag_sel_cont(mnesia:select_cont(Tid,Ts,Cont),TabL,Args);
    -select_cont(Tid,Ts,Else) ->
    -    mnesia:select_cont(Tid,Ts,Else).
    -
    -all_keys(ActivityId, Opaque, Tab, LockKind) ->
    -    Match = [mnesia:all_keys(ActivityId, Opaque, Frag, LockKind)
    -             || Frag <- frag_names(Tab)],
    -    lists:append(Match).
    +write(ActivityId, Opaque, Tab, Rec, LockKind) ->
    +    Frag = record_to_frag_name(Tab, Rec),
    +    mnesia:write(ActivityId, Opaque, Frag, Rec, LockKind).
    +
    +delete(ActivityId, Opaque, Tab, Key, LockKind) ->
    +    Frag = key_to_frag_name(Tab, Key),
    +    mnesia:delete(ActivityId, Opaque, Frag, Key, LockKind).
    +
    +delete_object(ActivityId, Opaque, Tab, Rec, LockKind) ->
    +    Frag = record_to_frag_name(Tab, Rec),
    +    mnesia:delete_object(ActivityId, Opaque, Frag, Rec, LockKind).
    +
    +read(ActivityId, Opaque, Tab, Key, LockKind) ->
    +    Frag = key_to_frag_name(Tab, Key),
    +    mnesia:read(ActivityId, Opaque, Frag, Key, LockKind).
    +
    +match_object(ActivityId, Opaque, Tab, HeadPat, LockKind) ->
    +    MatchSpec = [{HeadPat, [], ['$_']}],
    +    select(ActivityId, Opaque, Tab, MatchSpec, LockKind).
    +
    +select(ActivityId, Opaque, Tab, MatchSpec, LockKind) ->
    +    do_select(ActivityId, Opaque, Tab, MatchSpec, LockKind).
    +
    +
    +select(ActivityId, Opaque, Tab, MatchSpec, Limit, LockKind) ->
    +    init_select(ActivityId, Opaque, Tab, MatchSpec, Limit, LockKind).
    +
    +select_cont(_Tid,_,{frag_cont, '$end_of_table', [],_}) -> '$end_of_table';
    +select_cont(Tid,Ts,{frag_cont, '$end_of_table', [{Tab,Node,Type}|Rest],Args}) ->
    +    {Spec,LockKind,Limit} = Args,
    +    InitFun = fun(FixedSpec) -> mnesia:dirty_sel_init(Node,Tab,FixedSpec,Limit,Type) end,
    +    Res = mnesia:fun_select(Tid,Ts,Tab,Spec,LockKind,Tab,InitFun,Limit,Node,Type),
    +    frag_sel_cont(Res, Rest, Args);
    +select_cont(Tid,Ts,{frag_cont, Cont, TabL, Args}) ->
    +    frag_sel_cont(mnesia:select_cont(Tid,Ts,Cont),TabL,Args);
    +select_cont(Tid,Ts,Else) ->
    +    mnesia:select_cont(Tid,Ts,Else).
    +
    +all_keys(ActivityId, Opaque, Tab, LockKind) ->
    +    Match = [mnesia:all_keys(ActivityId, Opaque, Frag, LockKind)
    +             || Frag <- frag_names(Tab)],
    +    lists:append(Match).
     
    -clear_table(ActivityId, Opaque, Tab, Obj) ->
    -    [mnesia:clear_table(ActivityId, Opaque, Frag, Obj)  || Frag <- frag_names(Tab)],
    +clear_table(ActivityId, Opaque, Tab, Obj) ->
    +    [mnesia:clear_table(ActivityId, Opaque, Frag, Obj)  || Frag <- frag_names(Tab)],
         ok.
     
    -index_match_object(ActivityId, Opaque, Tab, Pat, Attr, LockKind) ->
    +index_match_object(ActivityId, Opaque, Tab, Pat, Attr, LockKind) ->
         Match =
    -        [mnesia:index_match_object(ActivityId, Opaque, Frag, Pat, Attr, LockKind)
    -         || Frag <- frag_names(Tab)],
    -    lists:append(Match).
    +        [mnesia:index_match_object(ActivityId, Opaque, Frag, Pat, Attr, LockKind)
    +         || Frag <- frag_names(Tab)],
    +    lists:append(Match).
     
    -index_read(ActivityId, Opaque, Tab, Key, Attr, LockKind) ->
    +index_read(ActivityId, Opaque, Tab, Key, Attr, LockKind) ->
         Match =
    -        [mnesia:index_read(ActivityId, Opaque, Frag, Key, Attr, LockKind)
    -         || Frag <- frag_names(Tab)],
    -    lists:append(Match).
    -
    -foldl(ActivityId, Opaque, Fun, Acc, Tab, LockKind) ->
    -    Fun2 = fun(Frag, A) ->
    -                   mnesia:foldl(ActivityId, Opaque, Fun, A, Frag, LockKind)
    +        [mnesia:index_read(ActivityId, Opaque, Frag, Key, Attr, LockKind)
    +         || Frag <- frag_names(Tab)],
    +    lists:append(Match).
    +
    +foldl(ActivityId, Opaque, Fun, Acc, Tab, LockKind) ->
    +    Fun2 = fun(Frag, A) ->
    +                   mnesia:foldl(ActivityId, Opaque, Fun, A, Frag, LockKind)
                end,
    -    lists:foldl(Fun2, Acc, frag_names(Tab)).
    +    lists:foldl(Fun2, Acc, frag_names(Tab)).
     
    -foldr(ActivityId, Opaque, Fun, Acc, Tab, LockKind) ->
    -    Fun2 = fun(Frag, A) ->
    -                   mnesia:foldr(ActivityId, Opaque, Fun, A, Frag, LockKind)
    +foldr(ActivityId, Opaque, Fun, Acc, Tab, LockKind) ->
    +    Fun2 = fun(Frag, A) ->
    +                   mnesia:foldr(ActivityId, Opaque, Fun, A, Frag, LockKind)
                end,
    -    lists:foldr(Fun2, Acc, frag_names(Tab)).
    +    lists:foldr(Fun2, Acc, frag_names(Tab)).
     
    -table_info(ActivityId, Opaque, {Tab, Key}, Item) ->
    -    Frag = key_to_frag_name(Tab, Key),
    -    table_info2(ActivityId, Opaque, Tab, Frag, Item);
    -table_info(ActivityId, Opaque, Tab, Item) ->
    -    table_info2(ActivityId, Opaque, Tab, Tab, Item).
    +table_info(ActivityId, Opaque, {Tab, Key}, Item) ->
    +    Frag = key_to_frag_name(Tab, Key),
    +    table_info2(ActivityId, Opaque, Tab, Frag, Item);
    +table_info(ActivityId, Opaque, Tab, Item) ->
    +    table_info2(ActivityId, Opaque, Tab, Tab, Item).
     
    -table_info2(ActivityId, Opaque, Tab, Frag, Item) ->
    +table_info2(ActivityId, Opaque, Tab, Frag, Item) ->
         case Item of
             size ->
    -            SumFun = fun({_, Size}, Acc) -> Acc + Size end,
    -            lists:foldl(SumFun, 0, frag_size(ActivityId, Opaque, Tab));
    +            SumFun = fun({_, Size}, Acc) -> Acc + Size end,
    +            lists:foldl(SumFun, 0, frag_size(ActivityId, Opaque, Tab));
             memory ->
    /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_app_c.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_app_c.html	2025-05-10 20:19:13.357228969 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_app_c.html	2025-05-10 20:19:13.361229007 +0000
    @@ -131,140 +131,140 @@
       
       mnesia_frag_hash Callback Behavior
     
    -
    -module(mnesia_frag_hash).
    --compile([{nowarn_deprecated_function, [{erlang,phash,2}]}]).
    +
    -module(mnesia_frag_hash).
    +-compile([{nowarn_deprecated_function, [{erlang,phash,2}]}]).
     
     %% Fragmented Table Hashing callback functions
    --export([
    +-export([
              init_state/2,
              add_frag/1,
              del_frag/1,
              key_to_frag_number/2,
              match_spec_to_frag_numbers/2
    -        ]).
    -record(hash_state,
    -    {n_fragments,
    +        ]).
    -record(hash_state,
    +    {n_fragments,
          next_n_to_split,
          n_doubles,
    -     function}).
    +     function}).
     
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    --spec init_state(Tab, State) -> NewState when
    -      Tab :: atom(),
    -      State :: term(),
    -      NewState :: term().
    -init_state(_Tab, State) when State == undefined ->
    -    #hash_state{n_fragments     = 1,
    +-spec init_state(Tab, State) -> NewState when
    +      Tab :: atom(),
    +      State :: term(),
    +      NewState :: term().
    +init_state(_Tab, State) when State == undefined ->
    +    #hash_state{n_fragments     = 1,
                     next_n_to_split = 1,
                     n_doubles       = 0,
    -                function        = phash2}.
    +                function        = phash2}.
     
    -convert_old_state({hash_state, N, P, L}) ->
    -    #hash_state{n_fragments     = N,
    +convert_old_state({hash_state, N, P, L}) ->
    +    #hash_state{n_fragments     = N,
                     next_n_to_split = P,
                     n_doubles       = L,
    -                function        = phash}.
    +                function        = phash}.
     
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    --spec add_frag(State :: term()) -> {NewState, IterFrags, AdditionalLockFrags} when
    -      NewState :: term(),
    -      IterFrags :: [integer()],
    -      AdditionalLockFrags :: [integer()].
    -add_frag(#hash_state{next_n_to_split = SplitN, n_doubles = L, n_fragments = N} = State) ->
    +-spec add_frag(State :: term()) -> {NewState, IterFrags, AdditionalLockFrags} when
    +      NewState :: term(),
    +      IterFrags :: [integer()],
    +      AdditionalLockFrags :: [integer()].
    +add_frag(#hash_state{next_n_to_split = SplitN, n_doubles = L, n_fragments = N} = State) ->
         P = SplitN + 1,
         NewN = N + 1,
    -    State2 = case power2(L) + 1 of
    +    State2 = case power2(L) + 1 of
             P2 when P2 == P ->
    -            State#hash_state{n_fragments      = NewN,
    +            State#hash_state{n_fragments      = NewN,
                                  n_doubles        = L + 1,
    -                             next_n_to_split  = 1};
    +                             next_n_to_split  = 1};
             _ ->
    -            State#hash_state{n_fragments     = NewN,
    -                             next_n_to_split = P}
    +            State#hash_state{n_fragments     = NewN,
    +                             next_n_to_split = P}
         end,
    -    {State2, [SplitN], [NewN]};
    -add_frag(OldState) ->
    -    State = convert_old_state(OldState),
    -    add_frag(State).
    +    {State2, [SplitN], [NewN]};
    +add_frag(OldState) ->
    +    State = convert_old_state(OldState),
    +    add_frag(State).
     
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    --spec del_frag(State :: term()) -> {NewState, IterFrags, AdditionalLockFrags} when
    -      NewState :: term(),
    -      IterFrags :: [integer()],
    -      AdditionalLockFrags :: [integer()].
    -del_frag(#hash_state{next_n_to_split = SplitN, n_doubles = L, n_fragments = N} = State) ->
    +-spec del_frag(State :: term()) -> {NewState, IterFrags, AdditionalLockFrags} when
    +      NewState :: term(),
    +      IterFrags :: [integer()],
    +      AdditionalLockFrags :: [integer()].
    +del_frag(#hash_state{next_n_to_split = SplitN, n_doubles = L, n_fragments = N} = State) ->
         P = SplitN - 1,
         if
             P < 1 ->
                 L2 = L - 1,
    -            MergeN = power2(L2),
    -            State2 = State#hash_state{n_fragments     = N - 1,
    +            MergeN = power2(L2),
    +            State2 = State#hash_state{n_fragments     = N - 1,
                                           next_n_to_split = MergeN,
    -                                      n_doubles       = L2},
    -            {State2, [N], [MergeN]};
    +                                      n_doubles       = L2},
    +            {State2, [N], [MergeN]};
             true ->
                 MergeN = P,
    -            State2 = State#hash_state{n_fragments     = N - 1,
    -                                      next_n_to_split = MergeN},
    -            {State2, [N], [MergeN]}
    +            State2 = State#hash_state{n_fragments     = N - 1,
    +                                      next_n_to_split = MergeN},
    +            {State2, [N], [MergeN]}
         end;
    -del_frag(OldState) ->
    -    State = convert_old_state(OldState),
    -    del_frag(State).
    +del_frag(OldState) ->
    +    State = convert_old_state(OldState),
    +    del_frag(State).
     
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    --spec key_to_frag_number(State, Key) -> Fragnum when
    -      State :: term(),
    -      Key :: term(),
    -      Fragnum :: integer().
    -key_to_frag_number(#hash_state{function = phash, n_fragments = N, n_doubles = L}, Key) ->
    -    A = erlang:phash(Key, power2(L + 1)),
    +-spec key_to_frag_number(State, Key) -> Fragnum when
    +      State :: term(),
    +      Key :: term(),
    +      Fragnum :: integer().
    +key_to_frag_number(#hash_state{function = phash, n_fragments = N, n_doubles = L}, Key) ->
    +    A = erlang:phash(Key, power2(L + 1)),
         if
             A > N ->
    -            A - power2(L);
    +            A - power2(L);
             true ->
                 A
         end;
    -key_to_frag_number(#hash_state{function = phash2, n_fragments = N, n_doubles = L}, Key) ->
    -    A = erlang:phash2(Key, power2(L + 1)) + 1,
    +key_to_frag_number(#hash_state{function = phash2, n_fragments = N, n_doubles = L}, Key) ->
    +    A = erlang:phash2(Key, power2(L + 1)) + 1,
         if
             A > N ->
    -            A - power2(L);
    +            A - power2(L);
             true ->
                 A
         end;
    -key_to_frag_number(OldState, Key) ->
    -    State = convert_old_state(OldState),
    -    key_to_frag_number(State, Key).
    +key_to_frag_number(OldState, Key) ->
    +    State = convert_old_state(OldState),
    +    key_to_frag_number(State, Key).
     
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    --spec match_spec_to_frag_numbers(State, MatchSpec) -> Fragnums when
    -      State :: term(),
    -      MatchSpec :: ets:match_spec(),
    -      Fragnums :: [integer()].
    -match_spec_to_frag_numbers(#hash_state{n_fragments = N} = State, MatchSpec) ->
    +-spec match_spec_to_frag_numbers(State, MatchSpec) -> Fragnums when
    +      State :: term(),
    +      MatchSpec :: ets:match_spec(),
    +      Fragnums :: [integer()].
    +match_spec_to_frag_numbers(#hash_state{n_fragments = N} = State, MatchSpec) ->
         case MatchSpec of
    -        [{HeadPat, _, _}] when is_tuple(HeadPat), tuple_size(HeadPat) > 2 ->
    -            KeyPat = element(2, HeadPat),
    -            case has_var(KeyPat) of
    +        [{HeadPat, _, _}] when is_tuple(HeadPat), tuple_size(HeadPat) > 2 ->
    +            KeyPat = element(2, HeadPat),
    +            case has_var(KeyPat) of
                     false ->
    -                    [key_to_frag_number(State, KeyPat)];
    +                    [key_to_frag_number(State, KeyPat)];
                     true ->
    -                    lists:seq(1, N)
    +                    lists:seq(1, N)
                 end;
             _ ->
    -            lists:seq(1, N)
    +            lists:seq(1, N)
         end;
    /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap1.html differs (HTML document, UTF-8 Unicode text)
    --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap1.html	2025-05-10 20:19:13.381229187 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap1.html	2025-05-10 20:19:13.385229224 +0000
    @@ -213,7 +213,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap2.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap2.html 2025-05-10 20:19:13.417229513 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap2.html 2025-05-10 20:19:13.429229623 +0000 @@ -137,16 +137,16 @@

    This section provides a simplified demonstration of a Mnesia system startup. The dialogue from the Erlang shell is as follows:

    % erl -mnesia dir '"/tmp/funky"'
    -Erlang/OTP 27 [erts-15.1.2]
    +Erlang/OTP 27 [erts-15.1.2]
     
    -Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
    -1> mnesia:create_schema([node()]).
    +Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
    +1> mnesia:create_schema([node()]).
     ok
    -2> mnesia:start().
    +2> mnesia:start().
     ok
    -3> mnesia:create_table(funky, []).
    -{atomic,ok}
    -4> mnesia:info().
    +3> mnesia:create_table(funky, []).
    +{atomic,ok}
    +4> mnesia:info().
     ---> Processes holding locks <--- 
     ---> Processes waiting for locks <--- 
     ---> Participant transactions <--- 
    @@ -158,18 +158,18 @@
     ===> System info in version "4.23.2", debug level = none <===
     opt_disc. Directory "/tmp/funky" is used.
     use fallback at restart = false
    -running db nodes   = [nonode@nohost]
    -stopped db nodes   = []
    -master node tables = []
    -remote             = []
    -ram_copies         = [funky]
    -disc_copies        = [schema]
    -disc_only_copies   = []
    -[{nonode@nohost,disc_copies}] = [schema]
    -[{nonode@nohost,ram_copies}] = [funky]
    +running db nodes   = [nonode@nohost]
    +stopped db nodes   = []
    +master node tables = []
    +remote             = []
    +ram_copies         = [funky]
    +disc_copies        = [schema]
    +disc_only_copies   = []
    +[{nonode@nohost,disc_copies}] = [schema]
    +[{nonode@nohost,ram_copies}] = [funky]
     3 transactions committed, 0 aborted, 0 restarted, 2 logged to disc
     0 held locks, 0 in queue; 0 local transactions, 0 remote
    -0 transactions waits for other nodes: []
    +0 transactions waits for other nodes: []
     ok

    In this example, the following actions are performed:

    • Step 1: The Erlang system is started from the UNIX prompt with a flag -mnesia dir '"/tmp/funky"', which indicates in which directory to store the data.
    • Step 2: A new empty schema is initialized on the local node by evaluating @@ -229,28 +229,28 @@ Defining Structure and Content

      First the record definitions are entered into a text file named company.hrl. -This file defines the following structure for the example database:

      -record(employee, {emp_no,
      +This file defines the following structure for the example database:

      -record(employee, {emp_no,
                          name,
                          salary,
                          sex,
                          phone,
      -                   room_no}).
      +                   room_no}).
       
      --record(dept, {id,
      -               name}).
      +-record(dept, {id,
      +               name}).
       
      --record(project, {name,
      -                  number}).
      +-record(project, {name,
      +                  number}).
       
       
      --record(manager, {emp,
      -                  dept}).
      +-record(manager, {emp,
      +                  dept}).
       
      --record(at_dep, {emp,
      -                 dept_id}).
      +-record(at_dep, {emp,
      +                 dept_id}).
       
      --record(in_proj, {emp,
      -                  proj_name}).

      The structure defines six tables in the database. In Mnesia, the function +-record(in_proj, {emp, + proj_name}).

      The structure defines six tables in the database. In Mnesia, the function mnesia:create_table(Name, Opts) creates tables. Name is the table name.

      Note

      The current version of Mnesia does not require that the name of the table is the same as the record name, see @@ -267,28 +267,28 @@

      The following shell interaction starts Mnesia and initializes the schema for the Company database:

      % erl -mnesia dir '"/ldisc/scratch/Mnesia.Company"'
      -Erlang/OTP 27 [erts-15.1.2]
      +Erlang/OTP 27 [erts-15.1.2]
       
      -Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
      -1> mnesia:create_schema([node()]).
      +Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
      +1> mnesia:create_schema([node()]).
       ok
      -2> mnesia:start().
      -ok

      The following program module creates and populates previously defined tables:

      -include_lib("stdlib/include/qlc.hrl").
      --include("company.hrl").
      -
      -init() ->
      -    mnesia:create_table(employee,
      -                        [{attributes, record_info(fields, employee)}]),
      -    mnesia:create_table(dept,
      -                        [{attributes, record_info(fields, dept)}]),
      -    mnesia:create_table(project,
      -                        [{attributes, record_info(fields, project)}]),
      -    mnesia:create_table(manager, [{type, bag},
      -                                  {attributes, record_info(fields, manager)}]),
      -    mnesia:create_table(at_dep,
      -                         [{attributes, record_info(fields, at_dep)}]),
      -    mnesia:create_table(in_proj, [{type, bag},
      -                                  {attributes, record_info(fields, in_proj)}]).

      +2> mnesia:start(). +ok

    The following program module creates and populates previously defined tables:

    -include_lib("stdlib/include/qlc.hrl").
    +-include("company.hrl").
    +
    +init() ->
    +    mnesia:create_table(employee,
    +                        [{attributes, record_info(fields, employee)}]),
    +    mnesia:create_table(dept,
    +                        [{attributes, record_info(fields, dept)}]),
    +    mnesia:create_table(project,
    +                        [{attributes, record_info(fields, project)}]),
    +    mnesia:create_table(manager, [{type, bag},
    +                                  {attributes, record_info(fields, manager)}]),
    +    mnesia:create_table(at_dep,
    +                         [{attributes, record_info(fields, at_dep)}]),
    +    mnesia:create_table(in_proj, [{type, bag},
    +                                  {attributes, record_info(fields, in_proj)}]).

    @@ -302,9 +302,9 @@ the format mnesia:create_schema(DiscNodeList) and initiates a new schema. In this example, a non-distributed system using only one node is created. Schemas are fully explained in Define a Schema.
  • mnesia:start(). This function starts Mnesia and is fully -explained in Start Mnesia.
  • Continuing the dialogue with the Erlang shell produces the following:

    3> company:init().
    -{atomic,ok}
    -4> mnesia:info().
    +explained in Start Mnesia.

    Continuing the dialogue with the Erlang shell produces the following:

    3> company:init().
    +{atomic,ok}
    +4> mnesia:info().
     ---> Processes holding locks <--- 
     ---> Processes waiting for locks <--- 
     ---> Participant transactions <--- 
    @@ -321,18 +321,18 @@
     ===> System info in version "4.23.2", debug level = none <===
     opt_disc. Directory "/ldisc/scratch/Mnesia.Company" is used.
     use fallback at restart = false
    -running db nodes   = [nonode@nohost]
    -stopped db nodes   = []
    -master node tables = []
    -remote             = []
    -ram_copies         = [at_dep,dept,employee,in_proj,manager,project]
    -disc_copies        = [schema]
    -disc_only_copies   = []
    -[{nonode@nohost,disc_copies}] = [schema]
    -[{nonode@nohost,ram_copies}] = [employee,dept,project,manager,at_dep,in_proj]
    +running db nodes   = [nonode@nohost]
    +stopped db nodes   = []
    +master node tables = []
    +remote             = []
    +ram_copies         = [at_dep,dept,employee,in_proj,manager,project]
    +disc_copies        = [schema]
    +disc_only_copies   = []
    +[{nonode@nohost,disc_copies}] = [schema]
    +[{nonode@nohost,ram_copies}] = [employee,dept,project,manager,at_dep,in_proj]
     8 transactions committed, 0 aborted, 0 restarted, 12 logged to disc
     0 held locks, 0 in queue; 0 local transactions, 0 remote
    -0 transactions waits for other nodes: []
    +0 transactions waits for other nodes: []
     ok

    A set of tables is created. The function mnesia:create_table(Name, Opts) creates the required database tables. The options available with Opts are explained in @@ -346,32 +346,32 @@ transactions have been committed, as six successful transactions were run when creating the tables.

    To write a function that inserts an employee record into the database, there must be an at_dep record and a set of in_proj records inserted. Examine the -following code used to complete this action:

    insert_emp(Emp, DeptId, ProjNames) ->
    +following code used to complete this action:

    insert_emp(Emp, DeptId, ProjNames) ->
         Ename = Emp#employee.name,
    -    Fun = fun() ->
    -                  mnesia:write(Emp),
    -                  AtDep = #at_dep{emp = Ename, dept_id = DeptId},
    -                  mnesia:write(AtDep),
    -                  mk_projs(Ename, ProjNames)
    +    Fun = fun() ->
    /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap3.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap3.html	2025-05-10 20:19:13.453229840 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap3.html	2025-05-10 20:19:13.461229913 +0000
    @@ -175,18 +175,18 @@
     changes the format on all records in table Tab. It applies argument Fun to
     all records in the table. Fun must be a function that takes a record of the
     old type, and returns the record of the new type. The table key must not be
    -changed.

    Example:

    -record(old, {key, val}).
    --record(new, {key, val, extra}).
    +changed.

    Example:

    -record(old, {key, val}).
    +-record(new, {key, val, extra}).
     
     Transformer =
    -   fun(X) when record(X, old) ->
    -      #new{key = X#old.key,
    +   fun(X) when record(X, old) ->
    +      #new{key = X#old.key,
                val = X#old.val,
    -           extra = 42}
    +           extra = 42}
        end,
    -{atomic, ok} = mnesia:transform_table(foo, Transformer,
    -                                      record_info(fields, new),
    -                                      new),

    Argument Fun can also be the atom ignore, which indicates that only the +{atomic, ok} = mnesia:transform_table(foo, Transformer, + record_info(fields, new), + new),

    Argument Fun can also be the atom ignore, which indicates that only the metadata about the table is updated. Use of ignore is not recommended (as it creates inconsistencies between the metadata and the actual data) but it is included as a possibility for the user do to an own (offline) transform.

  • mnesia:change_table_copy_type(Tab, Node, ToType) @@ -238,29 +238,29 @@ when starting the Erlang shell or in the application script. Previously, the following example was used to create the directory for the Company database:

    % erl -mnesia dir '"/ldisc/scratch/Mnesia.Company"'
  • If no command-line flag is entered, the Mnesia directory becomes the current working directory on the node where the Erlang shell is started.

  • To start the Company database and get it running on the two specified nodes, -enter the following commands:

    1. On the node a@gin:
     gin % erl -sname a  -mnesia dir '"/ldisc/scratch/Mnesia.company"'
    1. On the node b@skeppet:
    skeppet % erl -sname b -mnesia dir '"/ldisc/scratch/Mnesia.company"'
    1. On one of the two nodes:
    (a@gin)1> mnesia:create_schema([a@gin, b@skeppet]).
    1. The function mnesia:start() is called on both nodes.
    2. To initialize the database, execute the following code on one of the two -nodes:
    dist_init() ->
    -    mnesia:create_table(employee,
    -                         [{ram_copies, [a@gin, b@skeppet]},
    -                          {attributes, record_info(fields,
    -                                                   employee)}]),
    -    mnesia:create_table(dept,
    -                         [{ram_copies, [a@gin, b@skeppet]},
    -                          {attributes, record_info(fields, dept)}]),
    -    mnesia:create_table(project,
    -                         [{ram_copies, [a@gin, b@skeppet]},
    -                          {attributes, record_info(fields, project)}]),
    -    mnesia:create_table(manager, [{type, bag},
    -                                  {ram_copies, [a@gin, b@skeppet]},
    -                                  {attributes, record_info(fields,
    -                                                           manager)}]),
    -    mnesia:create_table(at_dep,
    -                         [{ram_copies, [a@gin, b@skeppet]},
    -                          {attributes, record_info(fields, at_dep)}]),
    -    mnesia:create_table(in_proj,
    -                        [{type, bag},
    -                         {ram_copies, [a@gin, b@skeppet]},
    -                         {attributes, record_info(fields, in_proj)}]).

    As illustrated, the two directories reside on different nodes, because +enter the following commands:

    1. On the node a@gin:
     gin % erl -sname a  -mnesia dir '"/ldisc/scratch/Mnesia.company"'
    1. On the node b@skeppet:
    skeppet % erl -sname b -mnesia dir '"/ldisc/scratch/Mnesia.company"'
    1. On one of the two nodes:
    (a@gin)1> mnesia:create_schema([a@gin, b@skeppet]).
    1. The function mnesia:start() is called on both nodes.
    2. To initialize the database, execute the following code on one of the two +nodes:
    dist_init() ->
    +    mnesia:create_table(employee,
    +                         [{ram_copies, [a@gin, b@skeppet]},
    +                          {attributes, record_info(fields,
    +                                                   employee)}]),
    +    mnesia:create_table(dept,
    +                         [{ram_copies, [a@gin, b@skeppet]},
    +                          {attributes, record_info(fields, dept)}]),
    +    mnesia:create_table(project,
    +                         [{ram_copies, [a@gin, b@skeppet]},
    +                          {attributes, record_info(fields, project)}]),
    +    mnesia:create_table(manager, [{type, bag},
    +                                  {ram_copies, [a@gin, b@skeppet]},
    +                                  {attributes, record_info(fields,
    +                                                           manager)}]),
    +    mnesia:create_table(at_dep,
    +                         [{ram_copies, [a@gin, b@skeppet]},
    +                          {attributes, record_info(fields, at_dep)}]),
    +    mnesia:create_table(in_proj,
    +                        [{type, bag},
    +                         {ram_copies, [a@gin, b@skeppet]},
    +                         {attributes, record_info(fields, in_proj)}]).

    As illustrated, the two directories reside on different nodes, because /ldisc/scratch (the "local" disc) exists on the two different nodes.

    By executing these commands, two Erlang nodes are configured to run the Company database, and therefore, initialize the database. This is required only once when setting up. The next time the system is started, @@ -277,7 +277,7 @@ Startup Procedure

    -

    Start Mnesia by calling the following function:

    mnesia:start().

    This function initiates the DBMS locally.

    The choice of configuration alters the location and load order of the tables. +

    Start Mnesia by calling the following function:

    mnesia:start().

    This function initiates the DBMS locally.

    The choice of configuration alters the location and load order of the tables. The alternatives are as follows:

    1. Tables that are only stored locally are initialized from the local Mnesia directory.
    2. Replicated tables that reside locally as well as somewhere else are either initiated from disc or by copying the entire table from the other node, @@ -300,9 +300,9 @@ from disc at a faster rate. The function forces tables to be loaded from disc regardless of the network situation.

      Thus, it can be assumed that if an application wants to use tables a and b, the application must perform some action similar to following before it can use -the tables:

      case mnesia:wait_for_tables([a, b], 20000) of
      -  {timeout, RemainingTabs} ->
      -    panic(RemainingTabs);
      +the tables:

      case mnesia:wait_for_tables([a, b], 20000) of
      +  {timeout, RemainingTabs} ->
      +    panic(RemainingTabs);
         ok ->
           synced
       end.

      Warning

      When tables are forcefully loaded from the local disc, all operations that @@ -328,13 +328,13 @@ key, whereas a table of type bag can have an arbitrary number of records per key. The key for each record is always the first attribute of the record.

      The following example illustrates the difference between type set and -bag:

       f() ->
      -    F = fun() ->
      -          mnesia:write({foo, 1, 2}),
      -          mnesia:write({foo, 1, 3}),
      -          mnesia:read({foo, 1})
      +bag:

       f() ->
      +    F = fun() ->
      +          mnesia:write({foo, 1, 2}),
      +          mnesia:write({foo, 1, 3}),
      +          mnesia:read({foo, 1})
               end,
      -    mnesia:transaction(F).

      This transaction returns the list [{foo,1,3}] if table foo is of type + mnesia:transaction(F).

      This transaction returns the list [{foo,1,3}] if table foo is of type set. However, the list [{foo,1,2}, {foo,1,3}] is returned if the table is of type bag.

      Mnesia tables can never contain duplicates of the same record in the same table. Duplicate records have attributes with the same contents and key.

    3. {disc_copies, NodeList}, where NodeList is a list of the nodes where @@ -378,11 +378,11 @@ table. All records stored in the table must have this name as their first element. record_name defaults to the name of the table. For more information, see -Record Names versus Table Names.

    4. As an example, consider the following record definition:

      -record(funky, {x, y}).

      The following call would create a table that is replicated on two nodes, has an -extra index on attribute y, and is of type bag.

      mnesia:create_table(funky, [{disc_copies, [N1, N2]}, {index, [y]},
      -                            {type, bag}, {attributes, record_info(fields, funky)}]).

      Whereas a call to the following default code values would return a table with a +Record Names versus Table Names.

      As an example, consider the following record definition:

      -record(funky, {x, y}).

      The following call would create a table that is replicated on two nodes, has an +extra index on attribute y, and is of type bag.

      mnesia:create_table(funky, [{disc_copies, [N1, N2]}, {index, [y]},
      +                            {type, bag}, {attributes, record_info(fields, funky)}]).

      Whereas a call to the following default code values would return a table with a RAM copy on the local node, no extra indexes, and the attributes defaulted to -the list [key,val].

      mnesia:create_table(stuff, [])
      +the list [key,val].

      mnesia:create_table(stuff, [])
      @@ -433,7 +433,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap4.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap4.html 2025-05-10 20:19:13.493230203 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap4.html 2025-05-10 20:19:13.505230312 +0000 @@ -145,14 +145,14 @@ and delete Mnesia records. The Fun is evaluated as a transaction that either commits or terminates. If a transaction succeeds in executing the Fun, it replicates the action on all nodes involved, or terminates if an error occurs.

      The following example shows a transaction that raises the salary of certain -employee numbers:

      raise(Eno, Raise) ->
      -    F = fun() ->
      -                [E] = mnesia:read(employee, Eno, write),
      +employee numbers:

      raise(Eno, Raise) ->
      +    F = fun() ->
      +                [E] = mnesia:read(employee, Eno, write),
                       Salary = E#employee.salary + Raise,
      -                New = E#employee{salary = Salary},
      -                mnesia:write(New)
      +                New = E#employee{salary = Salary},
      +                mnesia:write(New)
               end,
      -    mnesia:transaction(F).

      The function raise/2 contains a Fun made up of four code lines. This Fun is + mnesia:transaction(F).

      The function raise/2 contains a Fun made up of four code lines. This Fun is called by the statement mnesia:transaction(F) and returns a value.

      The Mnesia transaction system facilitates the construction of reliable, distributed systems by providing the following important properties:

      • The transaction handler ensures that a Fun, which is placed inside a transaction, does not interfere with operations embedded in other transactions @@ -246,15 +246,15 @@ The Fun in the transaction is evaluated once more.

        It is therefore important that the code inside the Fun given to mnesia:transaction/1 is pure. Some strange results can occur if, for example, messages are sent by the transaction Fun. The following example illustrates this -situation:

        bad_raise(Eno, Raise) ->
        -    F = fun() ->
        -                [E] = mnesia:read({employee, Eno}),
        +situation:

        bad_raise(Eno, Raise) ->
        +    F = fun() ->
        +                [E] = mnesia:read({employee, Eno}),
                         Salary = E#employee.salary + Raise,
        -                New = E#employee{salary = Salary},
        -                io:format("Trying to write ... ~n", []),
        -                mnesia:write(New)
        +                New = E#employee{salary = Salary},
        +                io:format("Trying to write ... ~n", []),
        +                mnesia:write(New)
                 end,
        -    mnesia:transaction(F).

        This transaction can write the text "Trying to write ... " 1000 times to the + mnesia:transaction(F).

        This transaction can write the text "Trying to write ... " 1000 times to the terminal. However, Mnesia guarantees that each transaction will eventually run. As a result, Mnesia is not only deadlock free, but also livelock free.

        The Mnesia programmer cannot prioritize one particular transaction to execute before other transactions that are waiting to execute. As a result, the Mnesia @@ -301,13 +301,13 @@ fails. Such applications can benefit from using sticky locks instead of the normal locking scheme.

        A sticky lock is a lock that stays in place at a node, after the transaction that first acquired the lock has terminated. To illustrate this, assume that the -following transaction is executed:

        F = fun() ->
        -      mnesia:write(#foo{a = kalle})
        +following transaction is executed:

        F = fun() ->
        +      mnesia:write(#foo{a = kalle})
             end,
        -mnesia:transaction(F).

        The foo table is replicated on the two nodes N1 and N2.

        Normal locking requires the following:

        • One network RPC (two messages) to acquire the write lock
        • Three network messages to execute the two-phase commit protocol

        If sticky locks are used, the code must first be changed as follows:

        F = fun() ->
        -      mnesia:s_write(#foo{a = kalle})
        +mnesia:transaction(F).

        The foo table is replicated on the two nodes N1 and N2.

        Normal locking requires the following:

        • One network RPC (two messages) to acquire the write lock
        • Three network messages to execute the two-phase commit protocol

        If sticky locks are used, the code must first be changed as follows:

        F = fun() ->
        +      mnesia:s_write(#foo{a = kalle})
             end,
        -mnesia:transaction(F).

        This code uses the function s_write/1 instead of the +mnesia:transaction(F).

        This code uses the function s_write/1 instead of the function write/1 The function s_write/1 sets a sticky lock instead of a normal lock. If the table is not replicated, sticky locks have no special effect. If the table is replicated, and a sticky lock is set on node @@ -333,8 +333,8 @@ following two functions are used to set explicit table locks for read and write operations:

        Alternative syntax for acquisition of table locks is as follows:

        mnesia:lock({table, Tab}, read)
        -mnesia:lock({table, Tab}, write)

        The matching operations in Mnesia can either lock the entire table or only a +on table Tab.

      Alternative syntax for acquisition of table locks is as follows:

      mnesia:lock({table, Tab}, read)
      +mnesia:lock({table, Tab}, write)

      The matching operations in Mnesia can either lock the entire table or only a single record (when the key is bound in the pattern).

      @@ -425,78 +425,78 @@ necessarily have to be the same as the table name, although this is the case in most of the examples in this User's Guide. If a table is created without property record_name, the following code ensures that all records in the -tables have the same name as the table:

      mnesia:create_table(subscriber, [])

      However, if the table is created with an explicit record name as argument, as +tables have the same name as the table:

      mnesia:create_table(subscriber, [])

      However, if the table is created with an explicit record name as argument, as shown in the following example, subscriber records can be stored in both of the -tables regardless of the table names:

      TabDef = [{record_name, subscriber}],
      -mnesia:create_table(my_subscriber, TabDef),
      -mnesia:create_table(your_subscriber, TabDef).

      To access such tables, simplified access functions (as described earlier) cannot +tables regardless of the table names:

      TabDef = [{record_name, subscriber}],
      +mnesia:create_table(my_subscriber, TabDef),
      +mnesia:create_table(your_subscriber, TabDef).

      To access such tables, simplified access functions (as described earlier) cannot be used. For example, writing a subscriber record into a table requires the function mnesia:write/3 instead of the simplified functions mnesia:write/1 -and mnesia:s_write/1:

      mnesia:write(subscriber, #subscriber{}, write)
      -mnesia:write(my_subscriber, #subscriber{}, sticky_write)
      -mnesia:write(your_subscriber, #subscriber{}, write)

      The following simple code illustrates the relationship between the simplified +and mnesia:s_write/1:

      mnesia:write(subscriber, #subscriber{}, write)
      +mnesia:write(my_subscriber, #subscriber{}, sticky_write)
      +mnesia:write(your_subscriber, #subscriber{}, write)

      The following simple code illustrates the relationship between the simplified access functions used in most of the examples and their more flexible -counterparts:

      mnesia:dirty_write(Record) ->
      -  Tab = element(1, Record),
      -  mnesia:dirty_write(Tab, Record).
      +counterparts:

      mnesia:dirty_write(Record) ->
      +  Tab = element(1, Record),
      +  mnesia:dirty_write(Tab, Record).
       
      -mnesia:dirty_delete({Tab, Key}) ->
      -  mnesia:dirty_delete(Tab, Key).
      +mnesia:dirty_delete({Tab, Key}) ->
      +  mnesia:dirty_delete(Tab, Key).
       
      -mnesia:dirty_delete_object(Record) ->
      -  Tab = element(1, Record),
      -  mnesia:dirty_delete_object(Tab, Record)
      +mnesia:dirty_delete_object(Record) ->
      +  Tab = element(1, Record),
      +  mnesia:dirty_delete_object(Tab, Record)
       
      -mnesia:dirty_update_counter({Tab, Key}, Incr) ->
      -  mnesia:dirty_update_counter(Tab, Key, Incr).
      +mnesia:dirty_update_counter({Tab, Key}, Incr) ->
      +  mnesia:dirty_update_counter(Tab, Key, Incr).
       
      -mnesia:dirty_read({Tab, Key}) ->
      -  Tab = element(1, Record),
      -  mnesia:dirty_read(Tab, Key).
      +mnesia:dirty_read({Tab, Key}) ->
      +  Tab = element(1, Record),
      +  mnesia:dirty_read(Tab, Key).
       
      -mnesia:dirty_match_object(Pattern) ->
      -  Tab = element(1, Pattern),
      -  mnesia:dirty_match_object(Tab, Pattern).
      +mnesia:dirty_match_object(Pattern) ->
      +  Tab = element(1, Pattern),
      +  mnesia:dirty_match_object(Tab, Pattern).
       
      -mnesia:dirty_index_match_object(Pattern, Attr)
      -  Tab = element(1, Pattern),
      -  mnesia:dirty_index_match_object(Tab, Pattern, Attr).
      +mnesia:dirty_index_match_object(Pattern, Attr)
      +  Tab = element(1, Pattern),
      +  mnesia:dirty_index_match_object(Tab, Pattern, Attr).
       
      -mnesia:write(Record) ->
      -  Tab = element(1, Record),
      -  mnesia:write(Tab, Record, write).
      +mnesia:write(Record) ->
      +  Tab = element(1, Record),
      +  mnesia:write(Tab, Record, write).
       
      -mnesia:s_write(Record) ->
      -  Tab = element(1, Record),
      -  mnesia:write(Tab, Record, sticky_write).
      +mnesia:s_write(Record) ->
      +  Tab = element(1, Record),
      +  mnesia:write(Tab, Record, sticky_write).
       
      -mnesia:delete({Tab, Key}) ->
      -  mnesia:delete(Tab, Key, write).
      +mnesia:delete({Tab, Key}) ->
      +  mnesia:delete(Tab, Key, write).
       
      -mnesia:s_delete({Tab, Key}) ->
      -  mnesia:delete(Tab, Key, sticky_write).
      +mnesia:s_delete({Tab, Key}) ->
      +  mnesia:delete(Tab, Key, sticky_write).
       
      -mnesia:delete_object(Record) ->
      -  Tab = element(1, Record),
      -  mnesia:delete_object(Tab, Record, write).
      +mnesia:delete_object(Record) ->
      +  Tab = element(1, Record),
      +  mnesia:delete_object(Tab, Record, write).
       
      -mnesia:s_delete_object(Record) ->
      -  Tab = element(1, Record),
      -  mnesia:delete_object(Tab, Record, sticky_write).
      +mnesia:s_delete_object(Record) ->
      +  Tab = element(1, Record),
      +  mnesia:delete_object(Tab, Record, sticky_write).
       
      -mnesia:read({Tab, Key}) ->
      -  mnesia:read(Tab, Key, read).
      +mnesia:read({Tab, Key}) ->
      +  mnesia:read(Tab, Key, read).
       
      -mnesia:wread({Tab, Key}) ->
      -  mnesia:read(Tab, Key, write).
      +mnesia:wread({Tab, Key}) ->
      +  mnesia:read(Tab, Key, write).
       
      -mnesia:match_object(Pattern) ->
      -  Tab = element(1, Pattern),
      -  mnesia:match_object(Tab, Pattern, read).
      +mnesia:match_object(Pattern) ->
      +  Tab = element(1, Pattern),
      +  mnesia:match_object(Tab, Pattern, read).
       
      -mnesia:index_match_object(Pattern, Attr) ->
      -  Tab = element(1, Pattern),
      /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap5.html differs (HTML document, UTF-8 Unicode text, with very long lines)
      --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap5.html	2025-05-10 20:19:13.561230820 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap5.html	2025-05-10 20:19:13.561230820 +0000
      @@ -167,9 +167,9 @@
       whether the data resides on the local node or on a remote node.

      Notice that the program runs slower if the data is located on a remote node.

    5. The database can be reconfigured, and tables can be moved between nodes. These operations do not affect the user programs.

    6. It has previously been shown that each table has a number of system attributes, such as index and type.

      Table attributes are specified when the table is created. For example, the -following function creates a table with two RAM replicas:

      mnesia:create_table(foo,
      -                    [{ram_copies, [N1, N2]},
      -                     {attributes, record_info(fields, foo)}]).

      Tables can also have the following properties, where each attribute has a list +following function creates a table with two RAM replicas:

      mnesia:create_table(foo,
      +                    [{ram_copies, [N1, N2]},
      +                     {attributes, record_info(fields, foo)}]).

      Tables can also have the following properties, where each attribute has a list of Erlang nodes as its value:

      • ram_copies. The value of the node list is a list of Erlang nodes, and a RAM replica of the table resides on each node in the list.

        Notice that no disc operations are performed when a program executes write operations to these replicas. However, if permanent RAM replicas are required, @@ -222,52 +222,52 @@ searched for matching records.

        Notice that in ordered_set tables, the records are ordered per fragment, and the order is undefined in results returned by select and match_object, as well as first, next, prev and last.

        The following code illustrates how a Mnesia table is converted to be a -fragmented table and how more fragments are added later:

        Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
        -(a@sam)1> mnesia:start().
        +fragmented table and how more fragments are added later:

        Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
        +(a@sam)1> mnesia:start().
         ok
        -(a@sam)2> mnesia:system_info(running_db_nodes).
        -[b@sam,c@sam,a@sam]
        +(a@sam)2> mnesia:system_info(running_db_nodes).
        +[b@sam,c@sam,a@sam]
         (a@sam)3> Tab = dictionary.
         dictionary
        -(a@sam)4> mnesia:create_table(Tab, [{ram_copies, [a@sam, b@sam]}]).
        -{atomic,ok}
        -(a@sam)5> Write = fun(Keys) -> [mnesia:write({Tab,K,-K}) || K <- Keys], ok end.
        +(a@sam)4> mnesia:create_table(Tab, [{ram_copies, [a@sam, b@sam]}]).
        +{atomic,ok}
        +(a@sam)5> Write = fun(Keys) -> [mnesia:write({Tab,K,-K}) || K <- Keys], ok end.
         #Fun<erl_eval>
        -(a@sam)6> mnesia:activity(sync_dirty, Write, [lists:seq(1, 256)], mnesia_frag).
        +(a@sam)6> mnesia:activity(sync_dirty, Write, [lists:seq(1, 256)], mnesia_frag).
         ok
        -(a@sam)7> mnesia:change_table_frag(Tab, {activate, []}).
        -{atomic,ok}
        -(a@sam)8> mnesia:table_info(Tab, frag_properties).
        -[{base_table,dictionary},
        - {foreign_key,undefined},
        - {hash_module,mnesia_frag_hash},
        - {hash_state,{hash_state,1,1,0,phash2}},
        - {n_fragments,1},
        - {node_pool,[a@sam,b@sam,c@sam]}]
        -(a@sam)9> Info = fun(Item) -> mnesia:table_info(Tab, Item) end.
        +(a@sam)7> mnesia:change_table_frag(Tab, {activate, []}).
        +{atomic,ok}
        +(a@sam)8> mnesia:table_info(Tab, frag_properties).
        +[{base_table,dictionary},
        + {foreign_key,undefined},
        + {hash_module,mnesia_frag_hash},
        + {hash_state,{hash_state,1,1,0,phash2}},
        + {n_fragments,1},
        + {node_pool,[a@sam,b@sam,c@sam]}]
        +(a@sam)9> Info = fun(Item) -> mnesia:table_info(Tab, Item) end.
         #Fun<erl_eval>
        -(a@sam)10> Dist = mnesia:activity(sync_dirty, Info, [frag_dist], mnesia_frag).
        -[{c@sam,0},{a@sam,1},{b@sam,1}]
        -(a@sam)11> mnesia:change_table_frag(Tab, {add_frag, Dist}).
        -{atomic,ok}
        -(a@sam)12> Dist2 = mnesia:activity(sync_dirty, Info, [frag_dist], mnesia_frag).
        -[{b@sam,1},{c@sam,1},{a@sam,2}]
        -(a@sam)13> mnesia:change_table_frag(Tab, {add_frag, Dist2}).
        -{atomic,ok}
        -(a@sam)14> Dist3 = mnesia:activity(sync_dirty, Info, [frag_dist], mnesia_frag).
        -[{a@sam,2},{b@sam,2},{c@sam,2}]
        -(a@sam)15> mnesia:change_table_frag(Tab, {add_frag, Dist3}).
        -{atomic,ok}
        -(a@sam)16> Read = fun(Key) -> mnesia:read({Tab, Key}) end.
        +(a@sam)10> Dist = mnesia:activity(sync_dirty, Info, [frag_dist], mnesia_frag).
        +[{c@sam,0},{a@sam,1},{b@sam,1}]
        +(a@sam)11> mnesia:change_table_frag(Tab, {add_frag, Dist}).
        +{atomic,ok}
        +(a@sam)12> Dist2 = mnesia:activity(sync_dirty, Info, [frag_dist], mnesia_frag).
        +[{b@sam,1},{c@sam,1},{a@sam,2}]
        +(a@sam)13> mnesia:change_table_frag(Tab, {add_frag, Dist2}).
        +{atomic,ok}
        +(a@sam)14> Dist3 = mnesia:activity(sync_dirty, Info, [frag_dist], mnesia_frag).
        +[{a@sam,2},{b@sam,2},{c@sam,2}]
        +(a@sam)15> mnesia:change_table_frag(Tab, {add_frag, Dist3}).
        +{atomic,ok}
        +(a@sam)16> Read = fun(Key) -> mnesia:read({Tab, Key}) end.
         #Fun<erl_eval>
        -(a@sam)17> mnesia:activity(transaction, Read, [12], mnesia_frag).
        -[{dictionary,12,-12}]
        -(a@sam)18> mnesia:activity(sync_dirty, Info, [frag_size], mnesia_frag).
        -[{dictionary,57},
        - {dictionary_frag2,63},
        - {dictionary_frag3,62},
        - {dictionary_frag4,74}]
        -(a@sam)19>

        +(a@sam)17> mnesia:activity(transaction, Read, [12], mnesia_frag). +[{dictionary,12,-12}] +(a@sam)18> mnesia:activity(sync_dirty, Info, [frag_size], mnesia_frag). +[{dictionary,57}, + {dictionary_frag2,63}, + {dictionary_frag3,62}, + {dictionary_frag4,74}] +(a@sam)19>

        @@ -309,64 +309,64 @@ This property can explicitly be set at table creation. Default is mnesia_frag_hash.

      • {hash_state, Term} - Enables a table-specific parameterization of a generic hash module. This property can explicitly be set at table creation. -Default is undefined.

        Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
        -(a@sam)1> mnesia:start().
        +Default is undefined.

        Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
        +(a@sam)1> mnesia:start().
         ok
        -(a@sam)2> PrimProps = [{n_fragments, 7}, {node_pool, [node()]}].
        -[{n_fragments,7},{node_pool,[a@sam]}]
        -(a@sam)3> mnesia:create_table(prim_dict,
        -                              [{frag_properties, PrimProps},
        -                               {attributes, [prim_key, prim_val]}]).
        -{atomic,ok}
        -(a@sam)4> SecProps = [{foreign_key, {prim_dict, sec_val}}].
        -[{foreign_key,{prim_dict,sec_val}}]
        -(a@sam)5> mnesia:create_table(sec_dict,
        -                              [{frag_properties, SecProps},
        -                               {attributes, [sec_key, sec_val]}]).
        -{atomic,ok}
        -(a@sam)6> Write = fun(Rec) -> mnesia:write(Rec) end.
        +(a@sam)2> PrimProps = [{n_fragments, 7}, {node_pool, [node()]}].
        +[{n_fragments,7},{node_pool,[a@sam]}]
        +(a@sam)3> mnesia:create_table(prim_dict,
        +                              [{frag_properties, PrimProps},
        +                               {attributes, [prim_key, prim_val]}]).
        +{atomic,ok}
        +(a@sam)4> SecProps = [{foreign_key, {prim_dict, sec_val}}].
        +[{foreign_key,{prim_dict,sec_val}}]
        +(a@sam)5> mnesia:create_table(sec_dict,
        +                              [{frag_properties, SecProps},
        +                               {attributes, [sec_key, sec_val]}]).
        +{atomic,ok}
        +(a@sam)6> Write = fun(Rec) -> mnesia:write(Rec) end.
         #href_anchor"n">Fun<erl_eval>
         (a@sam)7> PrimKey = 11.
         11
         (a@sam)8> SecKey = 42.
         42
        -(a@sam)9> mnesia:activity(sync_dirty, Write,
        -                          [{prim_dict, PrimKey, -11}], mnesia_frag).
        +(a@sam)9> mnesia:activity(sync_dirty, Write,
        +                          [{prim_dict, PrimKey, -11}], mnesia_frag).
         ok
        -(a@sam)10> mnesia:activity(sync_dirty, Write,
        -                           [{sec_dict, SecKey, PrimKey}], mnesia_frag).
        +(a@sam)10> mnesia:activity(sync_dirty, Write,
        +                           [{sec_dict, SecKey, PrimKey}], mnesia_frag).
         ok
        -(a@sam)11> mnesia:change_table_frag(prim_dict, {add_frag, [node()]}).
        -{atomic,ok}
        -(a@sam)12> SecRead = fun(PrimKey, SecKey) ->
        -               mnesia:read({sec_dict, PrimKey}, SecKey, read) end.
        +(a@sam)11> mnesia:change_table_frag(prim_dict, {add_frag, [node()]}).
        +{atomic,ok}
        +(a@sam)12> SecRead = fun(PrimKey, SecKey) ->
        +               mnesia:read({sec_dict, PrimKey}, SecKey, read) end.
         #Fun<erl_eval>
        -(a@sam)13> mnesia:activity(transaction, SecRead,
        -                           [PrimKey, SecKey], mnesia_frag).
        -[{sec_dict,42,11}]
        -(a@sam)14> Info = fun(Tab, Item) -> mnesia:table_info(Tab, Item) end.
        +(a@sam)13> mnesia:activity(transaction, SecRead,
        +                           [PrimKey, SecKey], mnesia_frag).
        +[{sec_dict,42,11}]
        +(a@sam)14> Info = fun(Tab, Item) -> mnesia:table_info(Tab, Item) end.
         #Fun<erl_eval>
        -(a@sam)15> mnesia:activity(sync_dirty, Info,
        -                           [prim_dict, frag_size], mnesia_frag).
        -[{prim_dict,0},
        - {prim_dict_frag2,0},
        - {prim_dict_frag3,1},
        - {prim_dict_frag4,0},
        - {prim_dict_frag5,0},
        - {prim_dict_frag6,0},
        - {prim_dict_frag7,0},
        - {prim_dict_frag8,0}]
        -(a@sam)16> mnesia:activity(sync_dirty, Info,
        -                           [sec_dict, frag_size], mnesia_frag).
        -[{sec_dict,0},
        - {sec_dict_frag2,0},
        - {sec_dict_frag3,1},
        - {sec_dict_frag4,0},
        - {sec_dict_frag5,0},
        - {sec_dict_frag6,0},
        - {sec_dict_frag7,0},
        - {sec_dict_frag8,0}]
        -(a@sam)17>

      +(a@sam)15> mnesia:activity(sync_dirty, Info, + [prim_dict, frag_size], mnesia_frag). +[{prim_dict,0}, + {prim_dict_frag2,0}, /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap7.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap7.html 2025-05-10 20:19:13.601231182 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap7.html 2025-05-10 20:19:13.601231182 +0000 @@ -233,26 +233,26 @@ for starting Mnesia:

      • An Erlang session must be started and a Mnesia directory must be specified for the database.
      • A database schema must be initiated, using the function mnesia:create_schema/1.

      The following example shows how these tasks are performed:

      Step 1: Start an Erlang session and specify a Mnesia directory for the -database:

      % erl -sname klacke -mnesia dir '"/ldisc/scratch/klacke"'
      Erlang/OTP 27 [erts-15.1.2]
      +database:

      % erl -sname klacke -mnesia dir '"/ldisc/scratch/klacke"'
      Erlang/OTP 27 [erts-15.1.2]
       
      -Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
      -(klacke@gin)1> mnesia:create_schema([node()]).
      +Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
      +(klacke@gin)1> mnesia:create_schema([node()]).
       ok
      -(klacke@gin)2>
      +(klacke@gin)2>
       Ctrl+Z
      -[1]+  Stopped                 erl

      Step 2: You can inspect the Mnesia directory to see what files have been +[1]+ Stopped erl

      Step 2: You can inspect the Mnesia directory to see what files have been created:

      % ls -l /ldisc/scratch/klacke
       -rw-rw-r--   1 klacke   staff       247 Aug 12 15:06 FALLBACK.BUP

      The response shows that the file FALLBACK.BUP has been created. This is called a backup file, and it contains an initial schema. If more than one node in the function mnesia:create_schema/1 had been specified, identical backup files -would have been created on all nodes.

      Step 3: Start Mnesia:

      (klacke@gin)3> mnesia:start().
      +would have been created on all nodes.

      Step 3: Start Mnesia:

      (klacke@gin)3> mnesia:start().
       ok

      Step 4: You can see the following listing in the Mnesia directory:

      -rw-rw-r--   1 klacke   staff         86 May 26 19:03 LATEST.LOG
       -rw-rw-r--   1 klacke   staff      34507 May 26 19:03 schema.DAT

      The schema in the backup file FALLBACK.BUP has been used to generate the file schema.DAT. Since there are no other disc resident tables than the schema, no other data files were created. The file FALLBACK.BUP was removed after the successful "restoration". You also see some files that are for internal use by -Mnesia.

      Step 5: Create a table:

      (klacke@gin)4> mnesia:create_table(foo,[{disc_copies, [node()]}]).
      -{atomic,ok}

      Step 6: You can see the following listing in the Mnesia directory:

      % ls -l /ldisc/scratch/klacke
      +Mnesia.

      Step 5: Create a table:

      (klacke@gin)4> mnesia:create_table(foo,[{disc_copies, [node()]}]).
      +{atomic,ok}

      Step 6: You can see the following listing in the Mnesia directory:

      % ls -l /ldisc/scratch/klacke
       -rw-rw-r-- 1 klacke staff    86 May 26 19:07 LATEST.LOG
       -rw-rw-r-- 1 klacke staff    94 May 26 19:07 foo.DCD
       -rw-rw-r-- 1 klacke staff  6679 May 26 19:07 schema.DAT

      The file foo.DCD has been created. This file will eventually store all data @@ -296,11 +296,11 @@ the Mnesia data files. For example, dets contains the function dets:traverse/2, which can be used to view the contents of a Mnesia DAT file. However, this can only be done when Mnesia is not running. So, to view -the schema file, do as follows;

      {ok, N} = dets:open_file(schema, [{file, "./schema.DAT"},{repair,false},
      -{keypos, 2}]),
      -F = fun(X) -> io:format("~p~n", [X]), continue end,
      -dets:traverse(N, F),
      -dets:close(N).

      Warning

      The DAT files must always be opened with option {repair, false}. This +the schema file, do as follows;

      {ok, N} = dets:open_file(schema, [{file, "./schema.DAT"},{repair,false},
      +{keypos, 2}]),
      +F = fun(X) -> io:format("~p~n", [X]), continue end,
      +dets:traverse(N, F),
      +dets:close(N).

      Warning

      The DAT files must always be opened with option {repair, false}. This ensures that these files are not automatically repaired. Without this option, the database can become inconsistent, because Mnesia can believe that the files were properly closed. For information about configuration parameter @@ -534,38 +534,38 @@ located first in the backup.

      The schema itself is a table and is possibly included in the backup. Each node where the schema table resides is regarded as a db_node.

      The following example shows how mnesia:traverse_backup can be used to rename a -db_node in a backup file:

      change_node_name(Mod, From, To, Source, Target) ->
      +db_node in a backup file:

      change_node_name(Mod, From, To, Source, Target) ->
           Switch =
      -        fun(Node) when Node == From -> To;
      -           (Node) when Node == To -> throw({error, already_exists});
      -           (Node) -> Node
      +        fun(Node) when Node == From -> To;
      +           (Node) when Node == To -> throw({error, already_exists});
      +           (Node) -> Node
               end,
           Convert =
      -        fun({schema, version, Version}, Acc) ->
      -                {[{schema, version, Version}], Acc};
      -           ({schema, cookie, Cookie}, Acc) ->
      -                {[{schema, cookie, Cookie}], Acc};
      -           ({schema, Tab, CreateList}, Acc) ->
      -                Keys = [ram_copies, disc_copies, disc_only_copies],
      +        fun({schema, version, Version}, Acc) ->
      +                {[{schema, version, Version}], Acc};
      +           ({schema, cookie, Cookie}, Acc) ->
      +                {[{schema, cookie, Cookie}], Acc};
      +           ({schema, Tab, CreateList}, Acc) ->
      +                Keys = [ram_copies, disc_copies, disc_only_copies],
                       OptSwitch =
      -                    fun({Key, Val}) ->
      -                            case lists:member(Key, Keys) of
      -                                true -> {Key, lists:map(Switch, Val)};
      -                                false-> {Key, Val}
      +                    fun({Key, Val}) ->
      +                            case lists:member(Key, Keys) of
      +                                true -> {Key, lists:map(Switch, Val)};
      +                                false-> {Key, Val}
                                   end
                           end,
      -                {[{schema, Tab, lists:map(OptSwitch, CreateList)}], Acc};
      -           (Other, Acc) ->
      -                {[Other], Acc}
      +                {[{schema, Tab, lists:map(OptSwitch, CreateList)}], Acc};
      +           (Other, Acc) ->
      +                {[Other], Acc}
               end,
      -    mnesia:traverse_backup(Source, Mod, Target, Mod, Convert, switched).
      +    mnesia:traverse_backup(Source, Mod, Target, Mod, Convert, switched).
       
      -view(Source, Mod) ->
      -    View = fun(Item, Acc) ->
      -                   io:format("~p.~n",[Item]),
      -                   {[Item], Acc + 1}
      +view(Source, Mod) ->
      +    View = fun(Item, Acc) ->
      +                   io:format("~p.~n",[Item]),
      +                   {[Item], Acc + 1}
                  end,
      -    mnesia:traverse_backup(Source, Mod, dummy, read_only, View, 0).

      + mnesia:traverse_backup(Source, Mod, dummy, read_only, View, 0).

      @@ -709,7 +709,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap8.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap8.html 2025-05-10 20:19:13.621231364 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_chap8.html 2025-05-10 20:19:13.621231364 +0000 @@ -191,7 +191,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_frag_hash.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_frag_hash.html 2025-05-10 20:19:13.649231617 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_frag_hash.html 2025-05-10 20:19:13.649231617 +0000 @@ -419,7 +419,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_overview.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_overview.html 2025-05-10 20:19:13.673231834 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_overview.html 2025-05-10 20:19:13.673231834 +0000 @@ -243,7 +243,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_registry.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_registry.html 2025-05-10 20:19:13.697232052 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/mnesia_registry.html 2025-05-10 20:19:13.697232052 +0000 @@ -258,8 +258,8 @@

      Warning

      This function is deprecated. Do not use it.

      A wrapper function for mnesia:create_table/2, which creates a table (if there is no existing table) with an appropriate set of attributes. The attributes and TabDef are forwarded to mnesia:create_table/2. For example, if the table -is to reside as disc_only_copies on all nodes, a call looks as follows:

                TabDef = [{{disc_only_copies, node()|nodes()]}],
      -          mnesia_registry:create_table(my_reg, TabDef)
      +is to reside as disc_only_copies on all nodes, a call looks as follows:

                TabDef = [{{disc_only_copies, node()|nodes()]}],
      +          mnesia_registry:create_table(my_reg, TabDef)

    @@ -288,7 +288,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/notes.html 2025-05-10 20:19:13.741232451 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/notes.html 2025-05-10 20:19:13.741232451 +0000 @@ -1539,7 +1539,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/search.html 2025-05-10 20:19:13.757232596 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.5/doc/html/search.html 2025-05-10 20:19:13.761232632 +0000 @@ -145,7 +145,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/404.html 2025-05-10 20:19:13.777232778 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/404.html 2025-05-10 20:19:13.777232778 +0000 @@ -147,7 +147,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/api-reference.html 2025-05-10 20:19:13.797232959 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/api-reference.html 2025-05-10 20:19:13.797232959 +0000 @@ -213,7 +213,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/cdv_cmd.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/cdv_cmd.html 2025-05-10 20:19:13.817233140 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/cdv_cmd.html 2025-05-10 20:19:13.817233140 +0000 @@ -182,7 +182,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/crashdump_ug.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/crashdump_ug.html 2025-05-10 20:19:13.841233358 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/crashdump_ug.html 2025-05-10 20:19:13.845233394 +0000 @@ -371,7 +371,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/crashdump_viewer.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/crashdump_viewer.html 2025-05-10 20:19:13.861233539 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/crashdump_viewer.html 2025-05-10 20:19:13.865233575 +0000 @@ -303,7 +303,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/etop.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/etop.html 2025-05-10 20:19:13.885233757 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/etop.html 2025-05-10 20:19:13.889233793 +0000 @@ -435,7 +435,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/etop_ug.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/etop_ug.html 2025-05-10 20:19:13.909233975 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/etop_ug.html 2025-05-10 20:19:13.909233975 +0000 @@ -273,7 +273,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/introduction_ug.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/introduction_ug.html 2025-05-10 20:19:13.929234155 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/introduction_ug.html 2025-05-10 20:19:13.933234192 +0000 @@ -189,7 +189,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/notes.html 2025-05-10 20:19:13.961234445 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/notes.html 2025-05-10 20:19:13.969234519 +0000 @@ -1168,7 +1168,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer.epub/OEBPS/content.opf 2025-05-10 20:19:13.993234736 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer.epub/OEBPS/content.opf 2025-05-10 20:19:13.997234772 +0000 @@ -4,10 +4,10 @@ version="3.0"> observer - 2.17 - urn:uuid:8111e883-627b-cc4f-e9ee-5cccc4dbddcf + urn:uuid:b39cdeb7-e26b-0b42-3953-002bce9894d5 en - 2025-05-10T20:11:51Z + 2041-06-12T09:31:58Z /usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer.epub/OEBPS/ttb.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer.epub/OEBPS/ttb.xhtml 2025-05-10 20:19:13.993234736 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer.epub/OEBPS/ttb.xhtml 2025-05-10 20:19:13.997234772 +0000 @@ -1809,13 +1809,13 @@ is "contaminated" with token seq_trace.

    If Flags = all, all possible flags are set.

    The possible values for SeqTraceFlag are available in seq_trace.

    For a description of the match_spec() syntax, see section Match Specifications in Erlang in ERTS, which explains the general match specification "language".

    Note

    The system tracer for sequential tracing is automatically initiated by ttb -when a trace port is started with ttb:tracer/0,1,2.

    An example of how to use function seq_trigger_ms/0,1 follows:

    (tiger@durin)5> ttb:tracer().
    -{ok,[tiger@durin]}
    -(tiger@durin)6> ttb:p(all,call).
    -{ok,{[all],[call]}}
    -(tiger@durin)7> ttb:tp(mod,func,ttb:seq_trigger_ms()).
    -{ok,[{matched,1},{saved,1}]}
    -(tiger@durin)8>

    Whenever mod:func(...) is called after this, token seq_trace is set on the +when a trace port is started with ttb:tracer/0,1,2.

    An example of how to use function seq_trigger_ms/0,1 follows:

    (tiger@durin)5> ttb:tracer().
    +{ok,[tiger@durin]}
    +(tiger@durin)6> ttb:p(all,call).
    +{ok,{[all],[call]}}
    +(tiger@durin)7> ttb:tp(mod,func,ttb:seq_trigger_ms()).
    +{ok,[{matched,1},{saved,1}]}
    +(tiger@durin)8>

    Whenever mod:func(...) is called after this, token seq_trace is set on the executing process.

    @@ -1854,14 +1854,14 @@

    This function is a shortcut allowing to start a trace with one command. Each tuple in Patterns is converted to a list, which in turn is passed to -ttb:tpl/2,3,4.

    The call:

    > ttb:start_trace([Node, OtherNode],
    -                  [{mod, foo, []}, {mod, bar, 2}],
    -                  {all, call},
    -                  [{file, File}, {handler,{fun myhandler/4, S}}]).

    is equivalent to:

    > ttb:start_trace([Node, OtherNode],
    -                  [{file, File}, {handler,{fun myhandler/4, S}}]),
    -ttb:tpl(mod, foo, []),
    -ttb:tpl(mod, bar, 2, []),
    -ttb:p(all, call).
    +ttb:tpl/2,3,4.

    The call:

    > ttb:start_trace([Node, OtherNode],
    +                  [{mod, foo, []}, {mod, bar, 2}],
    +                  {all, call},
    +                  [{file, File}, {handler,{fun myhandler/4, S}}]).

    is equivalent to:

    > ttb:start_trace([Node, OtherNode],
    +                  [{file, File}, {handler,{fun myhandler/4, S}}]),
    +ttb:tpl(mod, foo, []),
    +ttb:tpl(mod, bar, 2, []),
    +ttb:p(all, call).
    /usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer.epub/OEBPS/ttb_ug.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer.epub/OEBPS/ttb_ug.xhtml 2025-05-10 20:19:13.993234736 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer.epub/OEBPS/ttb_ug.xhtml 2025-05-10 20:19:13.997234772 +0000 @@ -67,56 +67,56 @@ Tracing Local Node from Erlang Shell -

    The following small module is used in the subsequent example:

    -module(m).
    --export([f/0]).
    -f() ->
    +

    The following small module is used in the subsequent example:

    -module(m).
    +-export([f/0]).
    +f() ->
        receive
    -      From when is_pid(From) ->
    -         Now = erlang:now(),
    -         From ! {self(),Now}
    +      From when is_pid(From) ->
    +         Now = erlang:now(),
    +         From ! {self(),Now}
        end.

    The following example shows the basic use of ttb from the Erlang shell. Default options are used both for starting the tracer and for formatting (the custom fetch directory is however provided). This gives a trace log named Node-ttb in the newly created directory, where Node is the node name. The default handler prints the formatted trace messages in the shell:

    (tiger@durin)47> %% First I spawn a process running my test function
    -(tiger@durin)47> Pid = spawn(m,f,[]).
    +(tiger@durin)47> Pid = spawn(m,f,[]).
     <0.125.0>
    -(tiger@durin)48>
    +(tiger@durin)48>
     (tiger@durin)48> %% Then I start a tracer...
    -(tiger@durin)48> ttb:tracer().
    -{ok,[tiger@durin]}
    -(tiger@durin)49>
    +(tiger@durin)48> ttb:tracer().
    +{ok,[tiger@durin]}
    +(tiger@durin)49>
     (tiger@durin)49> %% and activate the new process for tracing
     (tiger@durin)49> %% function calls and sent messages.
    -(tiger@durin)49> ttb:p(Pid,[call,send]).
    -{ok,[{<0.125.0>,[{matched,tiger@durin,1}]}]}
    -(tiger@durin)50>
    +(tiger@durin)49> ttb:p(Pid,[call,send]).
    +{ok,[{<0.125.0>,[{matched,tiger@durin,1}]}]}
    +(tiger@durin)50>
     (tiger@durin)50> %% Here I set a trace pattern on erlang:now/0
     (tiger@durin)50> %% The trace pattern is a simple match spec
     (tiger@durin)50> %% indicating that the return value should be
     (tiger@durin)50> %% traced. Refer to the reference_manual for
     (tiger@durin)50> %% the full list of match spec shortcuts
     (tiger@durin)50> %% available.
    -(tiger@durin)51> ttb:tp(erlang,now,return).
    -{ok,[{matched,tiger@durin,1},{saved,1}]}
    -(tiger@durin)52>
    +(tiger@durin)51> ttb:tp(erlang,now,return).
    +{ok,[{matched,tiger@durin,1},{saved,1}]}
    +(tiger@durin)52>
     (tiger@durin)52> %% I run my test (i.e. send a message to
     (tiger@durin)52> %% my new process)
    -(tiger@durin)52> Pid ! self().
    +(tiger@durin)52> Pid ! self().
     <0.72.0>
    -(tiger@durin)53>
    +(tiger@durin)53>
     (tiger@durin)53> %% And then I have to stop ttb in order to flush
     (tiger@durin)53> %% the trace port buffer
    -(tiger@durin)53> ttb:stop([return, {fetch_dir, "fetch"}]).
    -{stopped, "fetch"}
    -(tiger@durin)54>
    +(tiger@durin)53> ttb:stop([return, {fetch_dir, "fetch"}]).
    +{stopped, "fetch"}
    +(tiger@durin)54>
     (tiger@durin)54> %% Finally I format my trace log
    -(tiger@durin)54> ttb:format("fetch").
    -({<0.125.0>,{m,f,0},tiger@durin}) call erlang:now()
    -({<0.125.0>,{m,f,0},tiger@durin}) returned from erlang:now/0 ->
    -{1031,133451,667611}
    -({<0.125.0>,{m,f,0},tiger@durin}) <0.72.0> !
    -{<0.125.0>,{1031,133451,667611}}
    +(tiger@durin)54> ttb:format("fetch").
    +({<0.125.0>,{m,f,0},tiger@durin}) call erlang:now()
    +({<0.125.0>,{m,f,0},tiger@durin}) returned from erlang:now/0 ->
    +{1031,133451,667611}
    +({<0.125.0>,{m,f,0},tiger@durin}) <0.72.0> !
    +{<0.125.0>,{1031,133451,667611}}
     ok

    @@ -124,65 +124,65 @@ Build Your Own Tool

    The following example shows a simple tool for "debug tracing", that is, tracing -of function calls with return values:

    -module(mydebug).
    --export([start/0,trc/1,stop/0,format/1]).
    --export([print/4]).
    +of function calls with return values:

    -module(mydebug).
    +-export([start/0,trc/1,stop/0,format/1]).
    +-export([print/4]).
     %% Include ms_transform.hrl so that I can use dbg:fun2ms/2 to
     %% generate match specifications.
    --include_lib("stdlib/include/ms_transform.hrl").
    +-include_lib("stdlib/include/ms_transform.hrl").
     %%% -------------Tool API-------------
     %%% ----------------------------------
     %%% Star the "mydebug" tool
    -start() ->
    +start() ->
         %% The options specify that the binary log shall be named
         %% <Node>-debug_log and that the print/4 function in this
         %% module shall be used as format handler
    -    ttb:tracer(all,[{file,"debug_log"},{handler,{{?MODULE,print},0}}]),
    +    ttb:tracer(all,[{file,"debug_log"},{handler,{{?MODULE,print},0}}]),
         %% All processes (existing and new) shall trace function calls
         %% We want trace messages to be sorted upon format, which requires
         %% timestamp flag. The flag is however enabled by default in ttb.
    -    ttb:p(all,call).
    +    ttb:p(all,call).
     
     %%% Set trace pattern on function(s)
    -trc(M) when is_atom(M) ->
    -    trc({M,'_','_'});
    -trc({M,F}) when is_atom(M), is_atom(F) ->
    -    trc({M,F,'_'});
    -trc({M,F,_A}=MFA) when is_atom(M), is_atom(F) ->
    +trc(M) when is_atom(M) ->
    +    trc({M,'_','_'});
    +trc({M,F}) when is_atom(M), is_atom(F) ->
    +    trc({M,F,'_'});
    +trc({M,F,_A}=MFA) when is_atom(M), is_atom(F) ->
         %% This match spec shortcut specifies that return values shall
         %% be traced.
    -    MatchSpec = dbg:fun2ms(fun(_) -> return_trace() end),
    -    ttb:tpl(MFA,MatchSpec).
    +    MatchSpec = dbg:fun2ms(fun(_) -> return_trace() end),
    +    ttb:tpl(MFA,MatchSpec).
     
     %%% Format a binary trace log
    -format(Dir) ->
    -    ttb:format(Dir).
    +format(Dir) ->
    +    ttb:format(Dir).
     
     %%% Stop the "mydebug" tool
    -stop() ->
    -    ttb:stop(return).
    +stop() ->
    +    ttb:stop(return).
     
     %%% --------Internal functions--------
     %%% ----------------------------------
     %%% Format handler
    -print(_Out,end_of_trace,_TI,N) ->
    +print(_Out,end_of_trace,_TI,N) ->
         N;
    -print(Out,Trace,_TI,N) ->
    -    do_print(Out,Trace,N),
    +print(Out,Trace,_TI,N) ->
    +    do_print(Out,Trace,N),
         N+1.
     
    -do_print(Out,{trace_ts,P,call,{M,F,A},Ts},N) ->
    -    io:format(Out,
    +do_print(Out,{trace_ts,P,call,{M,F,A},Ts},N) ->
    +    io:format(Out,
                   "~w: ~w, ~w:~n"
                   "Call      : ~w:~w/~w~n"
                   "Arguments :~p~n~n",
    -              [N,Ts,P,M,F,length(A),A]);
    -do_print(Out,{trace_ts,P,return_from,{M,F,A},R,Ts},N) ->
    -    io:format(Out,
    +              [N,Ts,P,M,F,length(A),A]);
    +do_print(Out,{trace_ts,P,return_from,{M,F,A},R,Ts},N) ->
    +    io:format(Out,
                   "~w: ~w, ~w:~n"
                   "Return from  : ~w:~w/~w~n"
                   "Return value :~p~n~n",
    -              [N,Ts,P,M,F,A,R]).

    To distinguish trace logs produced with this tool from other logs, option file + [N,Ts,P,M,F,A,R]).

    To distinguish trace logs produced with this tool from other logs, option file is used in tracer/2. The logs are therefore fetched to a directory named ttb_upload_debug_log-YYYYMMDD-HHMMSS

    By using option handler when starting the tracer, the information about how to format the file is stored in the trace information file (.ti). This is not @@ -214,9 +214,9 @@

    If the traced node is diskless, ttb must be started from a trace control node with disk access, and option file must be specified to function tracer/2 -with value {local, File}, for example:

    (trace_control@durin)1> ttb:tracer(mynode@diskless,
    -                                   {file,{local,{wrap,"mytrace"}}}).
    -{ok,[mynode@diskless]}

    +with value {local, File}, for example:

    (trace_control@durin)1> ttb:tracer(mynode@diskless,
    +                                   {file,{local,{wrap,"mytrace"}}}).
    +{ok,[mynode@diskless]}

    @@ -236,10 +236,10 @@ Opts as argument.

    The timer is started with ttb:p/2, so any trace patterns must be set up in advance. ttb:start_trace/4 always sets up all patterns before invoking ttb:p/2.

    The following example shows how to set up a trace that is automatically stopped -and formatted after 5 seconds:

    (tiger@durin)1> ttb:start_trace([node()],
    -                                [{erlang, now,[]}],
    -                                {all, call},
    /usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer.html	2025-05-10 20:19:14.069235425 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer.html	2025-05-10 20:19:14.069235425 +0000
    @@ -391,7 +391,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer_app.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer_app.html 2025-05-10 20:19:14.089235606 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer_app.html 2025-05-10 20:19:14.093235642 +0000 @@ -189,7 +189,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer_ug.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer_ug.html 2025-05-10 20:19:14.113235824 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer_ug.html 2025-05-10 20:19:14.117235860 +0000 @@ -335,7 +335,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/search.html 2025-05-10 20:19:14.133236005 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/search.html 2025-05-10 20:19:14.133236005 +0000 @@ -145,7 +145,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/ttb.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/ttb.html 2025-05-10 20:19:14.177236404 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/ttb.html 2025-05-10 20:19:14.193236549 +0000 @@ -1930,13 +1930,13 @@ is "contaminated" with token seq_trace.

    If Flags = all, all possible flags are set.

    The possible values for SeqTraceFlag are available in seq_trace.

    For a description of the match_spec() syntax, see section Match Specifications in Erlang in ERTS, which explains the general match specification "language".

    Note

    The system tracer for sequential tracing is automatically initiated by ttb -when a trace port is started with ttb:tracer/0,1,2.

    An example of how to use function seq_trigger_ms/0,1 follows:

    (tiger@durin)5> ttb:tracer().
    -{ok,[tiger@durin]}
    -(tiger@durin)6> ttb:p(all,call).
    -{ok,{[all],[call]}}
    -(tiger@durin)7> ttb:tp(mod,func,ttb:seq_trigger_ms()).
    -{ok,[{matched,1},{saved,1}]}
    -(tiger@durin)8>

    Whenever mod:func(...) is called after this, token seq_trace is set on the +when a trace port is started with ttb:tracer/0,1,2.

    An example of how to use function seq_trigger_ms/0,1 follows:

    (tiger@durin)5> ttb:tracer().
    +{ok,[tiger@durin]}
    +(tiger@durin)6> ttb:p(all,call).
    +{ok,{[all],[call]}}
    +(tiger@durin)7> ttb:tp(mod,func,ttb:seq_trigger_ms()).
    +{ok,[{matched,1},{saved,1}]}
    +(tiger@durin)8>

    Whenever mod:func(...) is called after this, token seq_trace is set on the executing process.

    @@ -1975,14 +1975,14 @@

    This function is a shortcut allowing to start a trace with one command. Each tuple in Patterns is converted to a list, which in turn is passed to -ttb:tpl/2,3,4.

    The call:

    > ttb:start_trace([Node, OtherNode],
    -                  [{mod, foo, []}, {mod, bar, 2}],
    -                  {all, call},
    -                  [{file, File}, {handler,{fun myhandler/4, S}}]).

    is equivalent to:

    > ttb:start_trace([Node, OtherNode],
    -                  [{file, File}, {handler,{fun myhandler/4, S}}]),
    -ttb:tpl(mod, foo, []),
    -ttb:tpl(mod, bar, 2, []),
    -ttb:p(all, call).
    +ttb:tpl/2,3,4.

    The call:

    > ttb:start_trace([Node, OtherNode],
    +                  [{mod, foo, []}, {mod, bar, 2}],
    +                  {all, call},
    +                  [{file, File}, {handler,{fun myhandler/4, S}}]).

    is equivalent to:

    > ttb:start_trace([Node, OtherNode],
    +                  [{file, File}, {handler,{fun myhandler/4, S}}]),
    +ttb:tpl(mod, foo, []),
    +ttb:tpl(mod, bar, 2, []),
    +ttb:p(all, call).
    @@ -2554,7 +2554,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/ttb_ug.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/ttb_ug.html 2025-05-10 20:19:14.233236912 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/ttb_ug.html 2025-05-10 20:19:14.249237057 +0000 @@ -172,56 +172,56 @@ Tracing Local Node from Erlang Shell -

    The following small module is used in the subsequent example:

    -module(m).
    --export([f/0]).
    -f() ->
    +

    The following small module is used in the subsequent example:

    -module(m).
    +-export([f/0]).
    +f() ->
        receive
    -      From when is_pid(From) ->
    -         Now = erlang:now(),
    -         From ! {self(),Now}
    +      From when is_pid(From) ->
    +         Now = erlang:now(),
    +         From ! {self(),Now}
        end.

    The following example shows the basic use of ttb from the Erlang shell. Default options are used both for starting the tracer and for formatting (the custom fetch directory is however provided). This gives a trace log named Node-ttb in the newly created directory, where Node is the node name. The default handler prints the formatted trace messages in the shell:

    (tiger@durin)47> %% First I spawn a process running my test function
    -(tiger@durin)47> Pid = spawn(m,f,[]).
    +(tiger@durin)47> Pid = spawn(m,f,[]).
     <0.125.0>
    -(tiger@durin)48>
    +(tiger@durin)48>
     (tiger@durin)48> %% Then I start a tracer...
    -(tiger@durin)48> ttb:tracer().
    -{ok,[tiger@durin]}
    -(tiger@durin)49>
    +(tiger@durin)48> ttb:tracer().
    +{ok,[tiger@durin]}
    +(tiger@durin)49>
     (tiger@durin)49> %% and activate the new process for tracing
     (tiger@durin)49> %% function calls and sent messages.
    -(tiger@durin)49> ttb:p(Pid,[call,send]).
    -{ok,[{<0.125.0>,[{matched,tiger@durin,1}]}]}
    -(tiger@durin)50>
    +(tiger@durin)49> ttb:p(Pid,[call,send]).
    +{ok,[{<0.125.0>,[{matched,tiger@durin,1}]}]}
    +(tiger@durin)50>
     (tiger@durin)50> %% Here I set a trace pattern on erlang:now/0
     (tiger@durin)50> %% The trace pattern is a simple match spec
     (tiger@durin)50> %% indicating that the return value should be
     (tiger@durin)50> %% traced. Refer to the reference_manual for
     (tiger@durin)50> %% the full list of match spec shortcuts
     (tiger@durin)50> %% available.
    -(tiger@durin)51> ttb:tp(erlang,now,return).
    -{ok,[{matched,tiger@durin,1},{saved,1}]}
    -(tiger@durin)52>
    +(tiger@durin)51> ttb:tp(erlang,now,return).
    +{ok,[{matched,tiger@durin,1},{saved,1}]}
    +(tiger@durin)52>
     (tiger@durin)52> %% I run my test (i.e. send a message to
     (tiger@durin)52> %% my new process)
    -(tiger@durin)52> Pid ! self().
    +(tiger@durin)52> Pid ! self().
     <0.72.0>
    -(tiger@durin)53>
    +(tiger@durin)53>
     (tiger@durin)53> %% And then I have to stop ttb in order to flush
     (tiger@durin)53> %% the trace port buffer
    -(tiger@durin)53> ttb:stop([return, {fetch_dir, "fetch"}]).
    -{stopped, "fetch"}
    -(tiger@durin)54>
    +(tiger@durin)53> ttb:stop([return, {fetch_dir, "fetch"}]).
    +{stopped, "fetch"}
    +(tiger@durin)54>
     (tiger@durin)54> %% Finally I format my trace log
    -(tiger@durin)54> ttb:format("fetch").
    -({<0.125.0>,{m,f,0},tiger@durin}) call erlang:now()
    -({<0.125.0>,{m,f,0},tiger@durin}) returned from erlang:now/0 ->
    -{1031,133451,667611}
    -({<0.125.0>,{m,f,0},tiger@durin}) <0.72.0> !
    -{<0.125.0>,{1031,133451,667611}}
    +(tiger@durin)54> ttb:format("fetch").
    +({<0.125.0>,{m,f,0},tiger@durin}) call erlang:now()
    +({<0.125.0>,{m,f,0},tiger@durin}) returned from erlang:now/0 ->
    +{1031,133451,667611}
    +({<0.125.0>,{m,f,0},tiger@durin}) <0.72.0> !
    +{<0.125.0>,{1031,133451,667611}}
     ok

    @@ -229,65 +229,65 @@ Build Your Own Tool

    The following example shows a simple tool for "debug tracing", that is, tracing -of function calls with return values:

    -module(mydebug).
    --export([start/0,trc/1,stop/0,format/1]).
    --export([print/4]).
    +of function calls with return values:

    -module(mydebug).
    +-export([start/0,trc/1,stop/0,format/1]).
    +-export([print/4]).
     %% Include ms_transform.hrl so that I can use dbg:fun2ms/2 to
     %% generate match specifications.
    --include_lib("stdlib/include/ms_transform.hrl").
    +-include_lib("stdlib/include/ms_transform.hrl").
     %%% -------------Tool API-------------
     %%% ----------------------------------
     %%% Star the "mydebug" tool
    -start() ->
    +start() ->
         %% The options specify that the binary log shall be named
         %% <Node>-debug_log and that the print/4 function in this
         %% module shall be used as format handler
    -    ttb:tracer(all,[{file,"debug_log"},{handler,{{?MODULE,print},0}}]),
    +    ttb:tracer(all,[{file,"debug_log"},{handler,{{?MODULE,print},0}}]),
         %% All processes (existing and new) shall trace function calls
         %% We want trace messages to be sorted upon format, which requires
         %% timestamp flag. The flag is however enabled by default in ttb.
    -    ttb:p(all,call).
    +    ttb:p(all,call).
     
     %%% Set trace pattern on function(s)
    -trc(M) when is_atom(M) ->
    -    trc({M,'_','_'});
    -trc({M,F}) when is_atom(M), is_atom(F) ->
    -    trc({M,F,'_'});
    -trc({M,F,_A}=MFA) when is_atom(M), is_atom(F) ->
    +trc(M) when is_atom(M) ->
    +    trc({M,'_','_'});
    +trc({M,F}) when is_atom(M), is_atom(F) ->
    +    trc({M,F,'_'});
    +trc({M,F,_A}=MFA) when is_atom(M), is_atom(F) ->
         %% This match spec shortcut specifies that return values shall
         %% be traced.
    -    MatchSpec = dbg:fun2ms(fun(_) -> return_trace() end),
    -    ttb:tpl(MFA,MatchSpec).
    +    MatchSpec = dbg:fun2ms(fun(_) -> return_trace() end),
    +    ttb:tpl(MFA,MatchSpec).
     
     %%% Format a binary trace log
    -format(Dir) ->
    -    ttb:format(Dir).
    +format(Dir) ->
    +    ttb:format(Dir).
     
     %%% Stop the "mydebug" tool
    -stop() ->
    -    ttb:stop(return).
    +stop() ->
    +    ttb:stop(return).
     
     %%% --------Internal functions--------
     %%% ----------------------------------
     %%% Format handler
    -print(_Out,end_of_trace,_TI,N) ->
    +print(_Out,end_of_trace,_TI,N) ->
         N;
    -print(Out,Trace,_TI,N) ->
    -    do_print(Out,Trace,N),
    +print(Out,Trace,_TI,N) ->
    +    do_print(Out,Trace,N),
         N+1.
     
    -do_print(Out,{trace_ts,P,call,{M,F,A},Ts},N) ->
    -    io:format(Out,
    +do_print(Out,{trace_ts,P,call,{M,F,A},Ts},N) ->
    +    io:format(Out,
                   "~w: ~w, ~w:~n"
                   "Call      : ~w:~w/~w~n"
                   "Arguments :~p~n~n",
    -              [N,Ts,P,M,F,length(A),A]);
    -do_print(Out,{trace_ts,P,return_from,{M,F,A},R,Ts},N) ->
    -    io:format(Out,
    +              [N,Ts,P,M,F,length(A),A]);
    +do_print(Out,{trace_ts,P,return_from,{M,F,A},R,Ts},N) ->
    +    io:format(Out,
                   "~w: ~w, ~w:~n"
                   "Return from  : ~w:~w/~w~n"
                   "Return value :~p~n~n",
    -              [N,Ts,P,M,F,A,R]).

    To distinguish trace logs produced with this tool from other logs, option file + [N,Ts,P,M,F,A,R]).

    To distinguish trace logs produced with this tool from other logs, option file is used in tracer/2. The logs are therefore fetched to a directory named ttb_upload_debug_log-YYYYMMDD-HHMMSS

    By using option handler when starting the tracer, the information about how to format the file is stored in the trace information file (.ti). This is not @@ -319,9 +319,9 @@

    If the traced node is diskless, ttb must be started from a trace control node with disk access, and option file must be specified to function tracer/2 -with value {local, File}, for example:

    (trace_control@durin)1> ttb:tracer(mynode@diskless,
    -                                   {file,{local,{wrap,"mytrace"}}}).
    -{ok,[mynode@diskless]}

    +with value {local, File}, for example:

    (trace_control@durin)1> ttb:tracer(mynode@diskless,
    +                                   {file,{local,{wrap,"mytrace"}}}).
    +{ok,[mynode@diskless]}

    @@ -341,10 +341,10 @@ Opts as argument.

    The timer is started with ttb:p/2, so any trace patterns must be set up in advance. ttb:start_trace/4 always sets up all patterns before invoking ttb:p/2.

    The following example shows how to set up a trace that is automatically stopped -and formatted after 5 seconds:

    (tiger@durin)1> ttb:start_trace([node()],
    -                                [{erlang, now,[]}],
    -                                {all, call},
    /usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/404.html differs (HTML document, UTF-8 Unicode text)
    --- old//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/404.html	2025-05-10 20:19:14.269237238 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/404.html	2025-05-10 20:19:14.273237274 +0000
    @@ -147,7 +147,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/api-reference.html 2025-05-10 20:19:14.289237420 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/api-reference.html 2025-05-10 20:19:14.293237456 +0000 @@ -185,7 +185,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/databases.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/databases.html 2025-05-10 20:19:14.313237637 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/databases.html 2025-05-10 20:19:14.317237673 +0000 @@ -272,7 +272,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    Missing in old package: /usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/dist/search_data-8746A0E5.js Missing in old package: /usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/dist/search_data-8746A0E5.js /usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/error_handling.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/error_handling.html 2025-05-10 20:19:14.337237855 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/error_handling.html 2025-05-10 20:19:14.341237891 +0000 @@ -271,7 +271,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/getting_started.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/getting_started.html 2025-05-10 20:19:14.369238145 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/getting_started.html 2025-05-10 20:19:14.377238217 +0000 @@ -157,77 +157,77 @@ relevance to anything that exist in reality, it is just a simple example. The example was created using sqlserver 7.0 with servicepack 1 as database and the ODBC driver for sqlserver with version 2000.80.194.00.

     1 > odbc:start().
    -      ok

    Connect to the database

     2 > {ok, Ref} = odbc:connect("DSN=sql-server;UID=aladdin;PWD=sesame", []).
    -      {ok,<0.342.0>}

    Create a table

     3 > odbc:sql_query(Ref, "CREATE TABLE EMPLOYEE (NR integer,
    +      ok

    Connect to the database

     2 > {ok, Ref} = odbc:connect("DSN=sql-server;UID=aladdin;PWD=sesame", []).
    +      {ok,<0.342.0>}

    Create a table

     3 > odbc:sql_query(Ref, "CREATE TABLE EMPLOYEE (NR integer,
           FIRSTNAME  char varying(20), LASTNAME  char varying(20), GENDER char(1),
           PRIMARY KEY(NR))").
           {updated,undefined}

    Insert some data

     4 > odbc:sql_query(Ref, "INSERT INTO EMPLOYEE VALUES(1, 'Jane', 'Doe', 'F')").
           {updated,1}

    Check what data types the database assigned for the columns. Hopefully this is not a surprise, some times it can be! These are the data types that you should -use if you want to do a parameterized query.

     5 > odbc:describe_table(Ref, "EMPLOYEE").
    -      {ok, [{"NR", sql_integer},
    -            {"FIRSTNAME", {sql_varchar, 20}},
    -            {"LASTNAME", {sql_varchar, 20}}
    -            {"GENDER", {sql_char, 1}}]}

    Use a parameterized query to insert many rows in one go.

     6 > odbc:param_query(Ref,"INSERT INTO EMPLOYEE (NR, FIRSTNAME, "
    +use if you want to do a parameterized query.

     5 > odbc:describe_table(Ref, "EMPLOYEE").
    +      {ok, [{"NR", sql_integer},
    +            {"FIRSTNAME", {sql_varchar, 20}},
    +            {"LASTNAME", {sql_varchar, 20}}
    +            {"GENDER", {sql_char, 1}}]}

    Use a parameterized query to insert many rows in one go.

     6 > odbc:param_query(Ref,"INSERT INTO EMPLOYEE (NR, FIRSTNAME, "
                       "LASTNAME, GENDER) VALUES(?, ?, ?, ?)",
    -                   [{sql_integer,[2,3,4,5,6,7,8]},
    -                    {{sql_varchar, 20},
    -                             ["John", "Monica", "Ross", "Rachel",
    -                             "Piper", "Prue", "Louise"]},
    -                   {{sql_varchar, 20},
    -                             ["Doe","Geller","Geller", "Green",
    -                              "Halliwell", "Halliwell", "Lane"]},
    -                   {{sql_char, 1}, ["M","F","M","F","F","F","F"]}]).
    -      {updated, 7}

    Fetch all data in the table employee

     7> odbc:sql_query(Ref, "SELECT * FROM EMPLOYEE").
    -    {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],
    -          [{1,"Jane","Doe","F"},
    -           {2,"John","Doe","M"},
    -           {3,"Monica","Geller","F"},
    -           {4,"Ross","Geller","M"},
    -           {5,"Rachel","Green","F"},
    -           {6,"Piper","Halliwell","F"},
    -           {7,"Prue","Halliwell","F"},
    -           {8,"Louise","Lane","F"}]]}

    Associate a result set containing the whole table EMPLOYEE to the connection. -The number of rows in the result set is returned.

     8 > odbc:select_count(Ref, "SELECT * FROM EMPLOYEE").
    -      {ok,8}

    You can always traverse the result set sequential by using next

     9 > odbc:next(Ref).
    -      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{1,"Jane","Doe","F"}]}
     10 > odbc:next(Ref).
    -      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{2,"John","Doe","M"}]}

    If your driver supports scrollable cursors you have a little more freedom, and -can do things like this.

     11 > odbc:last(Ref).
    -      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{8,"Louise","Lane","F"}]}
     12 > odbc:prev(Ref).
    -      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{7,"Prue","Halliwell","F"}]}
     13 > odbc:first(Ref).
    -      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{1,"Jane","Doe","F"}]}
     14 > odbc:next(Ref).
    -      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{2,"John","Doe","M"}]}

    Fetch the fields FIRSTNAMEand NRfor all female employees

     15 > odbc:sql_query(Ref, "SELECT FIRSTNAME, NR FROM EMPLOYEE WHERE GENDER = &#href_anchor"p" data-group-id="0673511423-1">).
    -     {selected,["FIRSTNAME","NR"],
    -          [{"Jane",1},
    -           {"Monica",3},
    -           {"Rachel",5},
    -           {"Piper",6},
    -           {"Prue",7},
    -           {"Louise",8}]}

    Fetch the fields FIRSTNAMEand NRfor all female employees and sort them on -the field FIRSTNAME.

     16 > odbc:sql_query(Ref, "SELECT FIRSTNAME, NR FROM EMPLOYEE WHERE GENDER = 'F'
    -      ORDER BY FIRSTNAME").
    -    {selected,["FIRSTNAME","NR"],
    -          [{"Jane",1},
    -           {"Louise",8},
    -           {"Monica",3},
    -           {"Piper",6},
    -           {"Prue",7},
    -           {"Rachel",5}]}

    Associate a result set that contains the fields FIRSTNAME and NRfor all + [{sql_integer,[2,3,4,5,6,7,8]}, + {{sql_varchar, 20}, + ["John", "Monica", "Ross", "Rachel", + "Piper", "Prue", "Louise"]}, + {{sql_varchar, 20}, + ["Doe","Geller","Geller", "Green", + "Halliwell", "Halliwell", "Lane"]}, + {{sql_char, 1}, ["M","F","M","F","F","F","F"]}]). + {updated, 7}

    Fetch all data in the table employee

     7> odbc:sql_query(Ref, "SELECT * FROM EMPLOYEE").
    +    {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],
    +          [{1,"Jane","Doe","F"},
    +           {2,"John","Doe","M"},
    +           {3,"Monica","Geller","F"},
    +           {4,"Ross","Geller","M"},
    +           {5,"Rachel","Green","F"},
    +           {6,"Piper","Halliwell","F"},
    +           {7,"Prue","Halliwell","F"},
    +           {8,"Louise","Lane","F"}]]}

    Associate a result set containing the whole table EMPLOYEE to the connection. +The number of rows in the result set is returned.

     8 > odbc:select_count(Ref, "SELECT * FROM EMPLOYEE").
    +      {ok,8}

    You can always traverse the result set sequential by using next

     9 > odbc:next(Ref).
    +      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{1,"Jane","Doe","F"}]}
     10 > odbc:next(Ref).
    +      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{2,"John","Doe","M"}]}

    If your driver supports scrollable cursors you have a little more freedom, and +can do things like this.

     11 > odbc:last(Ref).
    +      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{8,"Louise","Lane","F"}]}
     12 > odbc:prev(Ref).
    +      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{7,"Prue","Halliwell","F"}]}
     13 > odbc:first(Ref).
    +      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{1,"Jane","Doe","F"}]}
     14 > odbc:next(Ref).
    +      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{2,"John","Doe","M"}]}

    Fetch the fields FIRSTNAMEand NRfor all female employees

     15 > odbc:sql_query(Ref, "SELECT FIRSTNAME, NR FROM EMPLOYEE WHERE GENDER = &#href_anchor"p" data-group-id="4305431266-1">).
    +     {selected,["FIRSTNAME","NR"],
    +          [{"Jane",1},
    +           {"Monica",3},
    +           {"Rachel",5},
    +           {"Piper",6},
    +           {"Prue",7},
    +           {"Louise",8}]}

    Fetch the fields FIRSTNAMEand NRfor all female employees and sort them on +the field FIRSTNAME.

     16 > odbc:sql_query(Ref, "SELECT FIRSTNAME, NR FROM EMPLOYEE WHERE GENDER = 'F'
    +      ORDER BY FIRSTNAME").
    +    {selected,["FIRSTNAME","NR"],
    +          [{"Jane",1},
    +           {"Louise",8},
    +           {"Monica",3},
    +           {"Piper",6},
    +           {"Prue",7},
    +           {"Rachel",5}]}

    Associate a result set that contains the fields FIRSTNAME and NRfor all female employees to the connection. The number of rows in the result set is -returned.

     17 > odbc:select_count(Ref, "SELECT FIRSTNAME, NR FROM EMPLOYEE WHERE GENDER = 'F'").
    -      {ok,6}

    A few more ways of retrieving parts of the result set when the driver supports +returned.

     17 > odbc:select_count(Ref, "SELECT FIRSTNAME, NR FROM EMPLOYEE WHERE GENDER = 'F'").
    +      {ok,6}

    A few more ways of retrieving parts of the result set when the driver supports scrollable cursors. Note that next will work even without support for scrollable -cursors.

     18 > odbc:select(Ref, {relative, 2}, 3).
    -    {selected,["FIRSTNAME","NR"],[{"Monica",3},{"Rachel",5},{"Piper",6}]}
     19 > odbc:select(Ref, next, 2).
    -      {selected,["FIRSTNAME","NR"],[{"Prue",7},{"Louise",8}]}
     20 > odbc:select(Ref, {absolute, 1}, 2).
    -      {selected,["FIRSTNAME","NR"],[{"Jane",1},{"Monica",3}]}
     21 > odbc:select(Ref, next, 2).
    -    {selected,["FIRSTNAME","NR"],[{"Rachel",5},{"Piper",6}]}
     22 > odbc:select(Ref, {absolute, 1}, 4).
    -      {selected,["FIRSTNAME","NR"],
    -                [{"Jane",1},{"Monica",3},{"Rachel",5},{"Piper",6}]}

    Select, using a parameterized query.

     23 > odbc:param_query(Ref, "SELECT * FROM EMPLOYEE WHERE GENDER=?",
    -      [{{sql_char, 1}, ["M"]}]).
    -      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],
    -                [{2,"John", "Doe", "M"},{4,"Ross","Geller","M"}]}

    Delete the table EMPLOYEE.

     24 > odbc:sql_query(Ref, "DROP TABLE EMPLOYEE").
    -      {updated,undefined}

    Shut down the connection.

     25 > odbc:disconnect(Ref).
    +cursors.

     18 > odbc:select(Ref, {relative, 2}, 3).
    +    {selected,["FIRSTNAME","NR"],[{"Monica",3},{"Rachel",5},{"Piper",6}]}
     19 > odbc:select(Ref, next, 2).
    +      {selected,["FIRSTNAME","NR"],[{"Prue",7},{"Louise",8}]}
     20 > odbc:select(Ref, {absolute, 1}, 2).
    +      {selected,["FIRSTNAME","NR"],[{"Jane",1},{"Monica",3}]}
     21 > odbc:select(Ref, next, 2).
    +    {selected,["FIRSTNAME","NR"],[{"Rachel",5},{"Piper",6}]}
     22 > odbc:select(Ref, {absolute, 1}, 4).
    +      {selected,["FIRSTNAME","NR"],
    +                [{"Jane",1},{"Monica",3},{"Rachel",5},{"Piper",6}]}

    Select, using a parameterized query.

     23 > odbc:param_query(Ref, "SELECT * FROM EMPLOYEE WHERE GENDER=?",
    +      [{{sql_char, 1}, ["M"]}]).
    +      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],
    +                [{2,"John", "Doe", "M"},{4,"Ross","Geller","M"}]}

    Delete the table EMPLOYEE.

     24 > odbc:sql_query(Ref, "DROP TABLE EMPLOYEE").
    +      {updated,undefined}

    Shut down the connection.

     25 > odbc:disconnect(Ref).
           ok

    Shut down the application.

     26 > odbc:stop().
         =INFO REPORT==== 7-Jan-2004::17:00:59 ===
         application: odbc
    @@ -285,7 +285,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/introduction.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/introduction.html 2025-05-10 20:19:14.397238399 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/introduction.html 2025-05-10 20:19:14.397238399 +0000 @@ -207,7 +207,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/notes.html 2025-05-10 20:19:14.425238653 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/notes.html 2025-05-10 20:19:14.433238725 +0000 @@ -1056,7 +1056,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/odbc.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/odbc.epub/OEBPS/content.opf 2025-05-10 20:19:14.457238943 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/odbc.epub/OEBPS/content.opf 2025-05-10 20:19:14.461238979 +0000 @@ -4,10 +4,10 @@ version="3.0"> odbc - 2.15 - urn:uuid:e2c45625-9545-384a-f39b-1c516d42c767 + urn:uuid:6d1be18e-592a-66db-6f51-2b7dd7e2edc7 en - 2025-05-10T20:11:52Z + 2041-06-12T09:31:59Z /usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/odbc.epub/OEBPS/getting_started.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/odbc.epub/OEBPS/getting_started.xhtml 2025-05-10 20:19:14.457238943 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/odbc.epub/OEBPS/getting_started.xhtml 2025-05-10 20:19:14.457238943 +0000 @@ -52,77 +52,77 @@ relevance to anything that exist in reality, it is just a simple example. The example was created using sqlserver 7.0 with servicepack 1 as database and the ODBC driver for sqlserver with version 2000.80.194.00.

     1 > odbc:start().
    -      ok

    Connect to the database

     2 > {ok, Ref} = odbc:connect("DSN=sql-server;UID=aladdin;PWD=sesame", []).
    -      {ok,<0.342.0>}

    Create a table

     3 > odbc:sql_query(Ref, "CREATE TABLE EMPLOYEE (NR integer,
    +      ok

    Connect to the database

     2 > {ok, Ref} = odbc:connect("DSN=sql-server;UID=aladdin;PWD=sesame", []).
    +      {ok,<0.342.0>}

    Create a table

     3 > odbc:sql_query(Ref, "CREATE TABLE EMPLOYEE (NR integer,
           FIRSTNAME  char varying(20), LASTNAME  char varying(20), GENDER char(1),
           PRIMARY KEY(NR))").
           {updated,undefined}

    Insert some data

     4 > odbc:sql_query(Ref, "INSERT INTO EMPLOYEE VALUES(1, 'Jane', 'Doe', 'F')").
           {updated,1}

    Check what data types the database assigned for the columns. Hopefully this is not a surprise, some times it can be! These are the data types that you should -use if you want to do a parameterized query.

     5 > odbc:describe_table(Ref, "EMPLOYEE").
    -      {ok, [{"NR", sql_integer},
    -            {"FIRSTNAME", {sql_varchar, 20}},
    -            {"LASTNAME", {sql_varchar, 20}}
    -            {"GENDER", {sql_char, 1}}]}

    Use a parameterized query to insert many rows in one go.

     6 > odbc:param_query(Ref,"INSERT INTO EMPLOYEE (NR, FIRSTNAME, "
    +use if you want to do a parameterized query.

     5 > odbc:describe_table(Ref, "EMPLOYEE").
    +      {ok, [{"NR", sql_integer},
    +            {"FIRSTNAME", {sql_varchar, 20}},
    +            {"LASTNAME", {sql_varchar, 20}}
    +            {"GENDER", {sql_char, 1}}]}

    Use a parameterized query to insert many rows in one go.

     6 > odbc:param_query(Ref,"INSERT INTO EMPLOYEE (NR, FIRSTNAME, "
                       "LASTNAME, GENDER) VALUES(?, ?, ?, ?)",
    -                   [{sql_integer,[2,3,4,5,6,7,8]},
    -                    {{sql_varchar, 20},
    -                             ["John", "Monica", "Ross", "Rachel",
    -                             "Piper", "Prue", "Louise"]},
    -                   {{sql_varchar, 20},
    -                             ["Doe","Geller","Geller", "Green",
    -                              "Halliwell", "Halliwell", "Lane"]},
    -                   {{sql_char, 1}, ["M","F","M","F","F","F","F"]}]).
    -      {updated, 7}

    Fetch all data in the table employee

     7> odbc:sql_query(Ref, "SELECT * FROM EMPLOYEE").
    -    {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],
    -          [{1,"Jane","Doe","F"},
    -           {2,"John","Doe","M"},
    -           {3,"Monica","Geller","F"},
    -           {4,"Ross","Geller","M"},
    -           {5,"Rachel","Green","F"},
    -           {6,"Piper","Halliwell","F"},
    -           {7,"Prue","Halliwell","F"},
    -           {8,"Louise","Lane","F"}]]}

    Associate a result set containing the whole table EMPLOYEE to the connection. -The number of rows in the result set is returned.

     8 > odbc:select_count(Ref, "SELECT * FROM EMPLOYEE").
    -      {ok,8}

    You can always traverse the result set sequential by using next

     9 > odbc:next(Ref).
    -      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{1,"Jane","Doe","F"}]}
     10 > odbc:next(Ref).
    -      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{2,"John","Doe","M"}]}

    If your driver supports scrollable cursors you have a little more freedom, and -can do things like this.

     11 > odbc:last(Ref).
    -      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{8,"Louise","Lane","F"}]}
     12 > odbc:prev(Ref).
    -      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{7,"Prue","Halliwell","F"}]}
     13 > odbc:first(Ref).
    -      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{1,"Jane","Doe","F"}]}
     14 > odbc:next(Ref).
    -      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{2,"John","Doe","M"}]}

    Fetch the fields FIRSTNAMEand NRfor all female employees

     15 > odbc:sql_query(Ref, "SELECT FIRSTNAME, NR FROM EMPLOYEE WHERE GENDER = 'F'").
    -     {selected,["FIRSTNAME","NR"],
    -          [{"Jane",1},
    -           {"Monica",3},
    -           {"Rachel",5},
    -           {"Piper",6},
    -           {"Prue",7},
    -           {"Louise",8}]}

    Fetch the fields FIRSTNAMEand NRfor all female employees and sort them on -the field FIRSTNAME.

     16 > odbc:sql_query(Ref, "SELECT FIRSTNAME, NR FROM EMPLOYEE WHERE GENDER = 'F'
    -      ORDER BY FIRSTNAME").
    -    {selected,["FIRSTNAME","NR"],
    -          [{"Jane",1},
    -           {"Louise",8},
    -           {"Monica",3},
    -           {"Piper",6},
    -           {"Prue",7},
    -           {"Rachel",5}]}

    Associate a result set that contains the fields FIRSTNAME and NRfor all + [{sql_integer,[2,3,4,5,6,7,8]}, + {{sql_varchar, 20}, + ["John", "Monica", "Ross", "Rachel", + "Piper", "Prue", "Louise"]}, + {{sql_varchar, 20}, + ["Doe","Geller","Geller", "Green", + "Halliwell", "Halliwell", "Lane"]}, + {{sql_char, 1}, ["M","F","M","F","F","F","F"]}]). + {updated, 7}

    Fetch all data in the table employee

     7> odbc:sql_query(Ref, "SELECT * FROM EMPLOYEE").
    +    {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],
    +          [{1,"Jane","Doe","F"},
    +           {2,"John","Doe","M"},
    +           {3,"Monica","Geller","F"},
    +           {4,"Ross","Geller","M"},
    +           {5,"Rachel","Green","F"},
    +           {6,"Piper","Halliwell","F"},
    +           {7,"Prue","Halliwell","F"},
    +           {8,"Louise","Lane","F"}]]}

    Associate a result set containing the whole table EMPLOYEE to the connection. +The number of rows in the result set is returned.

     8 > odbc:select_count(Ref, "SELECT * FROM EMPLOYEE").
    +      {ok,8}

    You can always traverse the result set sequential by using next

     9 > odbc:next(Ref).
    +      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{1,"Jane","Doe","F"}]}
     10 > odbc:next(Ref).
    +      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{2,"John","Doe","M"}]}

    If your driver supports scrollable cursors you have a little more freedom, and +can do things like this.

     11 > odbc:last(Ref).
    +      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{8,"Louise","Lane","F"}]}
     12 > odbc:prev(Ref).
    +      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{7,"Prue","Halliwell","F"}]}
     13 > odbc:first(Ref).
    +      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{1,"Jane","Doe","F"}]}
     14 > odbc:next(Ref).
    +      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{2,"John","Doe","M"}]}

    Fetch the fields FIRSTNAMEand NRfor all female employees

     15 > odbc:sql_query(Ref, "SELECT FIRSTNAME, NR FROM EMPLOYEE WHERE GENDER = 'F'").
    +     {selected,["FIRSTNAME","NR"],
    +          [{"Jane",1},
    +           {"Monica",3},
    +           {"Rachel",5},
    +           {"Piper",6},
    +           {"Prue",7},
    +           {"Louise",8}]}

    Fetch the fields FIRSTNAMEand NRfor all female employees and sort them on +the field FIRSTNAME.

     16 > odbc:sql_query(Ref, "SELECT FIRSTNAME, NR FROM EMPLOYEE WHERE GENDER = 'F'
    +      ORDER BY FIRSTNAME").
    +    {selected,["FIRSTNAME","NR"],
    +          [{"Jane",1},
    +           {"Louise",8},
    +           {"Monica",3},
    +           {"Piper",6},
    +           {"Prue",7},
    +           {"Rachel",5}]}

    Associate a result set that contains the fields FIRSTNAME and NRfor all female employees to the connection. The number of rows in the result set is -returned.

     17 > odbc:select_count(Ref, "SELECT FIRSTNAME, NR FROM EMPLOYEE WHERE GENDER = 'F'").
    -      {ok,6}

    A few more ways of retrieving parts of the result set when the driver supports +returned.

     17 > odbc:select_count(Ref, "SELECT FIRSTNAME, NR FROM EMPLOYEE WHERE GENDER = 'F'").
    +      {ok,6}

    A few more ways of retrieving parts of the result set when the driver supports scrollable cursors. Note that next will work even without support for scrollable -cursors.

     18 > odbc:select(Ref, {relative, 2}, 3).
    -    {selected,["FIRSTNAME","NR"],[{"Monica",3},{"Rachel",5},{"Piper",6}]}
     19 > odbc:select(Ref, next, 2).
    -      {selected,["FIRSTNAME","NR"],[{"Prue",7},{"Louise",8}]}
     20 > odbc:select(Ref, {absolute, 1}, 2).
    -      {selected,["FIRSTNAME","NR"],[{"Jane",1},{"Monica",3}]}
     21 > odbc:select(Ref, next, 2).
    -    {selected,["FIRSTNAME","NR"],[{"Rachel",5},{"Piper",6}]}
     22 > odbc:select(Ref, {absolute, 1}, 4).
    -      {selected,["FIRSTNAME","NR"],
    -                [{"Jane",1},{"Monica",3},{"Rachel",5},{"Piper",6}]}

    Select, using a parameterized query.

     23 > odbc:param_query(Ref, "SELECT * FROM EMPLOYEE WHERE GENDER=?",
    -      [{{sql_char, 1}, ["M"]}]).
    -      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],
    -                [{2,"John", "Doe", "M"},{4,"Ross","Geller","M"}]}

    Delete the table EMPLOYEE.

     24 > odbc:sql_query(Ref, "DROP TABLE EMPLOYEE").
    -      {updated,undefined}

    Shut down the connection.

     25 > odbc:disconnect(Ref).
    +cursors.

     18 > odbc:select(Ref, {relative, 2}, 3).
    +    {selected,["FIRSTNAME","NR"],[{"Monica",3},{"Rachel",5},{"Piper",6}]}
     19 > odbc:select(Ref, next, 2).
    +      {selected,["FIRSTNAME","NR"],[{"Prue",7},{"Louise",8}]}
     20 > odbc:select(Ref, {absolute, 1}, 2).
    +      {selected,["FIRSTNAME","NR"],[{"Jane",1},{"Monica",3}]}
     21 > odbc:select(Ref, next, 2).
    +    {selected,["FIRSTNAME","NR"],[{"Rachel",5},{"Piper",6}]}
     22 > odbc:select(Ref, {absolute, 1}, 4).
    +      {selected,["FIRSTNAME","NR"],
    +                [{"Jane",1},{"Monica",3},{"Rachel",5},{"Piper",6}]}

    Select, using a parameterized query.

     23 > odbc:param_query(Ref, "SELECT * FROM EMPLOYEE WHERE GENDER=?",
    +      [{{sql_char, 1}, ["M"]}]).
    +      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],
    +                [{2,"John", "Doe", "M"},{4,"Ross","Geller","M"}]}

    Delete the table EMPLOYEE.

     24 > odbc:sql_query(Ref, "DROP TABLE EMPLOYEE").
    +      {updated,undefined}

    Shut down the connection.

     25 > odbc:disconnect(Ref).
           ok

    Shut down the application.

     26 > odbc:stop().
         =INFO REPORT==== 7-Jan-2004::17:00:59 ===
         application: odbc
    /usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/odbc.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/odbc.html	2025-05-10 20:19:14.521239523 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/odbc.html	2025-05-10 20:19:14.533239632 +0000
    @@ -1847,7 +1847,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/search.html 2025-05-10 20:19:14.553239813 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/search.html 2025-05-10 20:19:14.553239813 +0000 @@ -122,7 +122,7 @@
    - + /usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/404.html 2025-05-10 20:19:14.573239994 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/404.html 2025-05-10 20:19:14.573239994 +0000 @@ -147,7 +147,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/api-reference.html 2025-05-10 20:19:14.593240176 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/api-reference.html 2025-05-10 20:19:14.593240176 +0000 @@ -221,7 +221,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/cpu_sup.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/cpu_sup.html 2025-05-10 20:19:14.621240430 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/cpu_sup.html 2025-05-10 20:19:14.625240466 +0000 @@ -645,7 +645,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/disksup.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/disksup.html 2025-05-10 20:19:14.649240684 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/disksup.html 2025-05-10 20:19:14.653240720 +0000 @@ -575,7 +575,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/memsup.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/memsup.html 2025-05-10 20:19:14.677240937 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/memsup.html 2025-05-10 20:19:14.681240974 +0000 @@ -699,7 +699,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/notes.html 2025-05-10 20:19:14.709241227 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/notes.html 2025-05-10 20:19:14.713241264 +0000 @@ -1039,7 +1039,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/nteventlog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/nteventlog.html 2025-05-10 20:19:14.733241445 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/nteventlog.html 2025-05-10 20:19:14.737241481 +0000 @@ -341,7 +341,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/os_mon.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/os_mon.epub/OEBPS/content.opf 2025-05-10 20:19:14.761241698 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/os_mon.epub/OEBPS/content.opf 2025-05-10 20:19:14.765241735 +0000 @@ -4,10 +4,10 @@ version="3.0"> os_mon - 2.10.1 - urn:uuid:5d11f9cc-6934-cfc4-eb2b-13dbc3990420 + urn:uuid:cff62d86-d329-504d-56bb-1f5fb1b287fe en - 2025-05-10T20:11:41Z + 2041-06-12T09:31:48Z /usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/os_mon_app.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/os_mon_app.html 2025-05-10 20:19:14.805242098 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/os_mon_app.html 2025-05-10 20:19:14.805242098 +0000 @@ -207,7 +207,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/os_sup.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/os_sup.html 2025-05-10 20:19:14.829242315 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/os_sup.html 2025-05-10 20:19:14.833242351 +0000 @@ -422,7 +422,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/search.html 2025-05-10 20:19:14.853242533 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/search.html 2025-05-10 20:19:14.853242533 +0000 @@ -145,7 +145,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/404.html 2025-05-10 20:19:14.869242678 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/404.html 2025-05-10 20:19:14.869242678 +0000 @@ -147,7 +147,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/api-reference.html 2025-05-10 20:19:14.889242859 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/api-reference.html 2025-05-10 20:19:14.889242859 +0000 @@ -194,7 +194,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/leex.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/leex.html 2025-05-10 20:19:14.917243113 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/leex.html 2025-05-10 20:19:14.925243185 +0000 @@ -173,13 +173,13 @@ next token. Note that pushing back a newline will mean the line numbering will no longer be correct.

    Note

    Pushing back characters gives you unexpected possibilities to cause the scanner to loop!

    The following example would match a simple Erlang integer or float and return a -token which could be sent to the Erlang parser:

    D = [0-9]
    +token which could be sent to the Erlang parser:

    D = [0-9]
     
    -{D}+ :
    -  {token,{integer,TokenLine,list_to_integer(TokenChars)}}.
    +{D}+ :
    +  {token,{integer,TokenLine,list_to_integer(TokenChars)}}.
     
    -{D}+\.{D}+((E|e)(\+|\-)?{D}+)? :
    -  {token,{float,TokenLine,list_to_float(TokenChars)}}.

    The Erlang code in the Erlang code. section is written into the output file +{D}+\.{D}+((E|e)(\+|\-)?{D}+)? : + {token,{float,TokenLine,list_to_float(TokenChars)}}.

    The Erlang code in the Erlang code. section is written into the output file directly after the module declaration and predefined exports declaration, making it possible to add extra exports, define imports, and other attributes, which are visible in the whole file.

    @@ -731,7 +731,7 @@ the token. This is continued until a token has been scanned. Cont is initially [].

    It is not designed to be called directly by an application, but is used through the I/O system where it can typically be called in an -application by:

    io:request(InFile, {get_until,unicode,Prompt,Module,token,[Loc]})
    +application by:

    io:request(InFile, {get_until,unicode,Prompt,Module,token,[Loc]})
       -> TokenRet

    @@ -820,7 +820,7 @@ like Erlang where there is an explicit end token, '.'. If no end token is found then the whole file will be scanned and returned. If an error occurs then all tokens up to and including the next end token will be skipped.

    It is not designed to be called directly by an application, but used through the -I/O system where it can typically be called in an application by:

    io:request(InFile, {get_until,unicode,Prompt,Module,tokens,[Loc]})
    +I/O system where it can typically be called in an application by:

    io:request(InFile, {get_until,unicode,Prompt,Module,tokens,[Loc]})
       -> TokensRet
    @@ -996,7 +996,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/notes.html 2025-05-10 20:19:14.949243403 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/notes.html 2025-05-10 20:19:14.957243475 +0000 @@ -734,7 +734,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/parsetools.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/parsetools.epub/OEBPS/content.opf 2025-05-10 20:19:14.981243693 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/parsetools.epub/OEBPS/content.opf 2025-05-10 20:19:14.981243693 +0000 @@ -4,10 +4,10 @@ version="3.0"> parsetools - 2.6 - urn:uuid:389a315d-d7dc-954d-b7fa-8ba5ee23f92d + urn:uuid:bce2aa2e-0d49-3965-3860-05aabd31d330 en - 2025-05-10T20:10:37Z + 2041-06-12T09:30:50Z /usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/parsetools.epub/OEBPS/leex.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/parsetools.epub/OEBPS/leex.xhtml 2025-05-10 20:19:14.981243693 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/parsetools.epub/OEBPS/leex.xhtml 2025-05-10 20:19:14.981243693 +0000 @@ -68,13 +68,13 @@ next token. Note that pushing back a newline will mean the line numbering will no longer be correct.

    Note

    Pushing back characters gives you unexpected possibilities to cause the scanner to loop!

    The following example would match a simple Erlang integer or float and return a -token which could be sent to the Erlang parser:

    D = [0-9]
    +token which could be sent to the Erlang parser:

    D = [0-9]
     
    -{D}+ :
    -  {token,{integer,TokenLine,list_to_integer(TokenChars)}}.
    +{D}+ :
    +  {token,{integer,TokenLine,list_to_integer(TokenChars)}}.
     
    -{D}+\.{D}+((E|e)(\+|\-)?{D}+)? :
    -  {token,{float,TokenLine,list_to_float(TokenChars)}}.

    The Erlang code in the Erlang code. section is written into the output file +{D}+\.{D}+((E|e)(\+|\-)?{D}+)? : + {token,{float,TokenLine,list_to_float(TokenChars)}}.

    The Erlang code in the Erlang code. section is written into the output file directly after the module declaration and predefined exports declaration, making it possible to add extra exports, define imports, and other attributes, which are visible in the whole file.

    @@ -610,7 +610,7 @@ the token. This is continued until a token has been scanned. Cont is initially [].

    It is not designed to be called directly by an application, but is used through the I/O system where it can typically be called in an -application by:

    io:request(InFile, {get_until,unicode,Prompt,Module,token,[Loc]})
    +application by:

    io:request(InFile, {get_until,unicode,Prompt,Module,token,[Loc]})
       -> TokenRet
    @@ -699,7 +699,7 @@ like Erlang where there is an explicit end token, '.'. If no end token is found then the whole file will be scanned and returned. If an error occurs then all tokens up to and including the next end token will be skipped.

    It is not designed to be called directly by an application, but used through the -I/O system where it can typically be called in an application by:

    io:request(InFile, {get_until,unicode,Prompt,Module,tokens,[Loc]})
    +I/O system where it can typically be called in an application by:

    io:request(InFile, {get_until,unicode,Prompt,Module,tokens,[Loc]})
       -> TokensRet
    /usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/parsetools.epub/OEBPS/yecc.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/parsetools.epub/OEBPS/yecc.xhtml 2025-05-10 20:19:14.981243693 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/parsetools.epub/OEBPS/yecc.xhtml 2025-05-10 20:19:14.981243693 +0000 @@ -57,8 +57,8 @@ distinguished from all the terminal and non-terminal categories of the syntax rules. The Endsymbol can be declared in the grammar file.

    The simplest case is to segment the input string into a list of identifiers (atoms) and use those atoms both as categories and values of the tokens. For -example, the input string aaa bbb 777, X may be scanned (tokenized) as:

    [{aaa, 1}, {bbb, 1}, {777, 1}, {',' , 1}, {'X', 1},
    - {'$end', 1}].

    This assumes that this is the first line of the input text, and that '$end' is +example, the input string aaa bbb 777, X may be scanned (tokenized) as:

    [{aaa, 1}, {bbb, 1}, {777, 1}, {',' , 1}, {'X', 1},
    + {'$end', 1}].

    This assumes that this is the first line of the input text, and that '$end' is the distinguished end_of_input symbol.

    The Erlang scanner in the io module can be used as a starting point when writing a new scanner. Study yeccscan.erl in order to see how a filter can be added on top of io:scan_erl_form/3 to provide a scanner for Yecc that @@ -128,8 +128,8 @@ element -> atom. element -> list.

    This grammar can be used to generate a parser which parses list expressions, such as (), (a), (peter charles), (a (b c) d (())), ... provided that your -scanner tokenizes, for example, the input (peter charles) as follows:

    [{'(', 1} , {atom, 1, peter}, {atom, 1, charles}, {')', 1},
    - {'$end', 1}]

    When a grammar rule is used by the parser to parse (part of) the input string as +scanner tokenizes, for example, the input (peter charles) as follows:

    [{'(', 1} , {atom, 1, peter}, {atom, 1, charles}, {')', 1},
    + {'$end', 1}]

    When a grammar rule is used by the parser to parse (part of) the input string as a grammatical phrase, the associated code is evaluated, and the value of the last expression becomes the value of the parsed phrase. This value may be used by the parser later to build structures that are values of higher phrases of @@ -141,8 +141,8 @@ element -> atom : '$1'. element -> list : '$1'.

    With this code added to the grammar rules, the parser produces the following value (structure) when parsing the input string (a b c).. This still assumes -that this was the first input line that the scanner tokenized:

    {cons, {atom, 1, a}, {cons, {atom, 1, b},
    -                            {cons, {atom, 1, c}, nil}}}

    The associated code contains pseudo variables '$1', '$2', +that this was the first input line that the scanner tokenized:

    {cons, {atom, 1, a}, {cons, {atom, 1, b},
    +                            {cons, {atom, 1, c}, nil}}}

    The associated code contains pseudo variables '$1', '$2', '$3', and so on. which refer to (are bound to) the values associated previously by the parser with the symbols of the right-hand side of the rule. When these symbols are terminal categories, the @@ -165,12 +165,12 @@ Generating a Parser

    -

    To call the parser generator, use the following command:

    yecc:file(Grammarfile).

    An error message from Yecc will be shown if the grammar is not of the LALR type +

    To call the parser generator, use the following command:

    yecc:file(Grammarfile).

    An error message from Yecc will be shown if the grammar is not of the LALR type (for example too ambiguous). Shift/reduce conflicts are resolved in favor of shifting if there are no operator precedence declarations. Refer to the yacc documentation on the use of operator precedence.

    The output file contains Erlang source code for a parser module with module name equal to the Parserfile parameter. After compilation, the parser can be called -as follows (the module name is assumed to be myparser):

    myparser:parse(myscanner:scan(Inport))

    The call format can be different if a customized prologue file has been included +as follows (the module name is assumed to be myparser):

    myparser:parse(myscanner:scan(Inport))

    The call format can be different if a customized prologue file has been included when generating the parser instead of the default file lib/parsetools/include/yeccpre.hrl.

    With the standard prologue, this call will return either {ok, Result}, where Result is a structure that the Erlang code of the grammar file has built, or @@ -179,15 +179,15 @@ the screen. The user will have to do this either by printing the returned error messages, or by inserting tests and print instructions in the Erlang code associated with the syntax rules of the grammar file.

    It is also possible to make the parser ask for more input tokens when needed if -the following call format is used:

    myparser:parse_and_scan({Function, Args})
    -myparser:parse_and_scan({Mod, Tokenizer, Args})

    The tokenizer Function is either a fun or a tuple {Mod, Tokenizer}. The call +the following call format is used:

    myparser:parse_and_scan({Function, Args})
    +myparser:parse_and_scan({Mod, Tokenizer, Args})

    The tokenizer Function is either a fun or a tuple {Mod, Tokenizer}. The call apply(Function, Args) or apply({Mod, Tokenizer}, Args) is executed whenever a new token is needed. This, for example, makes it possible to parse from a file, token by token.

    The tokenizer used above has to be implemented so as to return one of the -following:

    {ok, Tokens, EndPosition}
    -{eof, EndPosition}
    -{error, Error_description, EndPosition}

    This conforms to the format used by the scanner in the Erlang io library +following:

    {ok, Tokens, EndPosition}
    +{eof, EndPosition}
    +{error, Error_description, EndPosition}

    This conforms to the format used by the scanner in the Erlang io library module.

    If {eof, EndPosition} is returned immediately, the call to parse_and_scan/1 returns {ok, eof}. If {eof, EndPosition} is returned before the parser expects end of input, parse_and_scan/1 will, of course, return an error @@ -237,36 +237,36 @@ Endsymbol '$end'. grammar -> declaration : '$1'. grammar -> rule : '$1'. -declaration -> symbol symbols dot: {'$1', '$2'}. -rule -> head '->' symbols attached_code dot: {rule, ['$1' | '$3'], - '$4'}. +declaration -> symbol symbols dot: {'$1', '$2'}. +rule -> head '->' symbols attached_code dot: {rule, ['$1' | '$3'], + '$4'}. head -> symbol : '$1'. -symbols -> symbol : ['$1']. -symbols -> symbol symbols : ['$1' | '$2']. -attached_code -> ':' tokens : {erlang_code, '$2'}. -attached_code -> '$empty' : {erlang_code, - [{atom, 0, '$undefined'}]}. -tokens -> token : ['$1']. -tokens -> token tokens : ['$1' | '$2']. -symbol -> var : value_of('$1'). -symbol -> atom : value_of('$1'). -symbol -> integer : value_of('$1'). -symbol -> reserved_word : value_of('$1'). +symbols -> symbol : ['$1']. +symbols -> symbol symbols : ['$1' | '$2']. +attached_code -> ':' tokens : {erlang_code, '$2'}. +attached_code -> '$empty' : {erlang_code, + [{atom, 0, '$undefined'}]}. +tokens -> token : ['$1']. +tokens -> token tokens : ['$1' | '$2']. +symbol -> var : value_of('$1'). +symbol -> atom : value_of('$1'). +symbol -> integer : value_of('$1'). +symbol -> reserved_word : value_of('$1'). token -> var : '$1'. token -> atom : '$1'. token -> float : '$1'. token -> integer : '$1'. token -> string : '$1'. token -> char : '$1'. -token -> reserved_symbol : {value_of('$1'), line_of('$1')}. -token -> reserved_word : {value_of('$1'), line_of('$1')}. -token -> '->' : {'->', line_of('$1')}. -token -> ':' : {':', line_of('$1')}. +token -> reserved_symbol : {value_of('$1'), line_of('$1')}. +token -> reserved_word : {value_of('$1'), line_of('$1')}. +token -> '->' : {'->', line_of('$1')}. +token -> ':' : {':', line_of('$1')}. Erlang code. -value_of(Token) -> - element(3, Token). -line_of(Token) -> - element(2, Token).

    Note

    The symbols '->', and ':' have to be treated in a special way, as they are +value_of(Token) -> + element(3, Token). +line_of(Token) -> + element(2, Token).

    Note

    The symbols '->', and ':' have to be treated in a special way, as they are meta symbols of the grammar notation, as well as terminal symbols of the Yecc grammar.

    5. The file erl_parse.yrl in the lib/stdlib/src directory contains the grammar for Erlang.

    Note

    Syntactic tests are used in the code associated with some rules, and an error /usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/search.html 2025-05-10 20:19:15.033244165 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/search.html 2025-05-10 20:19:15.033244165 +0000 @@ -145,7 +145,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/yecc.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/yecc.html 2025-05-10 20:19:15.061244418 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/yecc.html 2025-05-10 20:19:15.069244491 +0000 @@ -162,8 +162,8 @@ distinguished from all the terminal and non-terminal categories of the syntax rules. The Endsymbol can be declared in the grammar file.

    The simplest case is to segment the input string into a list of identifiers (atoms) and use those atoms both as categories and values of the tokens. For -example, the input string aaa bbb 777, X may be scanned (tokenized) as:

    [{aaa, 1}, {bbb, 1}, {777, 1}, {',' , 1}, {'X', 1},
    - {'$end', 1}].

    This assumes that this is the first line of the input text, and that '$end' is +example, the input string aaa bbb 777, X may be scanned (tokenized) as:

    [{aaa, 1}, {bbb, 1}, {777, 1}, {',' , 1}, {'X', 1},
    + {'$end', 1}].

    This assumes that this is the first line of the input text, and that '$end' is the distinguished end_of_input symbol.

    The Erlang scanner in the io module can be used as a starting point when writing a new scanner. Study yeccscan.erl in order to see how a filter can be added on top of io:scan_erl_form/3 to provide a scanner for Yecc that @@ -233,8 +233,8 @@ element -> atom. element -> list.

    This grammar can be used to generate a parser which parses list expressions, such as (), (a), (peter charles), (a (b c) d (())), ... provided that your -scanner tokenizes, for example, the input (peter charles) as follows:

    [{'(', 1} , {atom, 1, peter}, {atom, 1, charles}, {')', 1},
    - {'$end', 1}]

    When a grammar rule is used by the parser to parse (part of) the input string as +scanner tokenizes, for example, the input (peter charles) as follows:

    [{'(', 1} , {atom, 1, peter}, {atom, 1, charles}, {')', 1},
    + {'$end', 1}]

    When a grammar rule is used by the parser to parse (part of) the input string as a grammatical phrase, the associated code is evaluated, and the value of the last expression becomes the value of the parsed phrase. This value may be used by the parser later to build structures that are values of higher phrases of @@ -246,8 +246,8 @@ element -> atom : '$1'. element -> list : '$1'.

    With this code added to the grammar rules, the parser produces the following value (structure) when parsing the input string (a b c).. This still assumes -that this was the first input line that the scanner tokenized:

    {cons, {atom, 1, a}, {cons, {atom, 1, b},
    -                            {cons, {atom, 1, c}, nil}}}

    The associated code contains pseudo variables '$1', '$2', +that this was the first input line that the scanner tokenized:

    {cons, {atom, 1, a}, {cons, {atom, 1, b},
    +                            {cons, {atom, 1, c}, nil}}}

    The associated code contains pseudo variables '$1', '$2', '$3', and so on. which refer to (are bound to) the values associated previously by the parser with the symbols of the right-hand side of the rule. When these symbols are terminal categories, the @@ -270,12 +270,12 @@ Generating a Parser -

    To call the parser generator, use the following command:

    yecc:file(Grammarfile).

    An error message from Yecc will be shown if the grammar is not of the LALR type +

    To call the parser generator, use the following command:

    yecc:file(Grammarfile).

    An error message from Yecc will be shown if the grammar is not of the LALR type (for example too ambiguous). Shift/reduce conflicts are resolved in favor of shifting if there are no operator precedence declarations. Refer to the yacc documentation on the use of operator precedence.

    The output file contains Erlang source code for a parser module with module name equal to the Parserfile parameter. After compilation, the parser can be called -as follows (the module name is assumed to be myparser):

    myparser:parse(myscanner:scan(Inport))

    The call format can be different if a customized prologue file has been included +as follows (the module name is assumed to be myparser):

    myparser:parse(myscanner:scan(Inport))

    The call format can be different if a customized prologue file has been included when generating the parser instead of the default file lib/parsetools/include/yeccpre.hrl.

    With the standard prologue, this call will return either {ok, Result}, where Result is a structure that the Erlang code of the grammar file has built, or @@ -284,15 +284,15 @@ the screen. The user will have to do this either by printing the returned error messages, or by inserting tests and print instructions in the Erlang code associated with the syntax rules of the grammar file.

    It is also possible to make the parser ask for more input tokens when needed if -the following call format is used:

    myparser:parse_and_scan({Function, Args})
    -myparser:parse_and_scan({Mod, Tokenizer, Args})

    The tokenizer Function is either a fun or a tuple {Mod, Tokenizer}. The call +the following call format is used:

    myparser:parse_and_scan({Function, Args})
    +myparser:parse_and_scan({Mod, Tokenizer, Args})

    The tokenizer Function is either a fun or a tuple {Mod, Tokenizer}. The call apply(Function, Args) or apply({Mod, Tokenizer}, Args) is executed whenever a new token is needed. This, for example, makes it possible to parse from a file, token by token.

    The tokenizer used above has to be implemented so as to return one of the -following:

    {ok, Tokens, EndPosition}
    -{eof, EndPosition}
    -{error, Error_description, EndPosition}

    This conforms to the format used by the scanner in the Erlang io library +following:

    {ok, Tokens, EndPosition}
    +{eof, EndPosition}
    +{error, Error_description, EndPosition}

    This conforms to the format used by the scanner in the Erlang io library module.

    If {eof, EndPosition} is returned immediately, the call to parse_and_scan/1 returns {ok, eof}. If {eof, EndPosition} is returned before the parser expects end of input, parse_and_scan/1 will, of course, return an error @@ -342,36 +342,36 @@ Endsymbol '$end'. grammar -> declaration : '$1'. grammar -> rule : '$1'. -declaration -> symbol symbols dot: {'$1', '$2'}. -rule -> head '->' symbols attached_code dot: {rule, ['$1' | '$3'], - '$4'}. +declaration -> symbol symbols dot: {'$1', '$2'}. +rule -> head '->' symbols attached_code dot: {rule, ['$1' | '$3'], + '$4'}. head -> symbol : '$1'. -symbols -> symbol : ['$1']. -symbols -> symbol symbols : ['$1' | '$2']. -attached_code -> ':' tokens : {erlang_code, '$2'}. -attached_code -> '$empty' : {erlang_code, - [{atom, 0, '$undefined'}]}. -tokens -> token : ['$1']. -tokens -> token tokens : ['$1' | '$2']. -symbol -> var : value_of('$1'). -symbol -> atom : value_of('$1'). -symbol -> integer : value_of('$1'). -symbol -> reserved_word : value_of('$1'). +symbols -> symbol : ['$1']. +symbols -> symbol symbols : ['$1' | '$2']. +attached_code -> ':' tokens : {erlang_code, '$2'}. +attached_code -> '$empty' : {erlang_code, + [{atom, 0, '$undefined'}]}. +tokens -> token : ['$1']. +tokens -> token tokens : ['$1' | '$2']. +symbol -> var : value_of('$1'). +symbol -> atom : value_of('$1'). +symbol -> integer : value_of('$1'). +symbol -> reserved_word : value_of('$1'). token -> var : '$1'. token -> atom : '$1'. token -> float : '$1'. token -> integer : '$1'. token -> string : '$1'. token -> char : '$1'. -token -> reserved_symbol : {value_of('$1'), line_of('$1')}. -token -> reserved_word : {value_of('$1'), line_of('$1')}. -token -> '->' : {'->', line_of('$1')}. -token -> ':' : {':', line_of('$1')}. +token -> reserved_symbol : {value_of('$1'), line_of('$1')}. +token -> reserved_word : {value_of('$1'), line_of('$1')}. +token -> '->' : {'->', line_of('$1')}. +token -> ':' : {':', line_of('$1')}. Erlang code. -value_of(Token) -> - element(3, Token). -line_of(Token) -> - element(2, Token).

    Note

    The symbols '->', and ':' have to be treated in a special way, as they are +value_of(Token) -> + element(3, Token). +line_of(Token) -> + element(2, Token).

    Note

    The symbols '->', and ':' have to be treated in a special way, as they are meta symbols of the grammar notation, as well as terminal symbols of the Yecc grammar.

    5. The file erl_parse.yrl in the lib/stdlib/src directory contains the grammar for Erlang.

    Note

    Syntactic tests are used in the code associated with some rules, and an error @@ -889,7 +889,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/404.html 2025-05-10 20:19:15.089244672 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/404.html 2025-05-10 20:19:15.093244709 +0000 @@ -147,7 +147,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/api-reference.html 2025-05-10 20:19:15.113244890 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/api-reference.html 2025-05-10 20:19:15.113244890 +0000 @@ -185,7 +185,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/notes.html 2025-05-10 20:19:15.145245180 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/notes.html 2025-05-10 20:19:15.153245252 +0000 @@ -1484,7 +1484,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/public_key.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/public_key.epub/OEBPS/content.opf 2025-05-10 20:19:15.185245542 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/public_key.epub/OEBPS/content.opf 2025-05-10 20:19:15.189245578 +0000 @@ -4,10 +4,10 @@ version="3.0"> public_key - 1.17.1 - urn:uuid:a9962607-4a8f-2b33-fe8c-b7c695495476 + urn:uuid:6e59abd0-66a1-7d3b-faff-c854e657008b en - 2025-05-10T20:11:45Z + 2041-06-12T09:31:53Z /usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/public_key.epub/OEBPS/public_key.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/public_key.epub/OEBPS/public_key.xhtml 2025-05-10 20:19:15.181245506 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/public_key.epub/OEBPS/public_key.xhtml 2025-05-10 20:19:15.185245542 +0000 @@ -3152,22 +3152,22 @@ or also by the user when the option policy_set is provided to this function. The qualifiers convey information about the valid policy and is intended as information to end users.

    Available options:

    • {verify_fun, {fun(), UserState::term()} - The fun must be -defined as:

      fun(OtpCert :: #'OTPCertificate'{},
      -    Event :: {bad_cert, Reason :: bad_cert_reason() | {revoked, atom()}} |
      -             {extension, #'Extension'{}},
      -    UserState :: term()) ->
      -  {valid, UserState :: term()} |
      -  {valid_peer, UserState :: term()} |
      -  {fail, Reason :: term()} |
      -  {unknown, UserState :: term()}.

      or as:

      fun(OtpCert :: #'OTPCertificate'{},
      -    DerCert :: der_encoded(),
      -    Event :: {bad_cert, Reason :: bad_cert_reason() | {revoked, atom()}} |
      -             {extension, #'Extension'{}},
      -    UserState :: term()) ->
      -  {valid, UserState :: term()} |
      -  {valid_peer, UserState :: term()} |
      -  {fail, Reason :: term()} |
      -  {unknown, UserState :: term()}.

      The verify callback can have 3 or 4 arguments in case the DER encoded +defined as:

      fun(OtpCert :: #'OTPCertificate'{},
      +    Event :: {bad_cert, Reason :: bad_cert_reason() | {revoked, atom()}} |
      +             {extension, #'Extension'{}},
      +    UserState :: term()) ->
      +  {valid, UserState :: term()} |
      +  {valid_peer, UserState :: term()} |
      +  {fail, Reason :: term()} |
      +  {unknown, UserState :: term()}.

      or as:

      fun(OtpCert :: #'OTPCertificate'{},
      +    DerCert :: der_encoded(),
      +    Event :: {bad_cert, Reason :: bad_cert_reason() | {revoked, atom()}} |
      +             {extension, #'Extension'{}},
      +    UserState :: term()) ->
      +  {valid, UserState :: term()} |
      +  {valid_peer, UserState :: term()} |
      +  {fail, Reason :: term()} |
      +  {unknown, UserState :: term()}.

      The verify callback can have 3 or 4 arguments in case the DER encoded version is needed by the callback.

      If the verify callback fun returns {fail, Reason}, the verification process is immediately stopped. If the verify callback fun returns {valid, UserState}, the verification process is continued. This can be used @@ -3339,9 +3339,9 @@ about hostname verification. The User's Guide and code examples describes this -function more detailed.

      The option funs are described here:

      • match_fun

        fun(ReferenceId::ReferenceId() | FQDN::string(),
        -    PresentedId::{dNSName,string()} | {uniformResourceIdentifier,string() |
        -                 {iPAddress,list(byte())} | {OtherId::atom()|oid(),term()}})

        This function replaces the default host name matching rules. The fun should +function more detailed.

        The option funs are described here:

        • match_fun

          fun(ReferenceId::ReferenceId() | FQDN::string(),
          +    PresentedId::{dNSName,string()} | {uniformResourceIdentifier,string() |
          +                 {iPAddress,list(byte())} | {OtherId::atom()|oid(),term()}})

          This function replaces the default host name matching rules. The fun should return a boolean to tell if the Reference ID and Presented ID matches or not. The match fun can also return a third value, value, the atom default, if the default matching rules shall apply. This makes it possible to augment the @@ -3536,14 +3536,14 @@

          Performs CRL validation. It is intended to be called from the verify fun of -pkix_path_validation/3 .

          Available options:

          • {update_crl, fun()} - The fun has the following type specification:

             fun(#'DistributionPoint'{}, #'CertificateList'{}) ->
            -        #'CertificateList'{}

            The fun uses the information in the distribution point to access the latest +pkix_path_validation/3 .

            Available options:

            • {update_crl, fun()} - The fun has the following type specification:

               fun(#'DistributionPoint'{}, #'CertificateList'{}) ->
              +        #'CertificateList'{}

              The fun uses the information in the distribution point to access the latest possible version of the CRL. If this fun is not specified, Public Key uses the default implementation:

               fun(_DP, CRL) -> CRL end
            • {issuer_fun, {fun(), UserState::term()}} - The fun has the following type -specification:

              fun(#'DistributionPoint'{}, #'CertificateList'{},
              -    {rdnSequence,[#'AttributeTypeAndValue'{}]}, UserState::term()) ->
              -  {ok, #'OTPCertificate'{}, [der_encoded]}

              The fun returns the root certificate and certificate chain that has signed the -CRL.

               fun(DP, CRL, Issuer, UserState) -> {ok, RootCert, CertChain}
            • {undetermined_details, boolean()} - Defaults to false. When revocation +specification:

              fun(#'DistributionPoint'{}, #'CertificateList'{},
              +    {rdnSequence,[#'AttributeTypeAndValue'{}]}, UserState::term()) ->
              +  {ok, #'OTPCertificate'{}, [der_encoded]}

              The fun returns the root certificate and certificate chain that has signed the +CRL.

               fun(DP, CRL, Issuer, UserState) -> {ok, RootCert, CertChain}
            • {undetermined_details, boolean()} - Defaults to false. When revocation status cannot be determined, and this option is set to true, details of why no CRLs where accepted are included in the return value.

            @@ -3881,18 +3881,18 @@ generating an ECDSA key. Note this could fail if Erlang/OTP is compiled with a very old cryptolib.

          • {validity, {From::erlang:timestamp(), To::erlang:timestamp()}} - The validity period of the certificate.

          • {extensions, [#'Extension'{}]} - Extensions to include in the -certificate.

            Default extensions included in CA certificates if not otherwise specified are:

            [#'Extension'{extnID = ?'id-ce-keyUsage',
            -              extnValue = [keyCertSign, cRLSign],
            -              critical = false},
            -#'Extension'{extnID = ?'id-ce-basicConstraints',
            -             extnValue = #'BasicConstraints'{cA = true},
            -             critical = true}]

            Default extensions included in the server peer cert if not otherwise specified -are:

            [#'Extension'{extnID = ?'id-ce-keyUsage',
            -              extnValue = [digitalSignature, keyAgreement],
            -              critical = false},
            -#'Extension'{extnID = ?'id-ce-subjectAltName',
            -             extnValue = [{dNSName, Hostname}],
            -             critical = false}]

            Hostname is the result of calling net_adm:localhost() in the Erlang node where +certificate.

            Default extensions included in CA certificates if not otherwise specified are:

            [#'Extension'{extnID = ?'id-ce-keyUsage',
            +              extnValue = [keyCertSign, cRLSign],
            +              critical = false},
            +#'Extension'{extnID = ?'id-ce-basicConstraints',
            +             extnValue = #'BasicConstraints'{cA = true},
            +             critical = true}]

            Default extensions included in the server peer cert if not otherwise specified +are:

            [#'Extension'{extnID = ?'id-ce-keyUsage',
            +              extnValue = [digitalSignature, keyAgreement],
            +              critical = false},
            +#'Extension'{extnID = ?'id-ce-subjectAltName',
            +             extnValue = [{dNSName, Hostname}],
            +             critical = false}]

            Hostname is the result of calling net_adm:localhost() in the Erlang node where this function is called.

          Note

          Note that the generated certificates and keys does not provide a formally correct PKIX-trust-chain and they cannot be used to achieve real security. This function is provided for testing purposes only.

          /usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/public_key.epub/OEBPS/public_key_records.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/public_key.epub/OEBPS/public_key_records.xhtml 2025-05-10 20:19:15.181245506 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/public_key.epub/OEBPS/public_key_records.xhtml 2025-05-10 20:19:15.185245542 +0000 @@ -24,7 +24,7 @@ used to handle public key infrastructure. The scope is to describe the data types of each component, not the semantics. For information on the semantics, refer to the relevant standards and RFCs linked in the sections below.

          Use the following include directive to get access to the records and constant -macros described in the following sections:

           -include_lib("public_key/include/public_key.hrl").

          +macros described in the following sections:

           -include_lib("public_key/include/public_key.hrl").

          @@ -32,48 +32,48 @@

          Common non-standard Erlang data types used to describe the record fields in the following sections and which are not defined in the Public Key -Reference Manual follows here:

          time() = utc_time() | general_time()
          +Reference Manual follows here:

          time() = utc_time() | general_time()
           
          -utc_time()  = {utcTime, "YYMMDDHHMMSSZ"}
          +utc_time()  = {utcTime, "YYMMDDHHMMSSZ"}
           
          -general_time() = {generalTime, "YYYYMMDDHHMMSSZ"}
          +general_time() = {generalTime, "YYYYMMDDHHMMSSZ"}
           
          -general_name() = {rfc822Name, string()} |
          +general_name() = {rfc822Name, string()} |
           
          -                 {dNSName, string()} |
          +                 {dNSName, string()} |
           
          -                 {x400Address, string() |
          +                 {x400Address, string() |
           
          -                 {directoryName, {rdnSequence, [#'AttributeTypeAndValue'{}]}} |
          +                 {directoryName, {rdnSequence, [#'AttributeTypeAndValue'{}]}} |
           
          -                 {ediPartyName, special_string()} |
          +                 {ediPartyName, special_string()} |
           
          -                 {ediPartyName, special_string(), special_string()} |
          +                 {ediPartyName, special_string(), special_string()} |
           
          -                 {uniformResourceIdentifier, string()} |
          +                 {uniformResourceIdentifier, string()} |
           
          -                 {iPAddress, string()} |
          +                 {iPAddress, string()} |
           
          -                 {registeredId, oid()} |
          +                 {registeredId, oid()} |
           
          -                 {otherName, term()}
          +                 {otherName, term()}
           
          -special_string() = {teletexString, string()} |
          +special_string() = {teletexString, string()} |
            
          -                   {printableString, string()} |
          +                   {printableString, string()} |
           
          -                   {universalString, string()} |
          +                   {universalString, string()} |
           
          -                   {utf8String, binary()} |
          +                   {utf8String, binary()} |
           
          -                   {bmpString, string()}
          +                   {bmpString, string()}
           
          -dist_reason() = unused | keyCompromise | cACompromise | affiliationChanged |
          +dist_reason() = unused | keyCompromise | cACompromise | affiliationChanged |
                           cessationOfOperation | certificateHold | privilegeWithdrawn | aACompromise
           
          -OID_macro() = ?OID_name()
          +OID_macro() = ?OID_name()
           
          -OID_name() = atom()

          +OID_name() = atom()

          @@ -81,12 +81,12 @@

          Erlang representation of Rivest-Shamir-Adleman cryptosystem (RSA) -keys follows:

          #'RSAPublicKey'{
          +keys follows:

          #'RSAPublicKey'{
              modulus,       % pos_integer()
              publicExponent % pos_integer()
          -  }.
          +  }.
           
          -#'RSAPrivateKey'{
          +#'RSAPrivateKey'{
              version,         % two-prime | multi
              modulus,         % pos_integer()
              publicExponent,  % pos_integer()
          @@ -97,50 +97,50 @@
              exponent2,       % pos_integer()
              coefficient,     % pos_integer()
              otherPrimeInfos  % [#OtherPrimeInfo{}] | asn1_NOVALUE
          -  }.
          +  }.
           
          -#'OtherPrimeInfo'{
          +#'OtherPrimeInfo'{
              prime,           % pos_integer()
              exponent,        % pos_integer()
              coefficient      % pos_integer()
          -  }.
          +  }.
           
          -#'RSASSA-PSS-params'{
          +#'RSASSA-PSS-params'{
              hashAlgorithm,     % #'HashAlgorithm'{}},
              maskGenAlgorithm,  % #'MaskGenAlgorithm'{}},
              saltLength,        % pos_integer(),
              trailerField,      % pos_integer()
          -  }.
          +  }.
           
          -#'HashAlgorithm'{
          +#'HashAlgorithm'{
              algorithm,  % oid()
              parameters  % defaults to asn1_NOVALUE
          -  }.
          +  }.
           
          -#'MaskGenAlgorithm'{
          +#'MaskGenAlgorithm'{
              algorithm,  % oid()
              parameters, % defaults to asn1_NOVALUE
          -  }.

          + }.

          DSA

          Erlang representation of -Digital Signature Algorithm (DSA) keys

          #'DSAPrivateKey'{
          +Digital Signature Algorithm (DSA) keys

          #'DSAPrivateKey'{
              version,      % pos_integer()
              p,            % pos_integer()
              q,            % pos_integer()
              g,            % pos_integer()
              y,            % pos_integer()
              x             % pos_integer()
          -  }.
          +  }.
           
          -#'Dss-Parms'{
          +#'Dss-Parms'{
              p,         % pos_integer()
              q,         % pos_integer()
              g          % pos_integer()
          -  }.

          + }.

          @@ -151,38 +151,38 @@ and Edwards-Curve Digital Signature Algorithm (EDDSA) where parameters in the private key will be -{namedCurve, ?'id-Ed25519' | ?'id-Ed448'}.

          #'ECPrivateKey'{
          +{namedCurve, ?'id-Ed25519' | ?'id-Ed448'}.

          #'ECPrivateKey'{
              version,       % pos_integer()
              privateKey,    % binary()
              parameters,    % {ecParameters, #'ECParameters'{}} |
                             % {namedCurve, Oid::tuple()} |
                             % {implicitlyCA, 'NULL'}
              publicKey      % bitstring()
          -  }.
          +  }.
           
          -#'ECParameters'{
          +#'ECParameters'{
              version,    % pos_integer()
              fieldID,    % #'FieldID'{}
              curve,      % #'Curve'{}
              base,       % binary()
              order,      % pos_integer()
              cofactor    % pos_integer()
          -  }.
          +  }.
           
          -#'Curve'{
          +#'Curve'{
              a,        % binary()
              b,        % binary()
              seed      % bitstring() - optional
          -  }.
          +  }.
           
          -#'FieldID'{
          +#'FieldID'{
              fieldType,    % oid()
              parameters    % Depending on fieldType
          -  }.
          /usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/public_key.epub/OEBPS/using_public_key.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines)
          --- old//usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/public_key.epub/OEBPS/using_public_key.xhtml	2025-05-10 20:19:15.181245506 +0000
          +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/public_key.epub/OEBPS/using_public_key.xhtml	2025-05-10 20:19:15.185245542 +0000
          @@ -43,30 +43,30 @@
             
             DSA Private Key
           

          -

          A DSA private key can look as follows:

          Note

          File handling is not done by the Public Key application.

          1> {ok, PemBin} = file:read_file("dsa.pem").
          -{ok,<<"-----BEGIN DSA PRIVATE KEY-----\nMIIBuw"...>>}

          The following PEM file has only one entry, a private DSA key:

          2>[DSAEntry] =  public_key:pem_decode(PemBin).
          -[{'DSAPrivateKey',<<48,130,1,187,2,1,0,2,129,129,0,183,
          +

          A DSA private key can look as follows:

          Note

          File handling is not done by the Public Key application.

          1> {ok, PemBin} = file:read_file("dsa.pem").
          +{ok,<<"-----BEGIN DSA PRIVATE KEY-----\nMIIBuw"...>>}

          The following PEM file has only one entry, a private DSA key:

          2>[DSAEntry] =  public_key:pem_decode(PemBin).
          +[{'DSAPrivateKey',<<48,130,1,187,2,1,0,2,129,129,0,183,
                               179,230,217,37,99,144,157,21,228,204,
                               162,207,61,246,...>>,
          -                    not_encrypted}]
          3> Key = public_key:pem_entry_decode(DSAEntry).
          -#'DSAPrivateKey'{version = 0,
          +                    not_encrypted}]
          3> Key = public_key:pem_entry_decode(DSAEntry).
          +#'DSAPrivateKey'{version = 0,
                            p = 12900045185019966618...6593,
                            q = 1216700114794736143432235288305776850295620488937,
                            g = 10442040227452349332...47213,
                            y = 87256807980030509074...403143,
          -                 x = 510968529856012146351317363807366575075645839654}

          + x = 510968529856012146351317363807366575075645839654}

          RSA Private Key with Password

          -

          An RSA private key encrypted with a password can look as follows:

          1> {ok, PemBin} = file:read_file("rsa.pem").
          -{ok,<<"Bag Attribute"...>>}

          The following PEM file has only one entry, a private RSA key:

          2>[RSAEntry] = public_key:pem_decode(PemBin).
          -[{'RSAPrivateKey',<<224,108,117,203,152,40,15,77,128,126,
          +

          An RSA private key encrypted with a password can look as follows:

          1> {ok, PemBin} = file:read_file("rsa.pem").
          +{ok,<<"Bag Attribute"...>>}

          The following PEM file has only one entry, a private RSA key:

          2>[RSAEntry] = public_key:pem_decode(PemBin).
          +[{'RSAPrivateKey',<<224,108,117,203,152,40,15,77,128,126,
                               221,195,154,249,85,208,202,251,109,
                               119,120,57,29,89,19,9,...>>,
          -                  {"DES-EDE3-CBC",<<"kÙeø¼pµL">>}}]

          In this following example, the password is "abcd1234":

          3> Key = public_key:pem_entry_decode(RSAEntry, "abcd1234").
          -#'RSAPrivateKey'{version = 'two-prime',
          +                  {"DES-EDE3-CBC",<<"kÙeø¼pµL">>}}]

          In this following example, the password is "abcd1234":

          3> Key = public_key:pem_entry_decode(RSAEntry, "abcd1234").
          +#'RSAPrivateKey'{version = 'two-prime',
                            modulus = 1112355156729921663373...2737107,
                            publicExponent = 65537,
                            privateExponent = 58064406231183...2239766033,
          @@ -75,201 +75,201 @@
                            exponent1 = 77928819327425934607...22152984217,
                            exponent2 = 36287623121853605733...20588523793,
                            coefficient = 924840412626098444...41820968343,
          -                 otherPrimeInfos = asn1_NOVALUE}

          + otherPrimeInfos = asn1_NOVALUE}

          X509 Certificates

          -

          The following is an example of X509 certificates:

          1> {ok, PemBin} = file:read_file("cacerts.pem").
          -{ok,<<"-----BEGIN CERTIFICATE-----\nMIIC7jCCAl"...>>}

          The following file includes two certificates:

          2> [CertEntry1, CertEntry2] = public_key:pem_decode(PemBin).
          -[{'Certificate',<<48,130,2,238,48,130,2,87,160,3,2,1,2,2,
          +

          The following is an example of X509 certificates:

          1> {ok, PemBin} = file:read_file("cacerts.pem").
          +{ok,<<"-----BEGIN CERTIFICATE-----\nMIIC7jCCAl"...>>}

          The following file includes two certificates:

          2> [CertEntry1, CertEntry2] = public_key:pem_decode(PemBin).
          +[{'Certificate',<<48,130,2,238,48,130,2,87,160,3,2,1,2,2,
                             9,0,230,145,97,214,191,2,120,150,48,13,
                             ...>>,
          -                not_encrypted},
          - {'Certificate',<<48,130,3,200,48,130,3,49,160,3,2,1,2,2,1,
          +                not_encrypted},
          + {'Certificate',<<48,130,3,200,48,130,3,49,160,3,2,1,2,2,1,
                             1,48,13,6,9,42,134,72,134,247,...>>,
          -                not_encrypted}]

          Certificates can be decoded as usual:

          2> Cert = public_key:pem_entry_decode(CertEntry1).
          -#'Certificate'{
          +                not_encrypted}]

          Certificates can be decoded as usual:

          2> Cert = public_key:pem_entry_decode(CertEntry1).
          +#'Certificate'{
               tbsCertificate =
          -        #'TBSCertificate'{
          +        #'TBSCertificate'{
                       version = v3,serialNumber = 16614168075301976214,
                       signature =
          -                #'AlgorithmIdentifier'{
          -                    algorithm = {1,2,840,113549,1,1,5},
          -                    parameters = <<5,0>>},
          +                #'AlgorithmIdentifier'{
          +                    algorithm = {1,2,840,113549,1,1,5},
          +                    parameters = <<5,0>>},
                       issuer =
          -                {rdnSequence,
          -                    [[#'AttributeTypeAndValue'{
          -                          type = {2,5,4,3},
          -                          value = <<19,8,101,114,108,97,110,103,67,65>>}],
          -                     [#'AttributeTypeAndValue'{
          -                          type = {2,5,4,11},
          -                          value = <<19,10,69,114,108,97,110,103,32,79,84,80>>}],
          -                     [#'AttributeTypeAndValue'{
          -                          type = {2,5,4,10},
          -                          value = <<19,11,69,114,105,99,115,115,111,110,32,65,66>>}],
          -                     [#'AttributeTypeAndValue'{
          -                          type = {2,5,4,7},
          -                          value = <<19,9,83,116,111,99,107,104,111,108,109>>}],
          -                     [#'AttributeTypeAndValue'{
          -                          type = {2,5,4,6},
          -                          value = <<19,2,83,69>>}],
          -                     [#'AttributeTypeAndValue'{
          -                          type = {1,2,840,113549,1,9,1},
          -                          value = <<22,22,112,101,116,101,114,64,101,114,...>>}]]},
          +                {rdnSequence,
          +                    [[#'AttributeTypeAndValue'{
          +                          type = {2,5,4,3},
          +                          value = <<19,8,101,114,108,97,110,103,67,65>>}],
          +                     [#'AttributeTypeAndValue'{
          +                          type = {2,5,4,11},
          +                          value = <<19,10,69,114,108,97,110,103,32,79,84,80>>}],
          +                     [#'AttributeTypeAndValue'{
          +                          type = {2,5,4,10},
          +                          value = <<19,11,69,114,105,99,115,115,111,110,32,65,66>>}],
          +                     [#'AttributeTypeAndValue'{
          +                          type = {2,5,4,7},
          +                          value = <<19,9,83,116,111,99,107,104,111,108,109>>}],
          +                     [#'AttributeTypeAndValue'{
          +                          type = {2,5,4,6},
          +                          value = <<19,2,83,69>>}],
          +                     [#'AttributeTypeAndValue'{
          +                          type = {1,2,840,113549,1,9,1},
          +                          value = <<22,22,112,101,116,101,114,64,101,114,...>>}]]},
                       validity =
          -                #'Validity'{
          -                    notBefore = {utcTime,"080109082929Z"},
          -                    notAfter = {utcTime,"080208082929Z"}},
          +                #'Validity'{
          +                    notBefore = {utcTime,"080109082929Z"},
          +                    notAfter = {utcTime,"080208082929Z"}},
                       subject =
          -                {rdnSequence,
          -                    [[#'AttributeTypeAndValue'{
          -                          type = {2,5,4,3},
          -                          value = <<19,8,101,114,108,97,110,103,67,65>>}],
          -                     [#'AttributeTypeAndValue'{
          -                          type = {2,5,4,11},
          -                          value = <<19,10,69,114,108,97,110,103,32,79,84,80>>}],
          -                     [#'AttributeTypeAndValue'{
          -                          type = {2,5,4,10},
          -                          value = <<19,11,69,114,105,99,115,115,111,110,32,...>>}],
          -                     [#'AttributeTypeAndValue'{
          -                          type = {2,5,4,7},
          -                          value = <<19,9,83,116,111,99,107,104,111,108,...>>}],
          -                     [#'AttributeTypeAndValue'{
          -                          type = {2,5,4,6},
          -                          value = <<19,2,83,69>>}],
          -                     [#'AttributeTypeAndValue'{
          -                          type = {1,2,840,113549,1,9,1},
          -                          value = <<22,22,112,101,116,101,114,64,...>>}]]},
          +                {rdnSequence,
          +                    [[#'AttributeTypeAndValue'{
          +                          type = {2,5,4,3},
          +                          value = <<19,8,101,114,108,97,110,103,67,65>>}],
          +                     [#'AttributeTypeAndValue'{
          +                          type = {2,5,4,11},
          +                          value = <<19,10,69,114,108,97,110,103,32,79,84,80>>}],
          +                     [#'AttributeTypeAndValue'{
          +                          type = {2,5,4,10},
          +                          value = <<19,11,69,114,105,99,115,115,111,110,32,...>>}],
          +                     [#'AttributeTypeAndValue'{
          +                          type = {2,5,4,7},
          +                          value = <<19,9,83,116,111,99,107,104,111,108,...>>}],
          +                     [#'AttributeTypeAndValue'{
          +                          type = {2,5,4,6},
          +                          value = <<19,2,83,69>>}],
          +                     [#'AttributeTypeAndValue'{
          +                          type = {1,2,840,113549,1,9,1},
          +                          value = <<22,22,112,101,116,101,114,64,...>>}]]},
                       subjectPublicKeyInfo =
          -                #'SubjectPublicKeyInfo'{
          +                #'SubjectPublicKeyInfo'{
                               algorithm =
          -                        #'AlgorithmIdentifier'{
          -                            algorithm = {1,2,840,113549,1,1,1},
          -                            parameters = <<5,0>>},
          +                        #'AlgorithmIdentifier'{
          +                            algorithm = {1,2,840,113549,1,1,1},
          +                            parameters = <<5,0>>},
                               subjectPublicKey =
          -                        {0,<<48,129,137,2,129,129,0,203,209,187,77,73,231,90,...>>}},
          +                        {0,<<48,129,137,2,129,129,0,203,209,187,77,73,231,90,...>>}},
                       issuerUniqueID = asn1_NOVALUE,
                       subjectUniqueID = asn1_NOVALUE,
                       extensions =
          -                [#'Extension'{
          -                     extnID = {2,5,29,19},
          +                [#'Extension'{
          +                     extnID = {2,5,29,19},
                                critical = true,
          -                     extnValue = [48,3,1,1,255]},
          -                 #'Extension'{
          -                     extnID = {2,5,29,15},
          +                     extnValue = [48,3,1,1,255]},
          +                 #'Extension'{
          +                     extnID = {2,5,29,15},
                                critical = false,
          -                     extnValue = [3,2,1,6]},
          -                 #'Extension'{
          -                     extnID = {2,5,29,14},
          +                     extnValue = [3,2,1,6]},
          /usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/public_key.html differs (HTML document, UTF-8 Unicode text, with very long lines)
          --- old//usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/public_key.html	2025-05-10 20:19:15.337246921 +0000
          +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/public_key.html	2025-05-10 20:19:15.337246921 +0000
          @@ -3313,22 +3313,22 @@
           or also by the user when the option policy_set is provided to this
           function. The qualifiers convey information about the valid policy and
           is intended as information to end users.

          Available options:

          • {verify_fun, {fun(), UserState::term()} - The fun must be -defined as:

            fun(OtpCert :: #'OTPCertificate'{},
            -    Event :: {bad_cert, Reason :: bad_cert_reason() | {revoked, atom()}} |
            -             {extension, #'Extension'{}},
            -    UserState :: term()) ->
            -  {valid, UserState :: term()} |
            -  {valid_peer, UserState :: term()} |
            -  {fail, Reason :: term()} |
            -  {unknown, UserState :: term()}.

            or as:

            fun(OtpCert :: #'OTPCertificate'{},
            -    DerCert :: der_encoded(),
            -    Event :: {bad_cert, Reason :: bad_cert_reason() | {revoked, atom()}} |
            -             {extension, #'Extension'{}},
            -    UserState :: term()) ->
            -  {valid, UserState :: term()} |
            -  {valid_peer, UserState :: term()} |
            -  {fail, Reason :: term()} |
            -  {unknown, UserState :: term()}.

            The verify callback can have 3 or 4 arguments in case the DER encoded +defined as:

            fun(OtpCert :: #'OTPCertificate'{},
            +    Event :: {bad_cert, Reason :: bad_cert_reason() | {revoked, atom()}} |
            +             {extension, #'Extension'{}},
            +    UserState :: term()) ->
            +  {valid, UserState :: term()} |
            +  {valid_peer, UserState :: term()} |
            +  {fail, Reason :: term()} |
            +  {unknown, UserState :: term()}.

            or as:

            fun(OtpCert :: #'OTPCertificate'{},
            +    DerCert :: der_encoded(),
            +    Event :: {bad_cert, Reason :: bad_cert_reason() | {revoked, atom()}} |
            +             {extension, #'Extension'{}},
            +    UserState :: term()) ->
            +  {valid, UserState :: term()} |
            +  {valid_peer, UserState :: term()} |
            +  {fail, Reason :: term()} |
            +  {unknown, UserState :: term()}.

            The verify callback can have 3 or 4 arguments in case the DER encoded version is needed by the callback.

            If the verify callback fun returns {fail, Reason}, the verification process is immediately stopped. If the verify callback fun returns {valid, UserState}, the verification process is continued. This can be used @@ -3500,9 +3500,9 @@ about hostname verification. The User's Guide and code examples describes this -function more detailed.

            The option funs are described here:

            • match_fun

              fun(ReferenceId::ReferenceId() | FQDN::string(),
              -    PresentedId::{dNSName,string()} | {uniformResourceIdentifier,string() |
              -                 {iPAddress,list(byte())} | {OtherId::atom()|oid(),term()}})

              This function replaces the default host name matching rules. The fun should +function more detailed.

              The option funs are described here:

              • match_fun

                fun(ReferenceId::ReferenceId() | FQDN::string(),
                +    PresentedId::{dNSName,string()} | {uniformResourceIdentifier,string() |
                +                 {iPAddress,list(byte())} | {OtherId::atom()|oid(),term()}})

                This function replaces the default host name matching rules. The fun should return a boolean to tell if the Reference ID and Presented ID matches or not. The match fun can also return a third value, value, the atom default, if the default matching rules shall apply. This makes it possible to augment the @@ -3702,14 +3702,14 @@

                Performs CRL validation. It is intended to be called from the verify fun of -pkix_path_validation/3 .

                Available options:

                • {update_crl, fun()} - The fun has the following type specification:

                   fun(#'DistributionPoint'{}, #'CertificateList'{}) ->
                  -        #'CertificateList'{}

                  The fun uses the information in the distribution point to access the latest +pkix_path_validation/3 .

                  Available options:

                  • {update_crl, fun()} - The fun has the following type specification:

                     fun(#'DistributionPoint'{}, #'CertificateList'{}) ->
                    +        #'CertificateList'{}

                    The fun uses the information in the distribution point to access the latest possible version of the CRL. If this fun is not specified, Public Key uses the default implementation:

                     fun(_DP, CRL) -> CRL end
                  • {issuer_fun, {fun(), UserState::term()}} - The fun has the following type -specification:

                    fun(#'DistributionPoint'{}, #'CertificateList'{},
                    -    {rdnSequence,[#'AttributeTypeAndValue'{}]}, UserState::term()) ->
                    -  {ok, #'OTPCertificate'{}, [der_encoded]}

                    The fun returns the root certificate and certificate chain that has signed the -CRL.

                     fun(DP, CRL, Issuer, UserState) -> {ok, RootCert, CertChain}
                  • {undetermined_details, boolean()} - Defaults to false. When revocation +specification:

                    fun(#'DistributionPoint'{}, #'CertificateList'{},
                    +    {rdnSequence,[#'AttributeTypeAndValue'{}]}, UserState::term()) ->
                    +  {ok, #'OTPCertificate'{}, [der_encoded]}

                    The fun returns the root certificate and certificate chain that has signed the +CRL.

                     fun(DP, CRL, Issuer, UserState) -> {ok, RootCert, CertChain}
                  • {undetermined_details, boolean()} - Defaults to false. When revocation status cannot be determined, and this option is set to true, details of why no CRLs where accepted are included in the return value.

                  @@ -4057,18 +4057,18 @@ generating an ECDSA key. Note this could fail if Erlang/OTP is compiled with a very old cryptolib.

                • {validity, {From::erlang:timestamp(), To::erlang:timestamp()}} - The validity period of the certificate.

                • {extensions, [#'Extension'{}]} - Extensions to include in the -certificate.

                  Default extensions included in CA certificates if not otherwise specified are:

                  [#'Extension'{extnID = ?'id-ce-keyUsage',
                  -              extnValue = [keyCertSign, cRLSign],
                  -              critical = false},
                  -#'Extension'{extnID = ?'id-ce-basicConstraints',
                  -             extnValue = #'BasicConstraints'{cA = true},
                  -             critical = true}]

                  Default extensions included in the server peer cert if not otherwise specified -are:

                  [#'Extension'{extnID = ?'id-ce-keyUsage',
                  -              extnValue = [digitalSignature, keyAgreement],
                  -              critical = false},
                  -#'Extension'{extnID = ?'id-ce-subjectAltName',
                  -             extnValue = [{dNSName, Hostname}],
                  -             critical = false}]

                  Hostname is the result of calling net_adm:localhost() in the Erlang node where +certificate.

                  Default extensions included in CA certificates if not otherwise specified are:

                  [#'Extension'{extnID = ?'id-ce-keyUsage',
                  +              extnValue = [keyCertSign, cRLSign],
                  +              critical = false},
                  +#'Extension'{extnID = ?'id-ce-basicConstraints',
                  +             extnValue = #'BasicConstraints'{cA = true},
                  +             critical = true}]

                  Default extensions included in the server peer cert if not otherwise specified +are:

                  [#'Extension'{extnID = ?'id-ce-keyUsage',
                  +              extnValue = [digitalSignature, keyAgreement],
                  +              critical = false},
                  +#'Extension'{extnID = ?'id-ce-subjectAltName',
                  +             extnValue = [{dNSName, Hostname}],
                  +             critical = false}]

                  Hostname is the result of calling net_adm:localhost() in the Erlang node where this function is called.

                Note

                Note that the generated certificates and keys does not provide a formally correct PKIX-trust-chain and they cannot be used to achieve real security. This function is provided for testing purposes only.

                @@ -4420,7 +4420,7 @@ Erlang programming language

                -

                Copyright © 1996-2025 Ericsson AB

                +

                Copyright © 1996-2041 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/public_key_app.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/public_key_app.html 2025-05-10 20:19:15.365247175 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/public_key_app.html 2025-05-10 20:19:15.365247175 +0000 @@ -225,7 +225,7 @@ Erlang programming language

                -

                Copyright © 1996-2025 Ericsson AB

                +

                Copyright © 1996-2041 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/public_key_records.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/public_key_records.html 2025-05-10 20:19:15.401247501 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/public_key_records.html 2025-05-10 20:19:15.401247501 +0000 @@ -129,7 +129,7 @@ used to handle public key infrastructure. The scope is to describe the data types of each component, not the semantics. For information on the semantics, refer to the relevant standards and RFCs linked in the sections below.

                Use the following include directive to get access to the records and constant -macros described in the following sections:

                 -include_lib("public_key/include/public_key.hrl").

                +macros described in the following sections:

                 -include_lib("public_key/include/public_key.hrl").

                @@ -137,48 +137,48 @@

                Common non-standard Erlang data types used to describe the record fields in the following sections and which are not defined in the Public Key -Reference Manual follows here:

                time() = utc_time() | general_time()
                +Reference Manual follows here:

                time() = utc_time() | general_time()
                 
                -utc_time()  = {utcTime, "YYMMDDHHMMSSZ"}
                +utc_time()  = {utcTime, "YYMMDDHHMMSSZ"}
                 
                -general_time() = {generalTime, "YYYYMMDDHHMMSSZ"}
                +general_time() = {generalTime, "YYYYMMDDHHMMSSZ"}
                 
                -general_name() = {rfc822Name, string()} |
                +general_name() = {rfc822Name, string()} |
                 
                -                 {dNSName, string()} |
                +                 {dNSName, string()} |
                 
                -                 {x400Address, string() |
                +                 {x400Address, string() |
                 
                -                 {directoryName, {rdnSequence, [#href_anchor"ss">'AttributeTypeAndValue'{}]}} |
                +                 {directoryName, {rdnSequence, [#href_anchor"ss">'AttributeTypeAndValue'{}]}} |
                 
                -                 {ediPartyName, special_string()} |
                +                 {ediPartyName, special_string()} |
                 
                -                 {ediPartyName, special_string(), special_string()} |
                +                 {ediPartyName, special_string(), special_string()} |
                 
                -                 {uniformResourceIdentifier, string()} |
                +                 {uniformResourceIdentifier, string()} |
                 
                -                 {iPAddress, string()} |
                +                 {iPAddress, string()} |
                 
                -                 {registeredId, oid()} |
                +                 {registeredId, oid()} |
                 
                -                 {otherName, term()}
                +                 {otherName, term()}
                 
                -special_string() = {teletexString, string()} |
                +special_string() = {teletexString, string()} |
                  
                -                   {printableString, string()} |
                +                   {printableString, string()} |
                 
                -                   {universalString, string()} |
                +                   {universalString, string()} |
                 
                -                   {utf8String, binary()} |
                +                   {utf8String, binary()} |
                 
                -                   {bmpString, string()}
                +                   {bmpString, string()}
                 
                -dist_reason() = unused | keyCompromise | cACompromise | affiliationChanged |
                +dist_reason() = unused | keyCompromise | cACompromise | affiliationChanged |
                                 cessationOfOperation | certificateHold | privilegeWithdrawn | aACompromise
                 
                -OID_macro() = ?OID_name()
                +OID_macro() = ?OID_name()
                 
                -OID_name() = atom()

                +OID_name() = atom()

                @@ -186,12 +186,12 @@

                Erlang representation of Rivest-Shamir-Adleman cryptosystem (RSA) -keys follows:

                #href_anchor"ss">'RSAPublicKey'{
                +keys follows:

                #href_anchor"ss">'RSAPublicKey'{
                    modulus,       % pos_integer()
                    publicExponent % pos_integer()
                -  }.
                +  }.
                 
                -#'RSAPrivateKey'{
                +#'RSAPrivateKey'{
                    version,         % two-prime | multi
                    modulus,         % pos_integer()
                    publicExponent,  % pos_integer()
                @@ -202,50 +202,50 @@
                    exponent2,       % pos_integer()
                    coefficient,     % pos_integer()
                    otherPrimeInfos  % [#OtherPrimeInfo{}] | asn1_NOVALUE
                -  }.
                +  }.
                 
                -#'OtherPrimeInfo'{
                +#'OtherPrimeInfo'{
                    prime,           % pos_integer()
                    exponent,        % pos_integer()
                    coefficient      % pos_integer()
                -  }.
                +  }.
                 
                -#'RSASSA-PSS-params'{
                +#'RSASSA-PSS-params'{
                    hashAlgorithm,     % #'HashAlgorithm'{}},
                    maskGenAlgorithm,  % #'MaskGenAlgorithm'{}},
                    saltLength,        % pos_integer(),
                    trailerField,      % pos_integer()
                -  }.
                +  }.
                 
                -#'HashAlgorithm'{
                +#'HashAlgorithm'{
                    algorithm,  % oid()
                    parameters  % defaults to asn1_NOVALUE
                -  }.
                +  }.
                 
                -#'MaskGenAlgorithm'{
                +#'MaskGenAlgorithm'{
                    algorithm,  % oid()
                    parameters, % defaults to asn1_NOVALUE
                -  }.

                + }.

                DSA

                Erlang representation of -Digital Signature Algorithm (DSA) keys

                #href_anchor"ss">'DSAPrivateKey'{
                +Digital Signature Algorithm (DSA) keys

                #href_anchor"ss">'DSAPrivateKey'{
                    version,      % pos_integer()
                    p,            % pos_integer()
                    q,            % pos_integer()
                    g,            % pos_integer()
                    y,            % pos_integer()
                    x             % pos_integer()
                -  }.
                +  }.
                 
                -#'Dss-Parms'{
                +#'Dss-Parms'{
                    p,         % pos_integer()
                    q,         % pos_integer()
                    g          % pos_integer()
                -  }.

                + }.

                @@ -256,38 +256,38 @@ and Edwards-Curve Digital Signature Algorithm (EDDSA) where parameters in the private key will be -{namedCurve, ?'id-Ed25519' | ?'id-Ed448'}.

                #href_anchor"ss">'ECPrivateKey'{
                +{namedCurve, ?'id-Ed25519' | ?'id-Ed448'}.

                #href_anchor"ss">'ECPrivateKey'{
                    version,       % pos_integer()
                    privateKey,    % binary()
                    parameters,    % {ecParameters, #'ECParameters'{}} |
                                   % {namedCurve, Oid::tuple()} |
                                   % {implicitlyCA, 'NULL'}
                    publicKey      % bitstring()
                -  }.
                +  }.
                 
                -#'ECParameters'{
                +#'ECParameters'{
                    version,    % pos_integer()
                    fieldID,    % #'FieldID'{}
                    curve,      % #'Curve'{}
                    base,       % binary()
                    order,      % pos_integer()
                    cofactor    % pos_integer()
                -  }.
                +  }.
                 
                -#'Curve'{
                +#'Curve'{
                    a,        % binary()
                    b,        % binary()
                    seed      % bitstring() - optional
                -  }.
                +  }.
                 
                -#'FieldID'{
                +#'FieldID'{
                    fieldType,    % oid()
                    parameters    % Depending on fieldType
                -  }.
                /usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/search.html differs (HTML document, UTF-8 Unicode text)
                --- old//usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/search.html	2025-05-10 20:19:15.421247682 +0000
                +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/search.html	2025-05-10 20:19:15.421247682 +0000
                @@ -145,7 +145,7 @@
                           Erlang programming language
                 
                       

                -

                Copyright © 1996-2025 Ericsson AB

                +

                Copyright © 1996-2041 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/using_public_key.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/using_public_key.html 2025-05-10 20:19:15.457248009 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.17.1/doc/html/using_public_key.html 2025-05-10 20:19:15.469248117 +0000 @@ -148,30 +148,30 @@ DSA Private Key

                -

                A DSA private key can look as follows:

                Note

                File handling is not done by the Public Key application.

                1> {ok, PemBin} = file:read_file("dsa.pem").
                -{ok,<<"-----BEGIN DSA PRIVATE KEY-----\nMIIBuw"...>>}

                The following PEM file has only one entry, a private DSA key:

                2>[DSAEntry] =  public_key:pem_decode(PemBin).
                -[{'DSAPrivateKey',<<48,130,1,187,2,1,0,2,129,129,0,183,
                +

                A DSA private key can look as follows:

                Note

                File handling is not done by the Public Key application.

                1> {ok, PemBin} = file:read_file("dsa.pem").
                +{ok,<<"-----BEGIN DSA PRIVATE KEY-----\nMIIBuw"...>>}

                The following PEM file has only one entry, a private DSA key:

                2>[DSAEntry] =  public_key:pem_decode(PemBin).
                +[{'DSAPrivateKey',<<48,130,1,187,2,1,0,2,129,129,0,183,
                                     179,230,217,37,99,144,157,21,228,204,
                                     162,207,61,246,...>>,
                -                    not_encrypted}]
                3> Key = public_key:pem_entry_decode(DSAEntry).
                -#'DSAPrivateKey'{version = 0,
                +                    not_encrypted}]
                3> Key = public_key:pem_entry_decode(DSAEntry).
                +#'DSAPrivateKey'{version = 0,
                                  p = 12900045185019966618...6593,
                                  q = 1216700114794736143432235288305776850295620488937,
                                  g = 10442040227452349332...47213,
                                  y = 87256807980030509074...403143,
                -                 x = 510968529856012146351317363807366575075645839654}

                + x = 510968529856012146351317363807366575075645839654}

                RSA Private Key with Password

                -

                An RSA private key encrypted with a password can look as follows:

                1> {ok, PemBin} = file:read_file("rsa.pem").
                -{ok,<<"Bag Attribute"...>>}

                The following PEM file has only one entry, a private RSA key:

                2>[RSAEntry] = public_key:pem_decode(PemBin).
                -[{'RSAPrivateKey',<<224,108,117,203,152,40,15,77,128,126,
                +

                An RSA private key encrypted with a password can look as follows:

                1> {ok, PemBin} = file:read_file("rsa.pem").
                +{ok,<<"Bag Attribute"...>>}

                The following PEM file has only one entry, a private RSA key:

                2>[RSAEntry] = public_key:pem_decode(PemBin).
                +[{'RSAPrivateKey',<<224,108,117,203,152,40,15,77,128,126,
                                     221,195,154,249,85,208,202,251,109,
                                     119,120,57,29,89,19,9,...>>,
                -                  {"DES-EDE3-CBC",<<"kÙeø¼pµL">>}}]

                In this following example, the password is "abcd1234":

                3> Key = public_key:pem_entry_decode(RSAEntry, "abcd1234").
                -#'RSAPrivateKey'{version = 'two-prime',
                +                  {"DES-EDE3-CBC",<<"kÙeø¼pµL">>}}]

                In this following example, the password is "abcd1234":

                3> Key = public_key:pem_entry_decode(RSAEntry, "abcd1234").
                +#'RSAPrivateKey'{version = 'two-prime',
                                  modulus = 1112355156729921663373...2737107,
                                  publicExponent = 65537,
                                  privateExponent = 58064406231183...2239766033,
                @@ -180,201 +180,201 @@
                                  exponent1 = 77928819327425934607...22152984217,
                                  exponent2 = 36287623121853605733...20588523793,
                                  coefficient = 924840412626098444...41820968343,
                -                 otherPrimeInfos = asn1_NOVALUE}

                + otherPrimeInfos = asn1_NOVALUE}

                X509 Certificates

                -

                The following is an example of X509 certificates:

                1> {ok, PemBin} = file:read_file("cacerts.pem").
                -{ok,<<"-----BEGIN CERTIFICATE-----\nMIIC7jCCAl"...>>}

                The following file includes two certificates:

                2> [CertEntry1, CertEntry2] = public_key:pem_decode(PemBin).
                -[{'Certificate',<<48,130,2,238,48,130,2,87,160,3,2,1,2,2,
                +

                The following is an example of X509 certificates:

                1> {ok, PemBin} = file:read_file("cacerts.pem").
                +{ok,<<"-----BEGIN CERTIFICATE-----\nMIIC7jCCAl"...>>}

                The following file includes two certificates:

                2> [CertEntry1, CertEntry2] = public_key:pem_decode(PemBin).
                +[{'Certificate',<<48,130,2,238,48,130,2,87,160,3,2,1,2,2,
                                   9,0,230,145,97,214,191,2,120,150,48,13,
                                   ...>>,
                -                not_encrypted},
                - {'Certificate',<<48,130,3,200,48,130,3,49,160,3,2,1,2,2,1,
                +                not_encrypted},
                + {'Certificate',<<48,130,3,200,48,130,3,49,160,3,2,1,2,2,1,
                                   1,48,13,6,9,42,134,72,134,247,...>>,
                -                not_encrypted}]

                Certificates can be decoded as usual:

                2> Cert = public_key:pem_entry_decode(CertEntry1).
                -#'Certificate'{
                +                not_encrypted}]

                Certificates can be decoded as usual:

                2> Cert = public_key:pem_entry_decode(CertEntry1).
                +#'Certificate'{
                     tbsCertificate =
                -        #'TBSCertificate'{
                +        #'TBSCertificate'{
                             version = v3,serialNumber = 16614168075301976214,
                             signature =
                -                #'AlgorithmIdentifier'{
                -                    algorithm = {1,2,840,113549,1,1,5},
                -                    parameters = <<5,0>>},
                +                #'AlgorithmIdentifier'{
                +                    algorithm = {1,2,840,113549,1,1,5},
                +                    parameters = <<5,0>>},
                             issuer =
                -                {rdnSequence,
                -                    [[#'AttributeTypeAndValue'{
                -                          type = {2,5,4,3},
                -                          value = <<19,8,101,114,108,97,110,103,67,65>>}],
                -                     [#'AttributeTypeAndValue'{
                -                          type = {2,5,4,11},
                -                          value = <<19,10,69,114,108,97,110,103,32,79,84,80>>}],
                -                     [#'AttributeTypeAndValue'{
                -                          type = {2,5,4,10},
                -                          value = <<19,11,69,114,105,99,115,115,111,110,32,65,66>>}],
                -                     [#'AttributeTypeAndValue'{
                -                          type = {2,5,4,7},
                -                          value = <<19,9,83,116,111,99,107,104,111,108,109>>}],
                -                     [#'AttributeTypeAndValue'{
                -                          type = {2,5,4,6},
                -                          value = <<19,2,83,69>>}],
                -                     [#'AttributeTypeAndValue'{
                -                          type = {1,2,840,113549,1,9,1},
                -                          value = <<22,22,112,101,116,101,114,64,101,114,...>>}]]},
                +                {rdnSequence,
                +                    [[#'AttributeTypeAndValue'{
                +                          type = {2,5,4,3},
                +                          value = <<19,8,101,114,108,97,110,103,67,65>>}],
                +                     [#'AttributeTypeAndValue'{
                +                          type = {2,5,4,11},
                +                          value = <<19,10,69,114,108,97,110,103,32,79,84,80>>}],
                +                     [#'AttributeTypeAndValue'{
                +                          type = {2,5,4,10},
                +                          value = <<19,11,69,114,105,99,115,115,111,110,32,65,66>>}],
                +                     [#'AttributeTypeAndValue'{
                +                          type = {2,5,4,7},
                +                          value = <<19,9,83,116,111,99,107,104,111,108,109>>}],
                +                     [#'AttributeTypeAndValue'{
                +                          type = {2,5,4,6},
                +                          value = <<19,2,83,69>>}],
                +                     [#'AttributeTypeAndValue'{
                +                          type = {1,2,840,113549,1,9,1},
                +                          value = <<22,22,112,101,116,101,114,64,101,114,...>>}]]},
                             validity =
                -                #'Validity'{
                -                    notBefore = {utcTime,"080109082929Z"},
                -                    notAfter = {utcTime,"080208082929Z"}},
                +                #'Validity'{
                +                    notBefore = {utcTime,"080109082929Z"},
                +                    notAfter = {utcTime,"080208082929Z"}},
                             subject =
                -                {rdnSequence,
                -                    [[#'AttributeTypeAndValue'{
                -                          type = {2,5,4,3},
                -                          value = <<19,8,101,114,108,97,110,103,67,65>>}],
                -                     [#'AttributeTypeAndValue'{
                -                          type = {2,5,4,11},
                -                          value = <<19,10,69,114,108,97,110,103,32,79,84,80>>}],
                -                     [#'AttributeTypeAndValue'{
                -                          type = {2,5,4,10},
                -                          value = <<19,11,69,114,105,99,115,115,111,110,32,...>>}],
                -                     [#'AttributeTypeAndValue'{
                -                          type = {2,5,4,7},
                -                          value = <<19,9,83,116,111,99,107,104,111,108,...>>}],
                -                     [#'AttributeTypeAndValue'{
                -                          type = {2,5,4,6},
                -                          value = <<19,2,83,69>>}],
                -                     [#'AttributeTypeAndValue'{
                -                          type = {1,2,840,113549,1,9,1},
                -                          value = <<22,22,112,101,116,101,114,64,...>>}]]},
                +                {rdnSequence,
                +                    [[#'AttributeTypeAndValue'{
                +                          type = {2,5,4,3},
                +                          value = <<19,8,101,114,108,97,110,103,67,65>>}],
                +                     [#'AttributeTypeAndValue'{
                +                          type = {2,5,4,11},
                +                          value = <<19,10,69,114,108,97,110,103,32,79,84,80>>}],
                +                     [#'AttributeTypeAndValue'{
                +                          type = {2,5,4,10},
                +                          value = <<19,11,69,114,105,99,115,115,111,110,32,...>>}],
                +                     [#'AttributeTypeAndValue'{
                +                          type = {2,5,4,7},
                +                          value = <<19,9,83,116,111,99,107,104,111,108,...>>}],
                +                     [#'AttributeTypeAndValue'{
                +                          type = {2,5,4,6},
                +                          value = <<19,2,83,69>>}],
                +                     [#'AttributeTypeAndValue'{
                +                          type = {1,2,840,113549,1,9,1},
                +                          value = <<22,22,112,101,116,101,114,64,...>>}]]},
                             subjectPublicKeyInfo =
                -                #'SubjectPublicKeyInfo'{
                +                #'SubjectPublicKeyInfo'{
                                     algorithm =
                -                        #'AlgorithmIdentifier'{
                -                            algorithm = {1,2,840,113549,1,1,1},
                -                            parameters = <<5,0>>},
                +                        #'AlgorithmIdentifier'{
                +                            algorithm = {1,2,840,113549,1,1,1},
                +                            parameters = <<5,0>>},
                                     subjectPublicKey =
                -                        {0,<<48,129,137,2,129,129,0,203,209,187,77,73,231,90,...>>}},
                +                        {0,<<48,129,137,2,129,129,0,203,209,187,77,73,231,90,...>>}},
                             issuerUniqueID = asn1_NOVALUE,
                             subjectUniqueID = asn1_NOVALUE,
                             extensions =
                -                [#'Extension'{
                -                     extnID = {2,5,29,19},
                +                [#'Extension'{
                +                     extnID = {2,5,29,19},
                                      critical = true,
                -                     extnValue = [48,3,1,1,255]},
                -                 #'Extension'{
                -                     extnID = {2,5,29,15},
                +                     extnValue = [48,3,1,1,255]},
                +                 #'Extension'{
                +                     extnID = {2,5,29,15},
                                      critical = false,
                -                     extnValue = [3,2,1,6]},
                -                 #'Extension'{
                -                     extnID = {2,5,29,14},
                +                     extnValue = [3,2,1,6]},
                /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/404.html differs (HTML document, UTF-8 Unicode text)
                --- old//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/404.html	2025-05-10 20:19:15.493248335 +0000
                +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/404.html	2025-05-10 20:19:15.493248335 +0000
                @@ -147,7 +147,7 @@
                           Erlang programming language
                 
                       

                -

                Copyright © 1996-2025 Ericsson AB

                +

                Copyright © 1996-2041 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/api-reference.html 2025-05-10 20:19:15.517248553 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/api-reference.html 2025-05-10 20:19:15.517248553 +0000 @@ -185,7 +185,7 @@ Erlang programming language

                -

                Copyright © 1996-2025 Ericsson AB

                +

                Copyright © 1996-2041 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/notes.html 2025-05-10 20:19:15.545248806 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/notes.html 2025-05-10 20:19:15.545248806 +0000 @@ -782,7 +782,7 @@ Erlang programming language

                -

                Copyright © 1996-2025 Ericsson AB

                +

                Copyright © 1996-2041 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool.epub/OEBPS/content.opf 2025-05-10 20:19:15.573249060 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool.epub/OEBPS/content.opf 2025-05-10 20:19:15.577249096 +0000 @@ -4,10 +4,10 @@ version="3.0"> reltool - 1.0.1 - urn:uuid:0578bd48-39be-7b47-f085-517968362546 + urn:uuid:cb217562-9427-6ccc-f647-3f10400ef7f2 en - 2025-05-10T20:11:34Z + 2041-06-12T09:31:42Z /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool.epub/OEBPS/reltool_examples.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool.epub/OEBPS/reltool_examples.xhtml 2025-05-10 20:19:15.573249060 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool.epub/OEBPS/reltool_examples.xhtml 2025-05-10 20:19:15.577249096 +0000 @@ -30,500 +30,500 @@ via the GUI frontend process. When the GUI is started, a server process will automatically be started. The GUI process is started with reltool:start/0, reltool:start/1 or reltool:start_link/1. The pid of its server can be -obtained with reltool:get_server/1

                Erlang/OTP 20 [erts-9.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]
                -[hipe] [kernel-poll:false]
                -Eshell V9.0  (abort with ^G)
                +obtained with reltool:get_server/1

                Erlang/OTP 20 [erts-9.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]
                +[hipe] [kernel-poll:false]
                +Eshell V9.0  (abort with ^G)
                 1>
                -1> {ok, Win} = reltool:start([]).
                -{ok,<0.36.01>}
                -2> {ok, Server} = reltool:get_server(Win).
                -{ok,<0.37.01>}
                -3> reltool:get_config(Server).
                -{ok,{sys,[]}}
                +1> {ok, Win} = reltool:start([]).
                +{ok,<0.36.01>}
                +2> {ok, Server} = reltool:get_server(Win).
                +{ok,<0.37.01>}
                +3> reltool:get_config(Server).
                +{ok,{sys,[]}}
                 4>
                -4> {ok, Server2} = reltool:start_server([]).
                -{ok,<0.6535.01>}
                -5> reltool:get_config(Server2).
                -{ok,{sys,[]}}
                -6> reltool:stop(Server2).
                +4> {ok, Server2} = reltool:start_server([]).
                +{ok,<0.6535.01>}
                +5> reltool:get_config(Server2).
                +{ok,{sys,[]}}
                +6> reltool:stop(Server2).
                 ok

                Inspecting the configuration

                -
                Erlang/OTP 20 [erts-9.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]
                -[hipe] [kernel-poll:false]
                -Eshell V9.0  (abort with ^G)
                +
                Erlang/OTP 20 [erts-9.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]
                +[hipe] [kernel-poll:false]
                +Eshell V9.0  (abort with ^G)
                 1>
                -1> Config = {sys, [{escript, "examples/display_args", [{incl_cond, include}]},
                -		   {app, inets, [{incl_cond, include}]},
                -		   {app, mnesia, [{incl_cond, exclude}]},
                -		   {app, ssl, [{incl_cond, exclude}]},
                -		   {app, runtime_tools, [{incl_cond, exclude}]},
                -		   {app, syntax_tools, [{incl_cond, exclude}]}]}.
                -{sys,[{escript,"examples/display_args",[{incl_cond,include}]},
                -      {app,inets,[{incl_cond,include}]},
                -      {app,mnesia,[{incl_cond,exclude}]},
                -      {app,ssl,[{incl_cond,exclude}]},
                -      {app,runtime_tools,[{incl_cond,exclude}]},
                -      {app,syntax_tools,[{incl_cond,exclude}]}]}
                +1> Config = {sys, [{escript, "examples/display_args", [{incl_cond, include}]},
                +		   {app, inets, [{incl_cond, include}]},
                +		   {app, mnesia, [{incl_cond, exclude}]},
                +		   {app, ssl, [{incl_cond, exclude}]},
                +		   {app, runtime_tools, [{incl_cond, exclude}]},
                +		   {app, syntax_tools, [{incl_cond, exclude}]}]}.
                +{sys,[{escript,"examples/display_args",[{incl_cond,include}]},
                +      {app,inets,[{incl_cond,include}]},
                +      {app,mnesia,[{incl_cond,exclude}]},
                +      {app,ssl,[{incl_cond,exclude}]},
                +      {app,runtime_tools,[{incl_cond,exclude}]},
                +      {app,syntax_tools,[{incl_cond,exclude}]}]}
                 2>
                -2> {ok, Server} = reltool:start_server([Config]).
                -{ok,<0.66.0>}
                +2> {ok, Server} = reltool:start_server([Config]).
                +{ok,<0.66.0>}
                 3>
                -3> reltool:get_config(Server).
                -{ok,{sys,[{escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
                -                   [{incl_cond,include}]},
                -          {app,inets,[{incl_cond,include}]},
                -          {app,mnesia,[{incl_cond,exclude}]},
                -          {app,runtime_tools,[{incl_cond,exclude}]},
                -          {app,ssl,[{incl_cond,exclude}]},
                -          {app,syntax_tools,[{incl_cond,exclude}]}]}}
                +3> reltool:get_config(Server).
                +{ok,{sys,[{escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
                +                   [{incl_cond,include}]},
                +          {app,inets,[{incl_cond,include}]},
                +          {app,mnesia,[{incl_cond,exclude}]},
                +          {app,runtime_tools,[{incl_cond,exclude}]},
                +          {app,ssl,[{incl_cond,exclude}]},
                +          {app,syntax_tools,[{incl_cond,exclude}]}]}}
                 4>
                -4> reltool:get_config(Server, false, false).
                -{ok,{sys,[{escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
                -                   [{incl_cond,include}]},
                -          {app,inets,[{incl_cond,include}]},
                -          {app,mnesia,[{incl_cond,exclude}]},
                -          {app,runtime_tools,[{incl_cond,exclude}]},
                -          {app,ssl,[{incl_cond,exclude}]},
                -          {app,syntax_tools,[{incl_cond,exclude}]}]}}
                +4> reltool:get_config(Server, false, false).
                +{ok,{sys,[{escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
                +                   [{incl_cond,include}]},
                +          {app,inets,[{incl_cond,include}]},
                +          {app,mnesia,[{incl_cond,exclude}]},
                +          {app,runtime_tools,[{incl_cond,exclude}]},
                +          {app,ssl,[{incl_cond,exclude}]},
                +          {app,syntax_tools,[{incl_cond,exclude}]}]}}
                 5>
                -5> reltool:get_config(Server, true, false).
                -{ok,{sys,[{root_dir,"/usr/local/lib/erlang"},
                -          {lib_dirs,[]},
                -          {escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
                -                   [{incl_cond,include}]},
                -          {mod_cond,all},
                -          {incl_cond,derived},
                -          {app,inets,
                -               [{incl_cond,include},{vsn,undefined},{lib_dir,undefined}]},
                -          {app,mnesia,[{incl_cond,exclude}]},
                -          {app,runtime_tools,[{incl_cond,exclude}]},
                -          {app,ssl,[{incl_cond,exclude}]},
                -          {app,syntax_tools,[{incl_cond,exclude}]},
                -          {boot_rel,"start_clean"},
                -          {rel,"start_clean","1.0",[]},
                -          {rel,"start_sasl","1.0",[sasl]},
                -          {emu_name,"beam"},
                -          {relocatable,true},
                -          {profile,development},
                -          {incl_sys_filters,[".*"]},
                -          {excl_sys_filters,[]},
                -          {incl_app_filters,[".*"]},
                -          {excl_app_filters,[]},
                -          {rel_app_type,...},
                -          {...}|...]}}
                +5> reltool:get_config(Server, true, false).
                +{ok,{sys,[{root_dir,"/usr/local/lib/erlang"},
                +          {lib_dirs,[]},
                +          {escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
                +                   [{incl_cond,include}]},
                +          {mod_cond,all},
                +          {incl_cond,derived},
                +          {app,inets,
                +               [{incl_cond,include},{vsn,undefined},{lib_dir,undefined}]},
                +          {app,mnesia,[{incl_cond,exclude}]},
                +          {app,runtime_tools,[{incl_cond,exclude}]},
                +          {app,ssl,[{incl_cond,exclude}]},
                +          {app,syntax_tools,[{incl_cond,exclude}]},
                +          {boot_rel,"start_clean"},
                +          {rel,"start_clean","1.0",[]},
                +          {rel,"start_sasl","1.0",[sasl]},
                +          {emu_name,"beam"},
                +          {relocatable,true},
                +          {profile,development},
                +          {incl_sys_filters,[".*"]},
                +          {excl_sys_filters,[]},
                +          {incl_app_filters,[".*"]},
                +          {excl_app_filters,[]},
                +          {rel_app_type,...},
                +          {...}|...]}}
                 6>
                -6> reltool:get_config(Server, true, true).
                -{ok,{sys,[{root_dir,"/usr/local/lib/erlang"},
                -          {lib_dirs,[]},
                -          {escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
                -                   [{incl_cond,include}]},
                -          {mod_cond,all},
                -          {incl_cond,derived},
                -          {erts,[{app,erts,
                -                      [{vsn,"10.0"},
                -                       {lib_dir,"/usr/local/lib/erlang/lib/erts-10.0"},
                -                       {mod,erl_prim_loader,[]},
                -                       {mod,erl_tracer,[]},
                -                       {mod,erlang,[]},
                -                       {mod,erts_code_purger,[]},
                -                       {mod,erts_dirty_process_signal_handler,[]},
                -                       {mod,erts_internal,[]},
                -                       {mod,erts_literal_area_collector,[]},
                -                       {mod,init,[]},
                -                       {mod,erl_init,...},
                -                       {mod,...},
                -                       {...}|...]}]},
                -          {app,compiler,
                -               [{vsn,"7.0.4"},
                -                {lib_dir,"/usr/local/lib/erlang/lib/compiler-7.0.4"},
                -                {mod,beam_a,[]},
                -                {mod,beam_asm,[]},
                -                {mod,beam_block,[]},
                -                {mod,beam_bs,[]},
                -                {mod,beam_bsm,[]},
                -                {mod,beam_clean,[]},
                -                {mod,beam_dead,[]},
                -                {mod,beam_dict,[]},
                -                {mod,beam_disasm,[]},
                -                {mod,beam_except,[]},
                -                {mod,beam_flatten,...},
                -                {mod,...},
                /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool.html differs (HTML document, UTF-8 Unicode text, with very long lines)
                --- old//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool.html	2025-05-10 20:19:15.665249894 +0000
                +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool.html	2025-05-10 20:19:15.665249894 +0000
                @@ -2881,7 +2881,7 @@
                           Erlang programming language
                 
                       

                -

                Copyright © 1996-2025 Ericsson AB

                +

                Copyright © 1996-2041 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool_examples.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool_examples.html 2025-05-10 20:19:15.733250511 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool_examples.html 2025-05-10 20:19:15.733250511 +0000 @@ -135,500 +135,500 @@ via the GUI frontend process. When the GUI is started, a server process will automatically be started. The GUI process is started with reltool:start/0, reltool:start/1 or reltool:start_link/1. The pid of its server can be -obtained with reltool:get_server/1

                Erlang/OTP 20 [erts-9.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]
                -[hipe] [kernel-poll:false]
                -Eshell V9.0  (abort with ^G)
                +obtained with reltool:get_server/1

                Erlang/OTP 20 [erts-9.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]
                +[hipe] [kernel-poll:false]
                +Eshell V9.0  (abort with ^G)
                 1>
                -1> {ok, Win} = reltool:start([]).
                -{ok,<0.36.01>}
                -2> {ok, Server} = reltool:get_server(Win).
                -{ok,<0.37.01>}
                -3> reltool:get_config(Server).
                -{ok,{sys,[]}}
                +1> {ok, Win} = reltool:start([]).
                +{ok,<0.36.01>}
                +2> {ok, Server} = reltool:get_server(Win).
                +{ok,<0.37.01>}
                +3> reltool:get_config(Server).
                +{ok,{sys,[]}}
                 4>
                -4> {ok, Server2} = reltool:start_server([]).
                -{ok,<0.6535.01>}
                -5> reltool:get_config(Server2).
                -{ok,{sys,[]}}
                -6> reltool:stop(Server2).
                +4> {ok, Server2} = reltool:start_server([]).
                +{ok,<0.6535.01>}
                +5> reltool:get_config(Server2).
                +{ok,{sys,[]}}
                +6> reltool:stop(Server2).
                 ok

                Inspecting the configuration

                -
                Erlang/OTP 20 [erts-9.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]
                -[hipe] [kernel-poll:false]
                -Eshell V9.0  (abort with ^G)
                +
                Erlang/OTP 20 [erts-9.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]
                +[hipe] [kernel-poll:false]
                +Eshell V9.0  (abort with ^G)
                 1>
                -1> Config = {sys, [{escript, "examples/display_args", [{incl_cond, include}]},
                -		   {app, inets, [{incl_cond, include}]},
                -		   {app, mnesia, [{incl_cond, exclude}]},
                -		   {app, ssl, [{incl_cond, exclude}]},
                -		   {app, runtime_tools, [{incl_cond, exclude}]},
                -		   {app, syntax_tools, [{incl_cond, exclude}]}]}.
                -{sys,[{escript,"examples/display_args",[{incl_cond,include}]},
                -      {app,inets,[{incl_cond,include}]},
                -      {app,mnesia,[{incl_cond,exclude}]},
                -      {app,ssl,[{incl_cond,exclude}]},
                -      {app,runtime_tools,[{incl_cond,exclude}]},
                -      {app,syntax_tools,[{incl_cond,exclude}]}]}
                +1> Config = {sys, [{escript, "examples/display_args", [{incl_cond, include}]},
                +		   {app, inets, [{incl_cond, include}]},
                +		   {app, mnesia, [{incl_cond, exclude}]},
                +		   {app, ssl, [{incl_cond, exclude}]},
                +		   {app, runtime_tools, [{incl_cond, exclude}]},
                +		   {app, syntax_tools, [{incl_cond, exclude}]}]}.
                +{sys,[{escript,"examples/display_args",[{incl_cond,include}]},
                +      {app,inets,[{incl_cond,include}]},
                +      {app,mnesia,[{incl_cond,exclude}]},
                +      {app,ssl,[{incl_cond,exclude}]},
                +      {app,runtime_tools,[{incl_cond,exclude}]},
                +      {app,syntax_tools,[{incl_cond,exclude}]}]}
                 2>
                -2> {ok, Server} = reltool:start_server([Config]).
                -{ok,<0.66.0>}
                +2> {ok, Server} = reltool:start_server([Config]).
                +{ok,<0.66.0>}
                 3>
                -3> reltool:get_config(Server).
                -{ok,{sys,[{escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
                -                   [{incl_cond,include}]},
                -          {app,inets,[{incl_cond,include}]},
                -          {app,mnesia,[{incl_cond,exclude}]},
                -          {app,runtime_tools,[{incl_cond,exclude}]},
                -          {app,ssl,[{incl_cond,exclude}]},
                -          {app,syntax_tools,[{incl_cond,exclude}]}]}}
                +3> reltool:get_config(Server).
                +{ok,{sys,[{escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
                +                   [{incl_cond,include}]},
                +          {app,inets,[{incl_cond,include}]},
                +          {app,mnesia,[{incl_cond,exclude}]},
                +          {app,runtime_tools,[{incl_cond,exclude}]},
                +          {app,ssl,[{incl_cond,exclude}]},
                +          {app,syntax_tools,[{incl_cond,exclude}]}]}}
                 4>
                -4> reltool:get_config(Server, false, false).
                -{ok,{sys,[{escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
                -                   [{incl_cond,include}]},
                -          {app,inets,[{incl_cond,include}]},
                -          {app,mnesia,[{incl_cond,exclude}]},
                -          {app,runtime_tools,[{incl_cond,exclude}]},
                -          {app,ssl,[{incl_cond,exclude}]},
                -          {app,syntax_tools,[{incl_cond,exclude}]}]}}
                +4> reltool:get_config(Server, false, false).
                +{ok,{sys,[{escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
                +                   [{incl_cond,include}]},
                +          {app,inets,[{incl_cond,include}]},
                +          {app,mnesia,[{incl_cond,exclude}]},
                +          {app,runtime_tools,[{incl_cond,exclude}]},
                +          {app,ssl,[{incl_cond,exclude}]},
                +          {app,syntax_tools,[{incl_cond,exclude}]}]}}
                 5>
                -5> reltool:get_config(Server, true, false).
                -{ok,{sys,[{root_dir,"/usr/local/lib/erlang"},
                -          {lib_dirs,[]},
                -          {escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
                -                   [{incl_cond,include}]},
                -          {mod_cond,all},
                -          {incl_cond,derived},
                -          {app,inets,
                -               [{incl_cond,include},{vsn,undefined},{lib_dir,undefined}]},
                -          {app,mnesia,[{incl_cond,exclude}]},
                -          {app,runtime_tools,[{incl_cond,exclude}]},
                -          {app,ssl,[{incl_cond,exclude}]},
                -          {app,syntax_tools,[{incl_cond,exclude}]},
                -          {boot_rel,"start_clean"},
                -          {rel,"start_clean","1.0",[]},
                -          {rel,"start_sasl","1.0",[sasl]},
                -          {emu_name,"beam"},
                -          {relocatable,true},
                -          {profile,development},
                -          {incl_sys_filters,[".*"]},
                -          {excl_sys_filters,[]},
                -          {incl_app_filters,[".*"]},
                -          {excl_app_filters,[]},
                -          {rel_app_type,...},
                -          {...}|...]}}
                +5> reltool:get_config(Server, true, false).
                +{ok,{sys,[{root_dir,"/usr/local/lib/erlang"},
                +          {lib_dirs,[]},
                +          {escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
                +                   [{incl_cond,include}]},
                +          {mod_cond,all},
                +          {incl_cond,derived},
                +          {app,inets,
                +               [{incl_cond,include},{vsn,undefined},{lib_dir,undefined}]},
                +          {app,mnesia,[{incl_cond,exclude}]},
                +          {app,runtime_tools,[{incl_cond,exclude}]},
                +          {app,ssl,[{incl_cond,exclude}]},
                +          {app,syntax_tools,[{incl_cond,exclude}]},
                +          {boot_rel,"start_clean"},
                +          {rel,"start_clean","1.0",[]},
                +          {rel,"start_sasl","1.0",[sasl]},
                +          {emu_name,"beam"},
                +          {relocatable,true},
                +          {profile,development},
                +          {incl_sys_filters,[".*"]},
                +          {excl_sys_filters,[]},
                +          {incl_app_filters,[".*"]},
                +          {excl_app_filters,[]},
                +          {rel_app_type,...},
                +          {...}|...]}}
                 6>
                -6> reltool:get_config(Server, true, true).
                -{ok,{sys,[{root_dir,"/usr/local/lib/erlang"},
                -          {lib_dirs,[]},
                -          {escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
                -                   [{incl_cond,include}]},
                -          {mod_cond,all},
                -          {incl_cond,derived},
                -          {erts,[{app,erts,
                -                      [{vsn,"10.0"},
                -                       {lib_dir,"/usr/local/lib/erlang/lib/erts-10.0"},
                -                       {mod,erl_prim_loader,[]},
                -                       {mod,erl_tracer,[]},
                -                       {mod,erlang,[]},
                -                       {mod,erts_code_purger,[]},
                -                       {mod,erts_dirty_process_signal_handler,[]},
                -                       {mod,erts_internal,[]},
                -                       {mod,erts_literal_area_collector,[]},
                -                       {mod,init,[]},
                -                       {mod,erl_init,...},
                -                       {mod,...},
                -                       {...}|...]}]},
                -          {app,compiler,
                -               [{vsn,"7.0.4"},
                -                {lib_dir,"/usr/local/lib/erlang/lib/compiler-7.0.4"},
                -                {mod,beam_a,[]},
                -                {mod,beam_asm,[]},
                -                {mod,beam_block,[]},
                -                {mod,beam_bs,[]},
                -                {mod,beam_bsm,[]},
                -                {mod,beam_clean,[]},
                -                {mod,beam_dead,[]},
                -                {mod,beam_dict,[]},
                -                {mod,beam_disasm,[]},
                -                {mod,beam_except,[]},
                -                {mod,beam_flatten,...},
                -                {mod,...},
                /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool_intro.html differs (HTML document, UTF-8 Unicode text, with very long lines)
                --- old//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool_intro.html	2025-05-10 20:19:15.761250764 +0000
                +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool_intro.html	2025-05-10 20:19:15.761250764 +0000
                @@ -212,7 +212,7 @@
                           Erlang programming language
                 
                       

                -

                Copyright © 1996-2025 Ericsson AB

                +

                Copyright © 1996-2041 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool_usage.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool_usage.html 2025-05-10 20:19:15.785250982 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool_usage.html 2025-05-10 20:19:15.785250982 +0000 @@ -382,7 +382,7 @@ Erlang programming language

                -

                Copyright © 1996-2025 Ericsson AB

                +

                Copyright © 1996-2041 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/search.html 2025-05-10 20:19:15.809251200 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/search.html 2025-05-10 20:19:15.809251200 +0000 @@ -145,7 +145,7 @@ Erlang programming language

                -

                Copyright © 1996-2025 Ericsson AB

                +

                Copyright © 1996-2041 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/404.html 2025-05-10 20:19:15.829251381 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/404.html 2025-05-10 20:19:15.829251381 +0000 @@ -147,7 +147,7 @@ Erlang programming language

                -

                Copyright © 1996-2025 Ericsson AB

                +

                Copyright © 1996-2041 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/api-reference.html 2025-05-10 20:19:15.853251599 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/api-reference.html 2025-05-10 20:19:15.853251599 +0000 @@ -230,7 +230,7 @@ Erlang programming language

                -

                Copyright © 1996-2025 Ericsson AB

                +

                Copyright © 1996-2041 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dbg.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dbg.html 2025-05-10 20:19:15.917252179 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dbg.html 2025-05-10 20:19:15.953252505 +0000 @@ -131,16 +131,16 @@

                The Text Based Trace Facility

                This module implements a text based interface to the trace:process/4, trace:port/4, and trace:function/4 BIFs, simplifying tracing of functions, processes, ports, and messages.

                To quickly get started on tracing function calls you can use the -following code in the Erlang shell:

                1> dbg:tracer().  % Start the default trace message receiver
                -{ok,<0.90.0>}
                -2> dbg:p(all, c). % Set upp call tracing on all processes
                -{ok,[{matched,nonode@nohost,49}]}
                -3> dbg:tp(lists, seq, cx). %  Set up call and exception tracing on lists:seq/2,3
                -{ok,[{matched,nonode@nohost,2},{saved,cx}]}
                -4> lists:seq(1, 10).
                -(<0.88.0>) call lists:seq(1,10) ({erl_eval,do_apply,7,{"erl_eval.erl",904}})
                -[1,2,3,4,5,6,7,8,9,10]
                -(<0.88.0>) returned from lists:seq/2 -> [1,2,3,4,5,6,7,8,9,10]

                The utilities are also suitable to use in system testing on large systems, where +following code in the Erlang shell:

                1> dbg:tracer().  % Start the default trace message receiver
                +{ok,<0.90.0>}
                +2> dbg:p(all, c). % Set upp call tracing on all processes
                +{ok,[{matched,nonode@nohost,49}]}
                +3> dbg:tp(lists, seq, cx). %  Set up call and exception tracing on lists:seq/2,3
                +{ok,[{matched,nonode@nohost,2},{saved,cx}]}
                +4> lists:seq(1, 10).
                +(<0.88.0>) call lists:seq(1,10) ({erl_eval,do_apply,7,{"erl_eval.erl",904}})
                +[1,2,3,4,5,6,7,8,9,10]
                +(<0.88.0>) returned from lists:seq/2 -> [1,2,3,4,5,6,7,8,9,10]

                The utilities are also suitable to use in system testing on large systems, where other tools have too severe impact on the system performance. Some primitive support for sequential tracing is also included; see the advanced topics section.

                @@ -152,36 +152,36 @@

                To trace a call to a function with minimal fuss, call dbg:c(Module, Name, Arguments). dbg:c/3 starts a temporary trace receiver, enables all trace flags, and calls the designated function from a temporary process. For example, here is how to trace a call -to application:which_applications/0:

                1> dbg:c(application, which_applications, []).
                -(<0.92.0>) <0.45.0> ! {'$gen_call',{<0.92.0>,
                -                                    [alias|
                -                                     #Ref<0.0.11779.270031856.1478295555.230456>]},
                -                                   which_applications} (Timestamp: {1710,
                +to application:which_applications/0:

                1> dbg:c(application, which_applications, []).
                +(<0.92.0>) <0.45.0> ! {'$gen_call',{<0.92.0>,
                +                                    [alias|
                +                                     #Ref<0.0.11779.270031856.1478295555.230456>]},
                +                                   which_applications} (Timestamp: {1710,
                                                                                     847802,
                -                                                                    479222})
                -(<0.92.0>) out {gen,do_call,4} (Timestamp: {1710,847802,479231})
                -(<0.92.0>) in {gen,do_call,4} (Timestamp: {1710,847802,479271})
                -(<0.92.0>) << {[alias|#Ref<0.0.11779.270031856.1478295555.230456>],
                -               [{stdlib,"ERTS  CXC 138 10","5.2.1"},
                -                {kernel,"ERTS  CXC 138 10","9.2.2"}]} (Timestamp: {1710,
                +                                                                    479222})
                +(<0.92.0>) out {gen,do_call,4} (Timestamp: {1710,847802,479231})
                +(<0.92.0>) in {gen,do_call,4} (Timestamp: {1710,847802,479271})
                +(<0.92.0>) << {[alias|#Ref<0.0.11779.270031856.1478295555.230456>],
                +               [{stdlib,"ERTS  CXC 138 10","5.2.1"},
                +                {kernel,"ERTS  CXC 138 10","9.2.2"}]} (Timestamp: {1710,
                                                                                    847802,
                -                                                                   479274})
                -[{stdlib,"ERTS  CXC 138 10","5.2.1"},
                - {kernel,"ERTS  CXC 138 10","9.2.2"}]

                Four trace events are generated:

                • A send event (!) for the sending of a request from the current process + 479274}) +[{stdlib,"ERTS CXC 138 10","5.2.1"}, + {kernel,"ERTS CXC 138 10","9.2.2"}]

                Four trace events are generated:

                • A send event (!) for the sending of a request from the current process to the application_controller process.
                • A schedule-out event (out) when the current process schedules out while waiting in a receive for the reply to arrive.
                • A schedule-in event (in) when the current process is scheduled in when reply has arrived.
                • A receive event (<<) when the current process retrieves the reply from the application_controller process.

                The dbg:c/4 function has a fourth argument for specifying the trace flags. -Here is how to only show message sending and receiving:

                2> dbg:c(application, which_applications, [], m).
                -(<0.96.0>) <0.45.0> ! {'$gen_call',{<0.96.0>,
                -                                    [alias|
                -                                     #Ref<0.0.12291.270031856.1478295555.230496>]},
                -                                   which_applications}
                -(<0.96.0>) << {[alias|#Ref<0.0.12291.270031856.1478295555.230496>],
                -               [{stdlib,"ERTS  CXC 138 10","5.2.1"},
                -                {kernel,"ERTS  CXC 138 10","9.2.2"}]}
                -[{stdlib,"ERTS  CXC 138 10","5.2.1"},
                - {kernel,"ERTS  CXC 138 10","9.2.2"}]

                +Here is how to only show message sending and receiving:

                2> dbg:c(application, which_applications, [], m).
                +(<0.96.0>) <0.45.0> ! {'$gen_call',{<0.96.0>,
                +                                    [alias|
                +                                     #Ref<0.0.12291.270031856.1478295555.230496>]},
                +                                   which_applications}
                +(<0.96.0>) << {[alias|#Ref<0.0.12291.270031856.1478295555.230496>],
                +               [{stdlib,"ERTS  CXC 138 10","5.2.1"},
                +                {kernel,"ERTS  CXC 138 10","9.2.2"}]}
                +[{stdlib,"ERTS  CXC 138 10","5.2.1"},
                + {kernel,"ERTS  CXC 138 10","9.2.2"}]

                @@ -189,35 +189,35 @@

                Another way of tracing from the shell is to explicitly start a tracer and set the trace flags of your choice on the processes you want to trace. -For example, here is how to trace messages and process events:

                1> Pid = spawn(fun() -> receive {From,Msg} -> From ! Msg end end).
                +For example, here is how to trace messages and process events:

                1> Pid = spawn(fun() -> receive {From,Msg} -> From ! Msg end end).
                 <0.90.0>
                -2> dbg:tracer().
                -{ok,<0.92.0>}
                -3> dbg:p(Pid, [m,procs]).
                -{ok,[{matched,nonode@nohost,1}]}
                -4> Pid ! {self(),hello}.
                -(<0.90.0>) << {<0.88.0>,hello}
                -{<0.88.0>,hello}
                -(<0.90.0>) <0.88.0> ! hello
                -(<0.90.0>) exit normal
                -5> flush().
                +2> dbg:tracer().
                +{ok,<0.92.0>}
                +3> dbg:p(Pid, [m,procs]).
                +{ok,[{matched,nonode@nohost,1}]}
                +4> Pid ! {self(),hello}.
                +(<0.90.0>) << {<0.88.0>,hello}
                +{<0.88.0>,hello}
                +(<0.90.0>) <0.88.0> ! hello
                +(<0.90.0>) exit normal
                +5> flush().
                 Shell got hello
                 ok

                In order to trace functions call, in addition to enabling the call trace flag for the process, it is also necessary to set a trace pattern for the functions -to trace.

                Example:

                1> dbg:tracer().
                -{ok,<0.90.0>}
                -2> dbg:p(all, call).
                -{ok,[{matched,nonode@nohost,49}]}
                -3> dbg:tp(lists, last, 1, []).
                -{ok,[{matched,nonode@nohost,1}]}
                -4> lists:last([a,b,c,d,e]).
                -(<0.88.0>) call lists:last([a,b,c,d,e])
                +to trace.

                Example:

                1> dbg:tracer().
                +{ok,<0.90.0>}
                +2> dbg:p(all, call).
                +{ok,[{matched,nonode@nohost,49}]}
                +3> dbg:tp(lists, last, 1, []).
                +{ok,[{matched,nonode@nohost,1}]}
                +4> lists:last([a,b,c,d,e]).
                +(<0.88.0>) call lists:last([a,b,c,d,e])
                 e
                -5> dbg:tp(lists, last, 1, [{'_',[],[{return_trace}]}]).
                -{ok,[{matched,nonode@nohost,1},{saved,1}]}
                -6> lists:last([a,b,c,d,e]).
                -(<0.88.0>) call lists:last([a,b,c,d,e])
                -(<0.88.0>) returned from lists:last/1 -> e
                +5> dbg:tp(lists, last, 1, [{'_',[],[{return_trace}]}]).
                +{ok,[{matched,nonode@nohost,1},{saved,1}]}
                +6> lists:last([a,b,c,d,e]).
                +(<0.88.0>) call lists:last([a,b,c,d,e])
                +(<0.88.0>) returned from lists:last/1 -> e
                 e

                @@ -231,21 +231,21 @@ seq_trace and the same tracer function for both types of tracing can be used. The seq_trace messages can also be sent to a trace port for further analysis.

                As a match specification can turn on sequential tracing, the combination of dbg and seq_trace can be powerful. This brief example shows a session -where sequential tracing is used to trace the dbg module and the trace itself:

                1> dbg:tracer().
                -{ok,<0.30.0>}
                -2> {ok, Tracer} = dbg:get_tracer().
                -{ok,<0.31.0>}
                -3> seq_trace:set_system_tracer(Tracer).
                +where sequential tracing is used to trace the dbg module and the trace itself:

                1> dbg:tracer().
                +{ok,<0.30.0>}
                +2> {ok, Tracer} = dbg:get_tracer().
                +{ok,<0.31.0>}
                +3> seq_trace:set_system_tracer(Tracer).
                 false
                -4> dbg:tp(dbg, get_tracer, 0, [{[],[],[{set_seq_token, send, true}]}]).
                -{ok,[{matched,nonode@nohost,1},{saved,1}]}
                -5> dbg:p(all,call).
                -{ok,[{matched,nonode@nohost,22}]}
                -6> dbg:get_tracer(), seq_trace:set_token([]).
                -(<0.25.0>) call dbg:get_tracer()
                -SeqTrace [0]: (<0.25.0>) <0.30.0> ! {<0.25.0>,get_tracer} [Serial: {2,4}]
                -SeqTrace [0]: (<0.30.0>) <0.25.0> ! {dbg,{ok,<0.31.0>}} [Serial: {4,5}]
                -{1,0,5,<0.30.0>,4}

                This session sets the system_tracer to the same process as the +4> dbg:tp(dbg, get_tracer, 0, [{[],[],[{set_seq_token, send, true}]}]). +{ok,[{matched,nonode@nohost,1},{saved,1}]} +5> dbg:p(all,call). +{ok,[{matched,nonode@nohost,22}]} +6> dbg:get_tracer(), seq_trace:set_token([]). +(<0.25.0>) call dbg:get_tracer() +SeqTrace [0]: (<0.25.0>) <0.30.0> ! {<0.25.0>,get_tracer} [Serial: {2,4}] +SeqTrace [0]: (<0.30.0>) <0.25.0> ! {dbg,{ok,<0.31.0>}} [Serial: {4,5}] +{1,0,5,<0.30.0>,4}

                This session sets the system_tracer to the same process as the ordinary tracer process (i. e. <0.31.0>) and sets the trace pattern for the function dbg:get_tracer to one that has the action of setting a sequential token. When the function is called by a traced @@ -267,20 +267,20 @@ trace handler prints to the tty using an io function such as format/2. Note that when dbg:p(all, call) is called, IO processes are also traced. Here is an example:

                %% Using a default line editing shell
                -1> dbg:tracer(process, {fun(Msg,_) -> io:format("~p~n", [Msg]), 0 end, 0}).
                -{ok,<0.37.0>}
                -2> dbg:p(all, [call]).
                -{ok,[{matched,nonode@nohost,25}]}
                -3> dbg:tp(mymod,[{'_',[],[]}]).
                -{ok,[{matched,nonode@nohost,0},{saved,1}]}
                +1> dbg:tracer(process, {fun(Msg,_) -> io:format("~p~n", [Msg]), 0 end, 0}).
                +{ok,<0.37.0>}
                +2> dbg:p(all, [call]).
                +{ok,[{matched,nonode@nohost,25}]}
                /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dtrace.html differs (HTML document, UTF-8 Unicode text)
                --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dtrace.html	2025-05-10 20:19:15.977252723 +0000
                +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dtrace.html	2025-05-10 20:19:15.977252723 +0000
                @@ -221,7 +221,7 @@
                           Erlang programming language
                 
                       

                -

                Copyright © 1996-2025 Ericsson AB

                +

                Copyright © 1996-2041 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dyntrace.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dyntrace.html 2025-05-10 20:19:16.005252977 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dyntrace.html 2025-05-10 20:19:16.013253049 +0000 @@ -857,14 +857,14 @@

                Restores the previous state of user tags and their spreading as it was before a call to spread_tag/1.

                Note that the restoring is not limited to the same process; one can utilize this to turn off spreding in one process and restore it in a -newly created process that is is actually going to send messages:

                f() ->
                -    TagData = dyntrace:spread_tag(false),
                -    spawn(fun() ->
                -             dyntrace:restore_tag(TagData),
                -             do_something()
                -          end),
                -    do_something_else(),
                -    dyntrace:restore_tag(TagData).

                Correctly handling user tags and their spreading might take some effort, as +newly created process that is is actually going to send messages:

                f() ->
                +    TagData = dyntrace:spread_tag(false),
                +    spawn(fun() ->
                +             dyntrace:restore_tag(TagData),
                +             do_something()
                +          end),
                +    do_something_else(),
                +    dyntrace:restore_tag(TagData).

                Correctly handling user tags and their spreading might take some effort, as Erlang programs tend to send and receive messages so that sometimes the user tag gets lost due to various things, like double receives or communication with a port (ports do not handle user tags, in the same way as they do not handle @@ -911,12 +911,12 @@ later call to restore_tag/1.

                The file module already spreads tags, so there is no need to manually call this function to get user tags spread to the efile driver through that module.

                The most use of this function would be if one, for example, uses the io module to communicate with an I/O-server for a regular file, such as in the following -example:

                f() ->
                -   {ok, F} = file:open("test.tst", [write]),
                -   Saved = dyntrace:spread_tag(true),
                -   io:format(F, "Hello world!", []),
                -   dyntrace:restore_tag(Saved),
                -   file:close(F).

                In this example, any user tag set in the calling process will be spread to the +example:

                f() ->
                +   {ok, F} = file:open("test.tst", [write]),
                +   Saved = dyntrace:spread_tag(true),
                +   io:format(F, "Hello world!", []),
                +   dyntrace:restore_tag(Saved),
                +   file:close(F).

                In this example, any user tag set in the calling process will be spread to the I/O-server when the io:format/3 call is done.

                @@ -946,7 +946,7 @@ Erlang programming language

                -

                Copyright © 1996-2025 Ericsson AB

                +

                Copyright © 1996-2041 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/instrument.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/instrument.html 2025-05-10 20:19:16.041253303 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/instrument.html 2025-05-10 20:19:16.045253339 +0000 @@ -355,8 +355,8 @@ the one before it.

                The upper bound of the first interval is provided by the function that returned the histogram, and the last interval has no upper bound.

                For example, the histogram below has 40 (message) blocks between 128-256 bytes in size, 78 blocks between 256-512 bytes,2 blocks between 512-1024 bytes, and 2 -blocks between 1-2KB.

                > instrument:allocations(#{ histogram_start => 128, histogram_width => 15 }).
                -{ok, {128, 0, #{ message => {0,40,78,2,2,0,0,0,0,0,0,0,0,0,0}, ... } }}
                +blocks between 1-2KB.

                > instrument:allocations(#{ histogram_start => 128, histogram_width => 15 }).
                +{ok, {128, 0, #{ message => {0,40,78,2,2,0,0,0,0,0,0,0,0,0,0}, ... } }}
                @@ -496,30 +496,30 @@ block size histograms. Defaults to 128.

              • histogram_width - The number of intervals in the allocated block size histograms. Defaults to 18.

              • flags - Controls how to group the output, for example showing allocations on a per-process basis (when possible) rather than only a -NIF/driver-basis. Defaults to [].

              Example:

              > instrument:allocations(#{ histogram_start => 128, histogram_width => 15 }).
              -{ok,{128,0,
              -     #{udp_inet =>
              -           #{driver_event_state => {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}},
              +NIF/driver-basis. Defaults to [].

            Example:

            > instrument:allocations(#{ histogram_start => 128, histogram_width => 15 }).
            +{ok,{128,0,
            +     #{udp_inet =>
            +           #{driver_event_state => {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}},
                    system =>
            -           #{heap => {0,0,0,0,20,4,2,2,2,3,0,1,0,0,1},
            -             db_term => {271,3,1,52,80,1,0,0,0,0,0,0,0,0,0},
            -             code => {0,0,0,5,3,6,11,22,19,20,10,2,1,0,0},
            -             binary => {18,0,0,0,7,0,0,1,0,0,0,0,0,0,0},
            -             message => {0,40,78,2,2,0,0,0,0,0,0,0,0,0,0},
            -             ... }
            +           #{heap => {0,0,0,0,20,4,2,2,2,3,0,1,0,0,1},
            +             db_term => {271,3,1,52,80,1,0,0,0,0,0,0,0,0,0},
            +             code => {0,0,0,5,3,6,11,22,19,20,10,2,1,0,0},
            +             binary => {18,0,0,0,7,0,0,1,0,0,0,0,0,0,0},
            +             message => {0,40,78,2,2,0,0,0,0,0,0,0,0,0,0},
            +             ... }
                    spawn_forker =>
            -           #{driver_select_data_state =>
            -                 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}},
            -       ram_file_drv => #{drv_binary => {0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}},
            +           #{driver_select_data_state =>
            +                 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}},
            +       ram_file_drv => #{drv_binary => {0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}},
                    prim_file =>
            -           #{process_specific_data => {2,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
            -             nif_trap_export_entry => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0},
            -             monitor_extended => {0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
            -             drv_binary => {0,0,0,0,0,0,1,0,3,5,0,0,0,1,0},
            -             binary => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}},
            +           #{process_specific_data => {2,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
            +             nif_trap_export_entry => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0},
            +             monitor_extended => {0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
            +             drv_binary => {0,0,0,0,0,0,1,0,3,5,0,0,0,1,0},
            +             binary => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}},
                    prim_buffer =>
            -           #{nif_internal => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0},
            -             binary => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}}}}}
            + #{nif_internal => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}, + binary => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}}}}}
          @@ -596,15 +596,15 @@ tied to any particular scheduler. Defaults to all schedulers and the global instance.

        • histogram_start - The upper bound of the first interval in the free block size histograms. Defaults to 512.

        • histogram_width - The number of intervals in the free block size -histograms. Defaults to 14.

        Example:

        > instrument:carriers(#{ histogram_start => 512, histogram_width => 8 }).
        -{ok,{512,
        -     [{driver_alloc,false,262144,0,
        -                    [{driver_alloc,1,32784}],
        -                    {0,0,0,0,0,0,0,1}},
        -      {binary_alloc,false,32768,0,
        -                    [{binary_alloc,15,4304}],
        -                    {3,0,0,0,1,0,0,0}},
        -      {...}|...]}}
        +histograms. Defaults to 14.

      Example:

      > instrument:carriers(#{ histogram_start => 512, histogram_width => 8 }).
      +{ok,{512,
      +     [{driver_alloc,false,262144,0,
      +                    [{driver_alloc,1,32784}],
      +                    {0,0,0,0,0,0,0,1}},
      +      {binary_alloc,false,32768,0,
      +                    [{binary_alloc,15,4304}],
      +                    {3,0,0,0,1,0,0,0}},
      +      {...}|...]}}
      @@ -633,7 +633,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/lttng.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/lttng.html 2025-05-10 20:19:16.073253593 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/lttng.html 2025-05-10 20:19:16.081253666 +0000 @@ -150,42 +150,42 @@ Dyntrace Tracepoints

      All tracepoints are in the domain of org_erlang_dyntrace

      All Erlang types are the string equivalent in LTTng.

      process_spawn

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • parent : string :: Process ID. Ex. "<0.131.0>"
      • entry : string :: Code Location. Ex. "lists:sort/1"

      Available through erlang:trace/3 with trace flag procs and -{tracer,dyntrace,[]} as tracer module.

      Example:

      process_spawn: { cpu_id = 3 }, { pid = "<0.131.0>", parent = "<0.130.0>", entry = "erlang:apply/2" }

      process_link

      • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
      • from : string :: Process ID or Port ID. Ex. "<0.131.0>"
      • type : string :: "link" | "unlink"

      Available through erlang:trace/3 with trace flag procs and +{tracer,dyntrace,[]} as tracer module.

      Example:

      process_spawn: { cpu_id = 3 }, { pid = "<0.131.0>", parent = "<0.130.0>", entry = "erlang:apply/2" }

      process_link

      • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
      • from : string :: Process ID or Port ID. Ex. "<0.131.0>"
      • type : string :: "link" | "unlink"

      Available through erlang:trace/3 with trace flag procs and {tracer,dyntrace,[]} as tracer module.

      Example:

      process_link: { cpu_id = 3 }, { from = "<0.130.0>", to = "<0.131.0>", type = "link" }

      process_exit

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • reason : string :: Exit reason. Ex. "normal"

      Available through erlang:trace/3 with trace flag procs and -{tracer,dyntrace,[]} as tracer module.

      Example:

      process_exit: { cpu_id = 3 }, { pid = "<0.130.0>", reason = "normal" }

      process_register

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • name : string :: Registered name. Ex. "logger"
      • type : string :: "register" | "unregister"

      Example:

      process_register: { cpu_id = 0 }, { pid = "<0.128.0>", name = "dyntrace_lttng_SUITE" type = "register" }

      process_scheduled

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • entry : string :: Code Location. Ex. "lists:sort/1"
      • type : string :: +{tracer,dyntrace,[]} as tracer module.

        Example:

        process_exit: { cpu_id = 3 }, { pid = "<0.130.0>", reason = "normal" }

        process_register

        • pid : string :: Process ID. Ex. "<0.131.0>"
        • name : string :: Registered name. Ex. "logger"
        • type : string :: "register" | "unregister"

        Example:

        process_register: { cpu_id = 0 }, { pid = "<0.128.0>", name = "dyntrace_lttng_SUITE" type = "register" }

        process_scheduled

        • pid : string :: Process ID. Ex. "<0.131.0>"
        • entry : string :: Code Location. Ex. "lists:sort/1"
        • type : string :: "in" | "out" | "in_exiting" | "out_exiting" | "out_exited"

        Available through erlang:trace/3 with trace flag running and -{tracer,dyntrace,[]} as tracer module.

        Example:

        process_scheduled: { cpu_id = 0 }, { pid = "<0.136.0>", entry = "erlang:apply/2", type = "in" }

        port_open

        • pid : string :: Process ID. Ex. "<0.131.0>"
        • driver : string :: Driver name. Ex. "tcp_inet"
        • port : string :: Port ID. Ex. "#Port<0.1031>"

        Available through erlang:trace/3 with trace flag ports and +{tracer,dyntrace,[]} as tracer module.

        Example:

        process_scheduled: { cpu_id = 0 }, { pid = "<0.136.0>", entry = "erlang:apply/2", type = "in" }

        port_open

        • pid : string :: Process ID. Ex. "<0.131.0>"
        • driver : string :: Driver name. Ex. "tcp_inet"
        • port : string :: Port ID. Ex. "#Port<0.1031>"

        Available through erlang:trace/3 with trace flag ports and {tracer,dyntrace,[]} as tracer module.

        Example:

        port_open: { cpu_id = 5 }, { pid = "<0.131.0>", driver = "'/bin/sh -s unix:cmd'", port = "#Port<0.1887>" }

        port_exit

        • port : string :: Port ID. Ex. "#Port<0.1031>"
        • reason : string :: Exit reason. Ex. "normal"

        Available through erlang:trace/3 with trace flag ports and {tracer,dyntrace,[]} as tracer module.

        Example:

        port_exit: { cpu_id = 5 }, { port = "#Port<0.1887>", reason = "normal" }

        port_link

        • to : string :: Process ID. Ex. "<0.131.0>"
        • from : string :: Process ID. Ex. "<0.131.0>"
        • type : string :: "link" | "unlink"

        Available through erlang:trace/3 with trace flag ports and -{tracer,dyntrace,[]} as tracer module.

        Example:

        port_link: { cpu_id = 5 }, { from = "#Port<0.1887>", to = "<0.131.0>", type = "unlink" }

        port_scheduled

        Available through erlang:trace/3 with trace flag running and +{tracer,dyntrace,[]} as tracer module.

        Example:

        port_link: { cpu_id = 5 }, { from = "#Port<0.1887>", to = "<0.131.0>", type = "unlink" }

        port_scheduled

        Available through erlang:trace/3 with trace flag running and {tracer,dyntrace,[]} as tracer module.

        • port : string :: Port ID. Ex. "#Port<0.1031>"
        • entry : string :: Callback. Ex. "open"
        • type : string :: -"in" | "out" | "in_exiting" | "out_exiting" | "out_exited"

        Example:

        port_scheduled: { cpu_id = 5 }, { pid = "#Port<0.1905>", entry = "close", type = "out" }

        Available through erlang:trace/3 with trace flag running and +"in" | "out" | "in_exiting" | "out_exiting" | "out_exited"

      Example:

      port_scheduled: { cpu_id = 5 }, { pid = "#Port<0.1905>", entry = "close", type = "out" }

      Available through erlang:trace/3 with trace flag running and {tracer,dyntrace,[]} as tracer module.

      function_call

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • entry : string :: Code Location. Ex. "lists:sort/1"
      • depth : integer :: Stack depth. Ex. 0

      Available through erlang:trace/3 with trace flag call and -{tracer,dyntrace,[]} as tracer module.

      Example:

      function_call: { cpu_id = 5 }, { pid = "<0.145.0>", entry = "dyntrace_lttng_SUITE:'-t_call/1-fun-1-'/0", depth = 0 }

      function_return

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • entry : string :: Code Location. Ex. "lists:sort/1"
      • depth : integer :: Stack depth. Ex. 0

      Available through erlang:trace/3 with trace flag call or return_to and -{tracer,dyntrace,[]} as tracer module.

      Example:

      function_return: { cpu_id = 5 }, { pid = "<0.145.0>", entry = "dyntrace_lttng_SUITE:waiter/0", depth = 0 }

      function_exception

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • entry : string :: Code Location. Ex. "lists:sort/1"
      • class : string :: Error reason. Ex. "error"

      Available through erlang:trace/3 with trace flag call and -{tracer,dyntrace,[]} as tracer module.

      Example:

      function_exception: { cpu_id = 5 }, { pid = "<0.144.0>", entry = "t:call_exc/1", class = "error" }

      message_send

      • from : string :: Process ID or Port ID. Ex. "<0.131.0>"
      • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
      • message : string :: Message sent. Ex. "{<0.162.0>,ok}"

      Available through erlang:trace/3 with trace flag send and +{tracer,dyntrace,[]} as tracer module.

      Example:

      function_call: { cpu_id = 5 }, { pid = "<0.145.0>", entry = "dyntrace_lttng_SUITE:'-t_call/1-fun-1-'/0", depth = 0 }

      function_return

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • entry : string :: Code Location. Ex. "lists:sort/1"
      • depth : integer :: Stack depth. Ex. 0

      Available through erlang:trace/3 with trace flag call or return_to and +{tracer,dyntrace,[]} as tracer module.

      Example:

      function_return: { cpu_id = 5 }, { pid = "<0.145.0>", entry = "dyntrace_lttng_SUITE:waiter/0", depth = 0 }

      function_exception

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • entry : string :: Code Location. Ex. "lists:sort/1"
      • class : string :: Error reason. Ex. "error"

      Available through erlang:trace/3 with trace flag call and +{tracer,dyntrace,[]} as tracer module.

      Example:

      function_exception: { cpu_id = 5 }, { pid = "<0.144.0>", entry = "t:call_exc/1", class = "error" }

      message_send

      • from : string :: Process ID or Port ID. Ex. "<0.131.0>"
      • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
      • message : string :: Message sent. Ex. "{<0.162.0>,ok}"

      Available through erlang:trace/3 with trace flag send and {tracer,dyntrace,[]} as tracer module.

      Example:

      message_send: { cpu_id = 3 }, { from = "#Port<0.1938>", to = "<0.160.0>", message = "{#Port<0.1938>,eof}" }

      message_receive

      • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
      • message : string :: Message received. Ex. "{<0.162.0>,ok}"

      Available through erlang:trace/3 with trace flag 'receive' and {tracer,dyntrace,[]} as tracer module.

      Example:

      message_receive: { cpu_id = 7 }, { to = "<0.167.0>", message = "{<0.165.0>,ok}" }

      gc_minor_start

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • need : integer :: Heap need. Ex. 2
      • heap : integer :: Young heap word size. Ex. 233
      • old_heap : integer :: Old heap word size. Ex. 233

      Available through erlang:trace/3 with trace flag garbage_collection and -{tracer,dyntrace,[]} as tracer module.

      Example:

      gc_minor_start: { cpu_id = 0 }, { pid = "<0.172.0>", need = 0, heap = 610, old_heap = 0 }

      gc_minor_end

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • reclaimed : integer :: Heap reclaimed. Ex. 2
      • heap : integer :: Young heap word size. Ex. 233
      • old_heap : integer :: Old heap word size. Ex. 233

      Available through erlang:trace/3 with trace flag garbage_collection and -{tracer,dyntrace,[]} as tracer module.

      Example:

      gc_minor_end: { cpu_id = 0 }, { pid = "<0.172.0>", reclaimed = 120, heap = 1598, old_heap = 1598 }

      gc_major_start

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • need : integer :: Heap need. Ex. 2
      • heap : integer :: Young heap word size. Ex. 233
      • old_heap : integer :: Old heap word size. Ex. 233

      Available through erlang:trace/3 with trace flag garbage_collection and -{tracer,dyntrace,[]} as tracer module.

      Example:

      gc_major_start: { cpu_id = 0 }, { pid = "<0.172.0>", need = 8, heap = 2586, old_heap = 1598 }

      gc_major_end

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • reclaimed : integer :: Heap reclaimed. Ex. 2
      • heap : integer :: Young heap word size. Ex. 233
      • old_heap : integer :: Old heap word size. Ex. 233

      Available through erlang:trace/3 with trace flag garbage_collection and +{tracer,dyntrace,[]} as tracer module.

      Example:

      gc_minor_start: { cpu_id = 0 }, { pid = "<0.172.0>", need = 0, heap = 610, old_heap = 0 }

      gc_minor_end

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • reclaimed : integer :: Heap reclaimed. Ex. 2
      • heap : integer :: Young heap word size. Ex. 233
      • old_heap : integer :: Old heap word size. Ex. 233

      Available through erlang:trace/3 with trace flag garbage_collection and +{tracer,dyntrace,[]} as tracer module.

      Example:

      gc_minor_end: { cpu_id = 0 }, { pid = "<0.172.0>", reclaimed = 120, heap = 1598, old_heap = 1598 }

      gc_major_start

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • need : integer :: Heap need. Ex. 2
      • heap : integer :: Young heap word size. Ex. 233
      • old_heap : integer :: Old heap word size. Ex. 233

      Available through erlang:trace/3 with trace flag garbage_collection and +{tracer,dyntrace,[]} as tracer module.

      Example:

      gc_major_start: { cpu_id = 0 }, { pid = "<0.172.0>", need = 8, heap = 2586, old_heap = 1598 }

      gc_major_end

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • reclaimed : integer :: Heap reclaimed. Ex. 2
      • heap : integer :: Young heap word size. Ex. 233
      • old_heap : integer :: Old heap word size. Ex. 233

      Available through erlang:trace/3 with trace flag garbage_collection and {tracer,dyntrace,[]} as tracer module.

      Example:

      gc_major_end: { cpu_id = 0 }, { pid = "<0.172.0>", reclaimed = 240, heap = 4185, old_heap = 0 }

      BEAM Tracepoints

      -

      All tracepoints are in the domain of org_erlang_otp

      All Erlang types are the string equivalent in LTTng.

      driver_init

      • driver : string :: Driver name. Ex. "tcp_inet"
      • major : integer :: Major version. Ex. 3
      • minor : integer :: Minor version. Ex. 1
      • flags : integer :: Flags. Ex. 1

      Example:

      driver_init: { cpu_id = 2 }, { driver = "caller_drv", major = 3, minor = 3, flags = 1 }

      driver_start

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • port : string :: Port ID. Ex. "#Port<0.1031>"

      Example:

      driver_start: { cpu_id = 2 }, { pid = "<0.198.0>", driver = "caller_drv", port = "#Port<0.3676>" }

      driver_output

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • bytes : integer :: Size of data returned. Ex. 82

      Example:

      driver_output: { cpu_id = 2 }, { pid = "<0.198.0>", port = "#Port<0.3677>", driver = "/bin/sh -s unix:cmd", bytes = 36 }

      driver_outputv

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • bytes : integer :: Size of data returned. Ex. 82

      Example:

      driver_outputv: { cpu_id = 5 }, { pid = "<0.194.0>", port = "#Port<0.3663>", driver = "tcp_inet", bytes = 3 }

      driver_ready_input

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_ready_input: { cpu_id = 5 }, { pid = "<0.189.0>", port = "#Port<0.3637>", driver = "inet_gethost 4 " }

      driver_ready_output

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_ready_output: { cpu_id = 5 }, { pid = "<0.194.0>", port = "#Port<0.3663>", driver = "tcp_inet" }

      driver_timeout

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_timeout: { cpu_id = 5 }, { pid = "<0.196.0>", port = "#Port<0.3664>", driver = "tcp_inet" }

      driver_stop_select

      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_stop_select: { cpu_id = 5 }, { driver = "unknown" }

      driver_flush

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_flush: { cpu_id = 7 }, { pid = "<0.204.0>", port = "#Port<0.3686>", driver = "tcp_inet" }

      driver_stop

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_stop: { cpu_id = 5 }, { pid = "[]", port = "#Port<0.3673>", driver = "tcp_inet" }

      driver_process_exit

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      driver_ready_async

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_ready_async: { cpu_id = 3 }, { pid = "<0.181.0>", port = "#Port<0.3622>", driver = "tcp_inet" }

      driver_call

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • command : integer :: Command integer. Ex. 1
      • bytes : integer :: Size of data returned. Ex. 82

      Example:

      driver_call: { cpu_id = 2 }, { pid = "<0.202.0>", port = "#Port<0.3676>", driver = "caller_drv", command = 0, bytes = 2 }

      driver_control

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • command : integer :: Command integer. Ex. 1
      • bytes : integer :: Size of data returned. Ex. 82

      Example:

      driver_control: { cpu_id = 3 }, { pid = "<0.32767.8191>", port = "#Port<0.0>", driver = "forker", command = 83, bytes = 32 }

      carrier_create

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144
      • mbc_carriers : integer :: Number of multiblock carriers in instance. Ex. 3
      • mbc_carriers_size : integer :: Total size of multiblock blocks carriers in +

        All tracepoints are in the domain of org_erlang_otp

        All Erlang types are the string equivalent in LTTng.

        driver_init

        • driver : string :: Driver name. Ex. "tcp_inet"
        • major : integer :: Major version. Ex. 3
        • minor : integer :: Minor version. Ex. 1
        • flags : integer :: Flags. Ex. 1

        Example:

        driver_init: { cpu_id = 2 }, { driver = "caller_drv", major = 3, minor = 3, flags = 1 }

        driver_start

        • pid : string :: Process ID. Ex. "<0.131.0>"
        • driver : string :: Driver name. Ex. "tcp_inet"
        • port : string :: Port ID. Ex. "#Port<0.1031>"

        Example:

        driver_start: { cpu_id = 2 }, { pid = "<0.198.0>", driver = "caller_drv", port = "#Port<0.3676>" }

        driver_output

        • pid : string :: Process ID. Ex. "<0.131.0>"
        • port : string :: Port ID. Ex. "#Port<0.1031>"
        • driver : string :: Driver name. Ex. "tcp_inet"
        • bytes : integer :: Size of data returned. Ex. 82

        Example:

        driver_output: { cpu_id = 2 }, { pid = "<0.198.0>", port = "#Port<0.3677>", driver = "/bin/sh -s unix:cmd", bytes = 36 }

        driver_outputv

        • pid : string :: Process ID. Ex. "<0.131.0>"
        • port : string :: Port ID. Ex. "#Port<0.1031>"
        • driver : string :: Driver name. Ex. "tcp_inet"
        • bytes : integer :: Size of data returned. Ex. 82

        Example:

        driver_outputv: { cpu_id = 5 }, { pid = "<0.194.0>", port = "#Port<0.3663>", driver = "tcp_inet", bytes = 3 }

        driver_ready_input

        • pid : string :: Process ID. Ex. "<0.131.0>"
        • port : string :: Port ID. Ex. "#Port<0.1031>"
        • driver : string :: Driver name. Ex. "tcp_inet"

        Example:

        driver_ready_input: { cpu_id = 5 }, { pid = "<0.189.0>", port = "#Port<0.3637>", driver = "inet_gethost 4 " }

        driver_ready_output

        • pid : string :: Process ID. Ex. "<0.131.0>"
        • port : string :: Port ID. Ex. "#Port<0.1031>"
        • driver : string :: Driver name. Ex. "tcp_inet"

        Example:

        driver_ready_output: { cpu_id = 5 }, { pid = "<0.194.0>", port = "#Port<0.3663>", driver = "tcp_inet" }

        driver_timeout

        • pid : string :: Process ID. Ex. "<0.131.0>"
        • port : string :: Port ID. Ex. "#Port<0.1031>"
        • driver : string :: Driver name. Ex. "tcp_inet"

        Example:

        driver_timeout: { cpu_id = 5 }, { pid = "<0.196.0>", port = "#Port<0.3664>", driver = "tcp_inet" }

        driver_stop_select

        • driver : string :: Driver name. Ex. "tcp_inet"

        Example:

        driver_stop_select: { cpu_id = 5 }, { driver = "unknown" }

        driver_flush

        • pid : string :: Process ID. Ex. "<0.131.0>"
        • port : string :: Port ID. Ex. "#Port<0.1031>"
        • driver : string :: Driver name. Ex. "tcp_inet"

        Example:

        driver_flush: { cpu_id = 7 }, { pid = "<0.204.0>", port = "#Port<0.3686>", driver = "tcp_inet" }

        driver_stop

        • pid : string :: Process ID. Ex. "<0.131.0>"
        • port : string :: Port ID. Ex. "#Port<0.1031>"
        • driver : string :: Driver name. Ex. "tcp_inet"

        Example:

        driver_stop: { cpu_id = 5 }, { pid = "[]", port = "#Port<0.3673>", driver = "tcp_inet" }

        driver_process_exit

        • pid : string :: Process ID. Ex. "<0.131.0>"
        • port : string :: Port ID. Ex. "#Port<0.1031>"
        • driver : string :: Driver name. Ex. "tcp_inet"

        driver_ready_async

        • pid : string :: Process ID. Ex. "<0.131.0>"
        • port : string :: Port ID. Ex. "#Port<0.1031>"
        • driver : string :: Driver name. Ex. "tcp_inet"

        Example:

        driver_ready_async: { cpu_id = 3 }, { pid = "<0.181.0>", port = "#Port<0.3622>", driver = "tcp_inet" }

        driver_call

        • pid : string :: Process ID. Ex. "<0.131.0>"
        • port : string :: Port ID. Ex. "#Port<0.1031>"
        • driver : string :: Driver name. Ex. "tcp_inet"
        • command : integer :: Command integer. Ex. 1
        • bytes : integer :: Size of data returned. Ex. 82

        Example:

        driver_call: { cpu_id = 2 }, { pid = "<0.202.0>", port = "#Port<0.3676>", driver = "caller_drv", command = 0, bytes = 2 }

        driver_control

        • pid : string :: Process ID. Ex. "<0.131.0>"
        • port : string :: Port ID. Ex. "#Port<0.1031>"
        • driver : string :: Driver name. Ex. "tcp_inet"
        • command : integer :: Command integer. Ex. 1
        • bytes : integer :: Size of data returned. Ex. 82

        Example:

        driver_control: { cpu_id = 3 }, { pid = "<0.32767.8191>", port = "#Port<0.0>", driver = "forker", command = 83, bytes = 32 }

        carrier_create

        • type : string :: Carrier type. Ex. "ets_alloc"
        • instance : integer :: Allocator instance. Ex. 1
        • size : integer :: Carrier size. Ex. 262144
        • mbc_carriers : integer :: Number of multiblock carriers in instance. Ex. 3
        • mbc_carriers_size : integer :: Total size of multiblock blocks carriers in instance. Ex. 1343488
        • mbc_blocks : integer :: Number of multiblock blocks in instance. Ex. 122
        • mbc_blocks_size : integer :: Total size of all multiblock blocks in instance. Ex. 285296
        • sbc_carriers : integer :: Number of singleblock carriers in instance. Ex. 1
        • sbc_carriers_size : integer :: Total size of singleblock blocks carriers in instance. Ex. 1343488
        • sbc_blocks : integer :: Number of singleblocks in instance. Ex. 1
        • sbc_blocks_size : integer :: Total size of all singleblock blocks in -instance. Ex. 285296

        Example:

        carrier_create: { cpu_id = 2 }, { type = "ets_alloc", instance = 7, size = 2097152, mbc_carriers = 4, mbc_carriers_size = 3440640, mbc_blocks = 526, mbc_blocks_size = 1278576, sbc_carriers = 0, sbc_carriers_size = 0, sbc_blocks = 0, sbc_blocks_size = 0 }

        carrier_destroy

        • type : string :: Carrier type. Ex. "ets_alloc"
        • instance : integer :: Allocator instance. Ex. 1
        • size : integer :: Carrier size. Ex. 262144
        • mbc_carriers : integer :: Number of multiblock carriers in instance. Ex. 3
        • mbc_carriers_size : integer :: Total size of multiblock blocks carriers in +instance. Ex. 285296

        Example:

        carrier_create: { cpu_id = 2 }, { type = "ets_alloc", instance = 7, size = 2097152, mbc_carriers = 4, mbc_carriers_size = 3440640, mbc_blocks = 526, mbc_blocks_size = 1278576, sbc_carriers = 0, sbc_carriers_size = 0, sbc_blocks = 0, sbc_blocks_size = 0 }

        carrier_destroy

        • type : string :: Carrier type. Ex. "ets_alloc"
        • instance : integer :: Allocator instance. Ex. 1
        • size : integer :: Carrier size. Ex. 262144
        • mbc_carriers : integer :: Number of multiblock carriers in instance. Ex. 3
        • mbc_carriers_size : integer :: Total size of multiblock blocks carriers in instance. Ex. 1343488
        • mbc_blocks : integer :: Number of multiblock blocks in instance. Ex. 122
        • mbc_blocks_size : integer :: Total size of all multiblock blocks in instance. Ex. 285296
        • sbc_carriers : integer :: Number of singleblock carriers in instance. Ex. 1
        • sbc_carriers_size : integer :: Total size of singleblock blocks carriers in instance. Ex. 1343488
        • sbc_blocks : integer :: Number of singleblocks in instance. Ex. 1
        • sbc_blocks_size : integer :: Total size of all singleblock blocks in -instance. Ex. 285296

        Example:

        carrier_destroy: { cpu_id = 6 }, { type = "ets_alloc", instance = 7, size = 262144, mbc_carriers = 3, mbc_carriers_size = 3178496, mbc_blocks = 925, mbc_blocks_size = 2305336, sbc_carriers = 0, sbc_carriers_size = 0, sbc_blocks = 0, sbc_blocks_size = 0 }

        carrier_pool_put

        • type : string :: Carrier type. Ex. "ets_alloc"
        • instance : integer :: Allocator instance. Ex. 1
        • size : integer :: Carrier size. Ex. 262144

        Example:

        carrier_pool_put: { cpu_id = 3 }, { type = "ets_alloc", instance = 5, size = 1048576 }

        carrier_pool_get

        • type : string :: Carrier type. Ex. "ets_alloc"
        • instance : integer :: Allocator instance. Ex. 1
        • size : integer :: Carrier size. Ex. 262144

        Example:

        carrier_pool_get: { cpu_id = 7 }, { type = "ets_alloc", instance = 4, size = 3208 }

        +instance. Ex. 285296

      Example:

      carrier_destroy: { cpu_id = 6 }, { type = "ets_alloc", instance = 7, size = 262144, mbc_carriers = 3, mbc_carriers_size = 3178496, mbc_blocks = 925, mbc_blocks_size = 2305336, sbc_carriers = 0, sbc_carriers_size = 0, sbc_blocks = 0, sbc_blocks_size = 0 }

      carrier_pool_put

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144

      Example:

      carrier_pool_put: { cpu_id = 3 }, { type = "ets_alloc", instance = 5, size = 1048576 }

      carrier_pool_get

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144

      Example:

      carrier_pool_get: { cpu_id = 7 }, { type = "ets_alloc", instance = 4, size = 3208 }

      @@ -198,10 +198,10 @@ Erlang/OTP 19 [erts-8.0] [source-4d7b24d] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [lttng] Eshell V8.0 (abort with ^G) -1>

    Load the dyntrace module.

    1> l(dyntrace).
    -{module,dyntrace}

    All tracepoints via dyntrace are now visible and can be listed through +1>