~/f/erlang/RPMS.2017 ~/f/erlang ~/f/erlang RPMS.2017/erlang-doc-27.2.1-1.1.x86_64.rpm RPMS/erlang-doc-27.2.1-1.1.x86_64.rpm differ: char 225, line 1 Comparing erlang-doc-27.2.1-1.1.x86_64.rpm to erlang-doc-27.2.1-1.1.x86_64.rpm comparing the rpm tags of erlang-doc --- old-rpm-tags +++ new-rpm-tags @@ -407 +407 @@ -/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/dist/search_data-60252452.js 2 (none) 100644 root root 0 4294967295 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/dist/search_data-22628C0D.js 2 (none) 100644 root root 0 4294967295 @@ -936 +936 @@ -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/dist/search_data-2851E262.js 2 (none) 100644 root root 0 4294967295 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/dist/search_data-5E285FD6.js 2 (none) 100644 root root 0 4294967295 @@ -1291 +1291 @@ -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/dist/search_data-91E2EDED.js 2 (none) 100644 root root 0 4294967295 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/dist/search_data-227F454E.js 2 (none) 100644 root root 0 4294967295 @@ -1508 +1508 @@ -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dist/search_data-B508ECAC.js 2 (none) 100644 root root 0 4294967295 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dist/search_data-7F27CE3F.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-12AAC588.js 2 (none) 100644 root root 0 4294967295 +/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 @@ -2332,2 +2332,2 @@ -/usr/share/doc/packages/erlang-doc/doc/404.html 9a5fcb1dcb8fd0fb73b2fb3824842f9ab21565c64ff8a79209d3a40a0ffc4d9c 2 -/usr/share/doc/packages/erlang-doc/doc/asn1.html 9904d179e7910b8c22926f83963b5b8ea22f32b6d338ed7eb3fdfbcf6215d4e4 2 +/usr/share/doc/packages/erlang-doc/doc/404.html c104145d108f2da8b404c360e11561106ebedfbb57b4b9ca4ab694754d428ee4 2 +/usr/share/doc/packages/erlang-doc/doc/asn1.html c4975d5215c5e90e7f12d1a87bfc3e94d820e192ddc6c74f6aeea468b3addb1d 2 @@ -2336,8 +2336,8 @@ -/usr/share/doc/packages/erlang-doc/doc/common_test.html 4f6297545b13ac9cd6170e71d2e9b2c76a07012d8dd14378f788263c9239f415 2 -/usr/share/doc/packages/erlang-doc/doc/compiler.html 3a7b8c497aefd8614925d7d0275292c4f126b9b952f486b997b4a5bb06190ddd 2 -/usr/share/doc/packages/erlang-doc/doc/crypto.html 8ec276e4cab4f0d3a0566547183d6ca2dd442f7bb491e0b575ba2077d80f4de2 2 -/usr/share/doc/packages/erlang-doc/doc/debugger.html 32d59295f1ab326103d4b5fdbb1ac01995d97862ec35fef11440902a8ceb6e3d 2 -/usr/share/doc/packages/erlang-doc/doc/deprecations.html ee77c8b6704807f6b183d1985ffe1ae197ca8001d8fac5e2763d3055be2c3968 2 -/usr/share/doc/packages/erlang-doc/doc/design_principles.html 6aadf5a17211aac344f5c1e7709c9ba871532fdb653884d271d17fb79a150eb0 2 -/usr/share/doc/packages/erlang-doc/doc/dialyzer.html 01dc90b976dfb79c45c123d81bf1a426f307cd0ee0d162812a026e5ca0b40969 2 -/usr/share/doc/packages/erlang-doc/doc/diameter.html 2ef292c2e0a633441fce6845f13f6e9e873633858ba778428b63518cf7247e78 2 +/usr/share/doc/packages/erlang-doc/doc/common_test.html ff583f386bb0527b01b01dff6b0bef2a66c44a282ab4b859fe08be8cb9ab0b30 2 +/usr/share/doc/packages/erlang-doc/doc/compiler.html 3a1aa207c42071bdb503dfd1b8bda1970c4068f5606e31eaf713dae8c607a0cd 2 +/usr/share/doc/packages/erlang-doc/doc/crypto.html adda3274f35261fe815855259c55939e8f519c404d6aabfcdc1858de06b34b60 2 +/usr/share/doc/packages/erlang-doc/doc/debugger.html 425e42c7777a93aadf59c9c198981b3bb689ede64e4b9ca43ffa3fba3985385c 2 +/usr/share/doc/packages/erlang-doc/doc/deprecations.html 886e09656f44b92b5cb71362c65e0950c4934cd3aa1237b025973eca97bd7eb5 2 +/usr/share/doc/packages/erlang-doc/doc/design_principles.html 16b8aa606b610085928d1151c3b6d1cde6fcbb8567eb3b8bc6796513903e4723 2 +/usr/share/doc/packages/erlang-doc/doc/dialyzer.html c4902a0325055928d9efa36cb389b2265dd185dfac126d8be0934a2f0146a32a 2 +/usr/share/doc/packages/erlang-doc/doc/diameter.html 8ce01fb5bd092bf0ba7b7253b11936b4781a77ba78384ae4430f52dfe076a38a 2 @@ -2364,10 +2364,10 @@ -/usr/share/doc/packages/erlang-doc/doc/edoc.html b43a4ff621aecb276f5a6f6ec9b2ba6ca6a9999b3f6a6e2125c3f248dac7e71c 2 -/usr/share/doc/packages/erlang-doc/doc/efficiency_guide.html 2579f6e356496331698ceecc32ec68b1e12604d2f2da08f0f1b97c3cf6b45ad2 2 -/usr/share/doc/packages/erlang-doc/doc/eldap.html 1a7514e01d0661eb85d4362a04334f03c6e067d20898e2b024fa94d26c91ba9b 2 -/usr/share/doc/packages/erlang-doc/doc/embedded.html 22a13a574a072a8d9254155c7c517bf273227940aeeeee65c7ab1541a37be022 2 -/usr/share/doc/packages/erlang-doc/doc/erl_interface.html 50dfefaa894efb12f53ffc2ea65deca956927e816e0f997962f534171d639e9e 2 -/usr/share/doc/packages/erlang-doc/doc/erts.html 620fd34dc23059d06186f5cc0f969289fda6f05071457e3ff691a2aa7a4d53e8 2 -/usr/share/doc/packages/erlang-doc/doc/et.html c6d7d1d15df312cf61ea8cab73bef7f0d8145ba6b838e81a38884f40674acca9 2 -/usr/share/doc/packages/erlang-doc/doc/eunit.html 787989b198d36b0729e7b808e07cadababb4365034c53dd34ccdaffa13cc15f5 2 -/usr/share/doc/packages/erlang-doc/doc/ftp.html 8581b75ca307449358dc67c5f5c7b78305509b945c8886b8a36dfc7b05dc1eff 2 -/usr/share/doc/packages/erlang-doc/doc/getting_started.html 3b4f5af2cebab0a879a3e05b1450cceb50963c3fac1a51a0d6cc3bf039dfec1a 2 +/usr/share/doc/packages/erlang-doc/doc/edoc.html 8994ccba0c1fc33c8b157d3c6505273eb8f42ccfbe03c1dd692250d5acf675c2 2 +/usr/share/doc/packages/erlang-doc/doc/efficiency_guide.html 2cdd65eb00ed7b9506b1b18ad16fab63ac2bbdf134b808f8b5257a3f7014be6e 2 +/usr/share/doc/packages/erlang-doc/doc/eldap.html 5e96d2a625a5fa91e7b32d8d699951fce859697a1dc01e27c160e9ec9d830a70 2 +/usr/share/doc/packages/erlang-doc/doc/embedded.html 81802a25da1b3f72531484b6518f8c7e8b5e9e965325c3f2a242fb171efcba38 2 +/usr/share/doc/packages/erlang-doc/doc/erl_interface.html de8ab8e19745ba8e8174bf2b9db76308a31f0b64927f76c0138b6b5b9c160f7d 2 +/usr/share/doc/packages/erlang-doc/doc/erts.html 32067b53d3a7211d4710a80f2a856e33e3e352099de9ea1d3144bdca016c2adb 2 +/usr/share/doc/packages/erlang-doc/doc/et.html 4a1d79ef810a8577822c7792ae040c65572b091cf3362ff98d0acfacc0444938 2 +/usr/share/doc/packages/erlang-doc/doc/eunit.html c83fd1e2d4f6306736647531a9b6f4e5590ede19b73ddf852be67e2ab2279149 2 +/usr/share/doc/packages/erlang-doc/doc/ftp.html e4358c11cbac107430e469114cea919aa54c948d6d5cca740aca01a86c954600 2 +/usr/share/doc/packages/erlang-doc/doc/getting_started.html d57724a10e95986bee7628d124e79fb875e31522fc88f0d92687dc7ca5109e59 2 @@ -2375,26 +2375,26 @@ -/usr/share/doc/packages/erlang-doc/doc/inets.html 734605209346d6eb99b7ba2a68703e2aa2ac8638b4be72dec38080578ff3eaa5 2 -/usr/share/doc/packages/erlang-doc/doc/installation_guide.html e96441af4244ca63b1c926f46b80badbbd20f34cba08127716668a464f302942 2 -/usr/share/doc/packages/erlang-doc/doc/jinterface.html c55ab677721fe99b68c3133e9f4040e949df7917f68ac49bab15e6080d5d087b 2 -/usr/share/doc/packages/erlang-doc/doc/kernel.html 6a1745cec19cf9ebc6c8ac321b470268f5a5f693f2b9a93f533bdb6d6d0ef123 2 -/usr/share/doc/packages/erlang-doc/doc/man_index.html 4c12d38e3ca512253ba2224fea90d6c9da2812a01c17cb10b1c7f0f75e2b85b7 2 -/usr/share/doc/packages/erlang-doc/doc/megaco.html c64dfcec205a09856490a0476cf5781556dcdc08305591b547ef4b56ef193cbb 2 -/usr/share/doc/packages/erlang-doc/doc/mnesia.html aca1a8c32693861d575d8437a144337e5224bf3d76bd3499bf30e007cf5885f5 2 -/usr/share/doc/packages/erlang-doc/doc/observer.html fb70906cdd4b45de4c8092cc527568a42bef6f1468677a056ccbe07eb972a52c 2 -/usr/share/doc/packages/erlang-doc/doc/odbc.html 51ecc4f9b357be2c4ae495839105c0f0e61dd56f14592f8e28b49bb754d6a14f 2 -/usr/share/doc/packages/erlang-doc/doc/os_mon.html 56e9687985c20ff351ac12b05a1678f4f5cceeda74a0ae6e379ebc5b1b6b9fdd 2 -/usr/share/doc/packages/erlang-doc/doc/parsetools.html 4ca4598876c7b392afbadc829941d016e7104612b1db166a2115fa5a89341aff 2 -/usr/share/doc/packages/erlang-doc/doc/programming_examples.html b02219d416a973c9db39c835203d034aebed9fbafa21308d0366c62721af0998 2 -/usr/share/doc/packages/erlang-doc/doc/public_key.html ba62e747e80f7b8806f27f4132516f73674012d680bc49276dd15049b046089b 2 -/usr/share/doc/packages/erlang-doc/doc/readme.html fbb698bd1396b424afdf174ad4c4764224c48f5d6638331732aec33b2660756d 2 -/usr/share/doc/packages/erlang-doc/doc/reference_manual.html 2f2d4ab4006d93ca97371f67c930467af8a7da652a346c40aa844535330e0866 2 -/usr/share/doc/packages/erlang-doc/doc/reltool.html 198cc7782489e24335ce6cba3614df57aaa6f302a526a4c3d240097f2fd05688 2 -/usr/share/doc/packages/erlang-doc/doc/removed.html 1e9f79cf1a1b3491bbb92e4f9147b25991671adc0c272af578866e88e4b34dcd 2 -/usr/share/doc/packages/erlang-doc/doc/runtime_tools.html f84afb40a98ebca9fa334e495d06300b569ad5c571943273250ce8234af0dc07 2 -/usr/share/doc/packages/erlang-doc/doc/sasl.html 602a7f60c3766089c22831de4b7e83017c55e1b6381caf0ce2e12784628b0d14 2 -/usr/share/doc/packages/erlang-doc/doc/scheduled_for_removal.html e77fe5cc78d8d8c7f3ad896e2735b836af009f634cd22f295037ed048f0d2d64 2 -/usr/share/doc/packages/erlang-doc/doc/search.html c6abd26f1756dfd68867315905f40db1d4ee695671e3355c33626f9f4069d514 2 -/usr/share/doc/packages/erlang-doc/doc/snmp.html 13b3e7e4d5ce0a0e05c09f4098b69df8317eca505f81b55d4f0c366e5c3aa8a8 2 -/usr/share/doc/packages/erlang-doc/doc/ssh.html 3ef7b3544ef4a43e4580ece62e6bda3a8d14b0f344293f50a0e5e6fe729f6e8c 2 -/usr/share/doc/packages/erlang-doc/doc/ssl.html bad000db988c01673359e4f3d4715491050faa8691d15aaf101f432d9b3aa5cf 2 -/usr/share/doc/packages/erlang-doc/doc/stdlib.html c73663928db5106de92e18af42c65da0bdbfb0cea9efea1a7a8733b4621e1d77 2 -/usr/share/doc/packages/erlang-doc/doc/syntax_tools.html 29ae25129dc8e66752ce0f0d8c78167e2ae73bbe77e042d67bb3de39496da170 2 +/usr/share/doc/packages/erlang-doc/doc/inets.html 595ce5536a3afaaef3bdb8c8dd0bc114708d485fdce06c24f8151478454b3014 2 +/usr/share/doc/packages/erlang-doc/doc/installation_guide.html 1f1fb2a2e80c5f05f2c624593a9fcbf5f090c328820f69a58591bce98da9f60e 2 +/usr/share/doc/packages/erlang-doc/doc/jinterface.html d0cbec580970081021c54dabf9971e329b3a4a3f324f3ce69992c4d52cd2fd73 2 +/usr/share/doc/packages/erlang-doc/doc/kernel.html f45f15e9e6cacb6ce463d7e4360799e9a327e0fda1df6f620943543d139f6f08 2 +/usr/share/doc/packages/erlang-doc/doc/man_index.html b798cd484fe3f00aeef8c4a5e84227d3384a62b92ed94c8c6c4b4a019cc0e406 2 +/usr/share/doc/packages/erlang-doc/doc/megaco.html 8e7713192b9001e25a773552eca499678f928174d52aea83148385892459951a 2 +/usr/share/doc/packages/erlang-doc/doc/mnesia.html cc558ec00e477d09ccf4a8e17edb25cc7307a9fcae87bd3cc003573caba53252 2 +/usr/share/doc/packages/erlang-doc/doc/observer.html 992520633f0a6abd9013cbc169a1322d26af15221079cb73ff538496e9314f70 2 +/usr/share/doc/packages/erlang-doc/doc/odbc.html f8c5292e7e5819d688528edb78411a2eeb0d7fbe7ad7e93ba509d7515711119a 2 +/usr/share/doc/packages/erlang-doc/doc/os_mon.html 2c5ff03dfa89a517d4033b0ef2ff587037a82631118c71794bc46017c7f386fb 2 +/usr/share/doc/packages/erlang-doc/doc/parsetools.html 326bf7e8c7d3fe5e021720c428227498c726b448a1353666844523c7567f7dd7 2 +/usr/share/doc/packages/erlang-doc/doc/programming_examples.html 98b7b4041e5776b82f0a626365e5694ff2517d4bd9efcf3a6c394555876e2bea 2 +/usr/share/doc/packages/erlang-doc/doc/public_key.html 48b87ad6863b95a30887f8f97d4549c8e85245e1aeef72a3e257b92f6811726b 2 +/usr/share/doc/packages/erlang-doc/doc/readme.html 88f9ac9e265849f4eec4ebc01d9f4eef3be904fcff7e43903f8acf54d84b9db1 2 +/usr/share/doc/packages/erlang-doc/doc/reference_manual.html 5c481db40ba249223ba43ccc0fa0adbb1b64609baf0a9b90da13d8d5114fec28 2 +/usr/share/doc/packages/erlang-doc/doc/reltool.html 596879c37e86b35ece3c518834fc380020709f746966f90f5f2210dd718d1d89 2 +/usr/share/doc/packages/erlang-doc/doc/removed.html 093c57ead03afe601856105daa5742af978b56236f22525c156cb56a27d6f699 2 +/usr/share/doc/packages/erlang-doc/doc/runtime_tools.html c75064266d3c00167fd25aa6afd7699263989b8334c318a4fc6f35a8dbb8aa48 2 +/usr/share/doc/packages/erlang-doc/doc/sasl.html 43b9335f5c1a5a542d78f255c08f977306593825ac96f34515626fdc85c348be 2 +/usr/share/doc/packages/erlang-doc/doc/scheduled_for_removal.html a279a5bb91d2f7d72b443845ffb67ddc234759de06c83724b9aaea5ef58468ed 2 +/usr/share/doc/packages/erlang-doc/doc/search.html 86a34fd703759a0a1be6465670c62944ab5792c6681d56683519ee11cf0f7817 2 +/usr/share/doc/packages/erlang-doc/doc/snmp.html 6b0dde91626f2ea18d14e6d08ae890c6a5a90f8913bad62b1a647198c02dc180 2 +/usr/share/doc/packages/erlang-doc/doc/ssh.html ac3b052c4700c71c24d067b4f3775033bab5a45c59cd72c9bc0786f54131b565 2 +/usr/share/doc/packages/erlang-doc/doc/ssl.html 752ce606e6a5546f68e0b7372557d430debb892d31887f9532fe56ddd7b96da1 2 +/usr/share/doc/packages/erlang-doc/doc/stdlib.html 239de4ab22787e05a6e08c99c90d09c7f24160b45b86748dd650db5baf6fbd80 2 +/usr/share/doc/packages/erlang-doc/doc/syntax_tools.html 318900812cf1a8f0ffacdf23d9b3cd05afea446cc409d3a63cf8e466f1593550 2 @@ -2402,4 +2402,4 @@ -/usr/share/doc/packages/erlang-doc/doc/system/404.html 541e46c17260c3c70575f20fb9f67447be59c37a7001cdda39a4dd367502b32a 2 -/usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub f78b51e3083c2d7bec8ee83a2950a699a65a325ab7b483defba3a3dcfa15cbc4 2 -/usr/share/doc/packages/erlang-doc/doc/system/applications.html 72f8d3a262b5647b6039c49b5dfef3067d667a616bbc060d2b69c78dd657ae36 2 -/usr/share/doc/packages/erlang-doc/doc/system/appup_cookbook.html c4f550608ad0fe3e6fc9bbed3a49a131f52709828f751f5fc7c9ef9cce2b20e6 2 +/usr/share/doc/packages/erlang-doc/doc/system/404.html 3a2ee302e1f834c60da00b56eb6b9ee91c48c2a736df4b5871f9c0a5a550266d 2 +/usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub b271616907c79447edc3310cdb78ce4ca2e76fa3bf3bcbb6ee73070f1b6158e0 2 +/usr/share/doc/packages/erlang-doc/doc/system/applications.html 234843fcd02410d6b5d54cfcf23190c44efc743e26329df38cea3885bf74e912 2 +/usr/share/doc/packages/erlang-doc/doc/system/appup_cookbook.html 3a0d7699a169262b81509ab68a4ec26f50f2819da30d11d713876f0b19d15320 2 @@ -2415,14 +2415,14 @@ -/usr/share/doc/packages/erlang-doc/doc/system/benchmarking.html b03b3c7af04169939e1c299bbe816dcb9f5c228de63650af054d9aed25b3f615 2 -/usr/share/doc/packages/erlang-doc/doc/system/binaryhandling.html ccd6a53687b66d6ea3272f6c7e99896db65b447d62f0edc753b4b7e0d4090942 2 -/usr/share/doc/packages/erlang-doc/doc/system/bit_syntax.html fbab449f4a03d00245ddfb4886c50a68dad495899077a69797221e39b49d001c 2 -/usr/share/doc/packages/erlang-doc/doc/system/c_port.html 13f71c83aba140355c9bf7e2c1af6f2742cf70410d275a9430773c20357da791 2 -/usr/share/doc/packages/erlang-doc/doc/system/c_portdriver.html 4582891fab54ea5e55f9e9dfe1d94a48d0f61b3e9f11766778756a1d25ba0399 2 -/usr/share/doc/packages/erlang-doc/doc/system/character_set.html 4b389b8a5c44d86bbbbddf6ddfc8e35d58332007230854557b39c519a9dc0cd9 2 -/usr/share/doc/packages/erlang-doc/doc/system/cnode.html 64c67b20084ef38afa3aa80e6931def059bc0112a2e102fb71173639f340f937 2 -/usr/share/doc/packages/erlang-doc/doc/system/code_loading.html 8248b7df159fdeb2c26ac88e4e7f0790bc5710e3622f76613e95a69dd5795279 2 -/usr/share/doc/packages/erlang-doc/doc/system/commoncaveats.html cc3361ac03f8d1184cbcb72484ea2bdb4dae516294b7bd61c8c41cda3e90e944 2 -/usr/share/doc/packages/erlang-doc/doc/system/conc_prog.html ef40fdad08004d8aed40083caa46618e24e9e421dc9b8d66cc14322c1cde7850 2 -/usr/share/doc/packages/erlang-doc/doc/system/create_target.html 01959f1eb12ef648f766269ba455356e4b55bd8d3ebec04692e8b9ec9442d8c6 2 -/usr/share/doc/packages/erlang-doc/doc/system/data_types.html 7c80c8d9ab0367c1584622acb857100b124fdf7b7ad4d362a619ad3b5abccf73 2 -/usr/share/doc/packages/erlang-doc/doc/system/debugging.html 414d2ce484e04a5a273e65521b0b7a8c9a5291901ba528045639bb2b7736449d 2 -/usr/share/doc/packages/erlang-doc/doc/system/design_principles.html d2be1599736776b82d4d019c28377a767c9ef1a733ca42dc623b4e33f1f6e420 2 +/usr/share/doc/packages/erlang-doc/doc/system/benchmarking.html 55bc133405f25c125d743f62e6a7685c1c08d91f41fd3a12932be9cdd19df2db 2 +/usr/share/doc/packages/erlang-doc/doc/system/binaryhandling.html 9ae33a3759efc57f4800efa4fb22a7c2d9246b21a91c6fbdb47414e728724dd1 2 +/usr/share/doc/packages/erlang-doc/doc/system/bit_syntax.html d5376f8d9b89e6dda8ff18aa462fef4277634e1e93b7c6b00530d43eaeace4e6 2 +/usr/share/doc/packages/erlang-doc/doc/system/c_port.html 2c7ef1ec45beaf6939eff8c037687cc5afed3b4ba080f205ba4baab8e915205c 2 +/usr/share/doc/packages/erlang-doc/doc/system/c_portdriver.html 887c202ffedf8cb6a4f878f7683fab440058b843c29f2d584fecec1737235579 2 +/usr/share/doc/packages/erlang-doc/doc/system/character_set.html 6cb021041562493a0f53c29e1dcf42d85ffe185472be9aad241d0967cf8c752a 2 +/usr/share/doc/packages/erlang-doc/doc/system/cnode.html 523c78762dcba8f6c2a3365cdf0d4e4b77ae4e5c4906a2fe3d5a89f50a2a67da 2 +/usr/share/doc/packages/erlang-doc/doc/system/code_loading.html 52bf486a51c28782bd6b8c9674307c312145c90fa9ea33ef1e7ccb2c2d6f19b8 2 +/usr/share/doc/packages/erlang-doc/doc/system/commoncaveats.html 6c1fbbafc4b41bcc9462977b6c7420024994196ab37aa40922a0d54c1ebeff2b 2 +/usr/share/doc/packages/erlang-doc/doc/system/conc_prog.html 80985e482496b8540c592b4d6aae5dc2017cc3df696e327a224d6f6d0dae3ff1 2 +/usr/share/doc/packages/erlang-doc/doc/system/create_target.html efc854c32aa053642b6514faf6fb3505aa25392c84ee86a2e764b38fc80b45bd 2 +/usr/share/doc/packages/erlang-doc/doc/system/data_types.html 12cddba0248eb01b0eeed80a252c405fe5e8632605724cbc694c8b66c0856fec 2 +/usr/share/doc/packages/erlang-doc/doc/system/debugging.html 4a4c3bc194dd37253773034bcdb4cc163b6cc6fd279ae36312c2a548ead70fc9 2 +/usr/share/doc/packages/erlang-doc/doc/system/design_principles.html bad5d8cf01acad816388e264fba84450e86d8b9aeacb3fa9c7f7d767f12892d9 2 @@ -2449,19 +2449,19 @@ -/usr/share/doc/packages/erlang-doc/doc/system/distributed.html 7204e1e716df367ac17f1601184e0ac5bc8ccb0add7f48dbb0c92f1a59aa9a3e 2 -/usr/share/doc/packages/erlang-doc/doc/system/distributed_applications.html b4f1dc93397642c813aed2282b52df810fb98974c69c313d8c6927da4a5a5e63 2 -/usr/share/doc/packages/erlang-doc/doc/system/documentation.html 8b3817a19311191db462e841ab1d666f122158771ccffca06ddc24d3df017684 2 -/usr/share/doc/packages/erlang-doc/doc/system/drivers.html 175c7b4f72dc6577db958c2e1f4ec3665d751e67625ec240e2d59d320ae0762a 2 -/usr/share/doc/packages/erlang-doc/doc/system/eff_guide_functions.html 1e44b365bbc508eb8988e068ecf8389ae44816a7d3221daf6c798bba839960fc 2 -/usr/share/doc/packages/erlang-doc/doc/system/eff_guide_processes.html 0b5978f6ecf8f5313c28588528d15251cb904bebb7b6176678ef57d7e827cc1c 2 -/usr/share/doc/packages/erlang-doc/doc/system/efficiency_guide.html f399cda032ab3ceff1f950f80df37dfab59b476ea81fedec45e9586009c5cab1 2 -/usr/share/doc/packages/erlang-doc/doc/system/embedded.html 8e1a24ff0445a56e656bf4955d204098401a5615e3926f1c356741532283e739 2 -/usr/share/doc/packages/erlang-doc/doc/system/erl_interface.html d8d36eb5cdb4a68b7ee6c3fc99706181186f90ff95201f9fa9edf53e87bf93ec 2 -/usr/share/doc/packages/erlang-doc/doc/system/error_logging.html ccbcea0038172e572dc6f14c1f48c1f00efc4e3064274d9e3e4737b3ef3fe02d 2 -/usr/share/doc/packages/erlang-doc/doc/system/errors.html a17788563ee2113fb2376eb05ff0d4f2fc11a41b621497c21b789ca0aa6bfdb5 2 -/usr/share/doc/packages/erlang-doc/doc/system/events.html 87f94df5e3d852193439d01deef99c59c609ecdea12d471c71a439cb7e4ba7d9 2 -/usr/share/doc/packages/erlang-doc/doc/system/example.html 1b3594ba9afb62c9906a1ca6659860673195653a402a7b36d3082c5e541d1407 2 -/usr/share/doc/packages/erlang-doc/doc/system/expressions.html 56b358bb3cf8e87429dea68a8ebf29a57e5af3a038637f40c11478368b087972 2 -/usr/share/doc/packages/erlang-doc/doc/system/features.html 1b7561a81618055655c980a9dd67a7a224398b05f554d26674535ad5cecbdb8e 2 -/usr/share/doc/packages/erlang-doc/doc/system/funs.html 3ac7ec52bf83e6b921cd70ee5eb51d40ce3209e9bb4b5091b9dea21a77cc749f 2 -/usr/share/doc/packages/erlang-doc/doc/system/gen_server_concepts.html 62a4f4ae1a3cbd6e03167a578fe96c908d8c9e799256ff0dc92f35c69cd19a7b 2 -/usr/share/doc/packages/erlang-doc/doc/system/getting_started.html 692f70ec7d6894da9c89691f930d6f87daae195f11e42b8d739982848edf2bd1 2 -/usr/share/doc/packages/erlang-doc/doc/system/included_applications.html 5712e48f1a66b75f43b6b6a9f363579ac68b5db2b63df5645a712f7770143960 2 +/usr/share/doc/packages/erlang-doc/doc/system/distributed.html c81e659dc00d9ee61e12b1d63e57d6fd579c374162d8bcd2177183d1304dafe0 2 +/usr/share/doc/packages/erlang-doc/doc/system/distributed_applications.html 828757e3bd730a3a0fe9ca7fa38a1732de61562276544264da91fdd21179479d 2 +/usr/share/doc/packages/erlang-doc/doc/system/documentation.html 3d76aed18ab6449d9593895f401604d549aa7851402fb551aa433afb2d9d366d 2 +/usr/share/doc/packages/erlang-doc/doc/system/drivers.html 82ac393adc322edda80e8b68f49392969724c335ab906606971f451248e8530a 2 +/usr/share/doc/packages/erlang-doc/doc/system/eff_guide_functions.html f4713d61d3480d4c1d8afc5993cbe84a4b432dd0a9dfc153c6f43d9e22e9021c 2 +/usr/share/doc/packages/erlang-doc/doc/system/eff_guide_processes.html d64fde4f2b5c99a7d4f5f61c47d279926670e2a575503c2864dfc45acb3181bd 2 +/usr/share/doc/packages/erlang-doc/doc/system/efficiency_guide.html bdc4b6933c30c58a49cfab28887ea58eec8b08e62712fb1d0653249de3f3cbe2 2 +/usr/share/doc/packages/erlang-doc/doc/system/embedded.html 8da647231f322188f2f2b1302bd0cdf898ec70701e8071126216295770d3aaa8 2 +/usr/share/doc/packages/erlang-doc/doc/system/erl_interface.html 16a302988c15052ec1459e0e71376135d2c52de5f9b1633c635cd18407fcb475 2 +/usr/share/doc/packages/erlang-doc/doc/system/error_logging.html d18893a614a437bd5536f1575f51726836af2ebe7c65526f6c836bef23f1d7c5 2 +/usr/share/doc/packages/erlang-doc/doc/system/errors.html cc0421607a8784ed87acbfb0a1b3c3e22e8b5522d392ae668e8409449ff3eeda 2 +/usr/share/doc/packages/erlang-doc/doc/system/events.html f238833babcafd4aea350d06fc641da81dd9bc0b6db6100f1142bf6e1a8721f1 2 +/usr/share/doc/packages/erlang-doc/doc/system/example.html 4587fd30c8eb35398a8ee5d9c287826abd90f57fa9589f24e5a81181c5511ac0 2 +/usr/share/doc/packages/erlang-doc/doc/system/expressions.html 0d3490d3c36ac4d287de39b34b9c5d4d9867bfe9cf330de6413fffe5e4845c7c 2 +/usr/share/doc/packages/erlang-doc/doc/system/features.html d2e39a786df3e8ffb0354291cea0c97f36cb4a290d9db24c7579e939b9ce8982 2 +/usr/share/doc/packages/erlang-doc/doc/system/funs.html 26d7cb93b12c2755e139145b441e5587ee3ebe0dc96aab15318ccde1c8cb500d 2 +/usr/share/doc/packages/erlang-doc/doc/system/gen_server_concepts.html 2c433bf8a059e5e9e9478ab6da22bd9fd67b489d603341ad41c71ad651ff5a95 2 +/usr/share/doc/packages/erlang-doc/doc/system/getting_started.html ab3a65614446e1e18e2fcba5b1d43e5fe7629d6f7c0f1dbaabc0c862a6685f30 2 +/usr/share/doc/packages/erlang-doc/doc/system/included_applications.html f2814bb4555c803c1e6c50a67e3880cf9d0aa0c8325a5bfc92c82a7252f6d844 2 @@ -2469,48 +2469,48 @@ -/usr/share/doc/packages/erlang-doc/doc/system/install-cross.html 1210d50d1fe3f12b944863445bee44cc48fc1b9caf5bbcc0e255f44028b9f3eb 2 -/usr/share/doc/packages/erlang-doc/doc/system/install-win32.html 44546a6a0a9ef4173a07865fd072e5d5738c8757c8fe1ad7204de0592852b928 2 -/usr/share/doc/packages/erlang-doc/doc/system/install.html 568f7b975d7ac1ccdb2e39cf20bfc3a761fca7309d128787e029fc15b3a1020d 2 -/usr/share/doc/packages/erlang-doc/doc/system/installation_guide.html 963ad20d659ae00ba78ac9a36e4c0e4ee81a1f691fcf69f461af2dca12c8750d 2 -/usr/share/doc/packages/erlang-doc/doc/system/list_comprehensions.html 36fc58b4a4e47c30fa07a6cad235ceb302821034ea05e555f0b2a5f467418850 2 -/usr/share/doc/packages/erlang-doc/doc/system/listhandling.html 132290523894b2fa0b707dab560c8a9caaf43b9bbe41d190bbc4bef7a87928ba 2 -/usr/share/doc/packages/erlang-doc/doc/system/macros.html 31f6a4bfa8b481a75c435e5fb5936e69419241e2107300509848f2ab91ec3408 2 -/usr/share/doc/packages/erlang-doc/doc/system/maps.html 37878d99cd930050cb1fe21c1ee35556af84605d5527250ccd23d3061c314f27 2 -/usr/share/doc/packages/erlang-doc/doc/system/memory.html 44c13a387d108ea0b32d2482aeff032354940c844b8c7f360e1221323add872b 2 -/usr/share/doc/packages/erlang-doc/doc/system/misc.html 77c42b699e75e2276f62546c0cd7b3bd8ee9e1b30dc5e7efaa0d4e9c08cef4a2 2 -/usr/share/doc/packages/erlang-doc/doc/system/modules.html bc92175e88c4492d55f64d748e13e6fe0a37fe4492a69cabf65613fadbe392cd 2 -/usr/share/doc/packages/erlang-doc/doc/system/nif.html 74f48388ddad6141638e37169afcde54ceee7b6ffd4804be400157ea4d8c3f83 2 -/usr/share/doc/packages/erlang-doc/doc/system/opaques.html e80651744b86e63fc8ac61115ae0bfc56f20749263bef1b3ba9822e22c4f24ac 2 -/usr/share/doc/packages/erlang-doc/doc/system/otp-patch-apply.html ed4d281e09751fc33536fd8fd526dedc16f3e31aca710fbe34908d2e1bdbd55c 2 -/usr/share/doc/packages/erlang-doc/doc/system/overview.html 3729ecf9c93b99e2e14b3abf54aa40d7e0f54cb32b24b135c8e4a2e4028ad2a3 2 -/usr/share/doc/packages/erlang-doc/doc/system/patterns.html 29ad467acba98559ef02e0a6d2f097851767b8edafdde19cc864b9909cf2c20d 2 -/usr/share/doc/packages/erlang-doc/doc/system/ports.html 9e5af30f5ee7e00a678dcac36b478b73672c1293282ff2e572f7377e2e246e25 2 -/usr/share/doc/packages/erlang-doc/doc/system/profiling.html a450690a015bd25d425941fe79f5945e37b4451bde02ac5862434902b7fcfc5a 2 -/usr/share/doc/packages/erlang-doc/doc/system/prog_ex_records.html bb061b6d149c2b4cd93a80f0bbae9cae800e2f22321c707b572307a83818850e 2 -/usr/share/doc/packages/erlang-doc/doc/system/programming_examples.html e1ba92c3f6b1f2f62d82d74e681a2d5cd2f0be88d1c02611cb37be0a3fdad3f7 2 -/usr/share/doc/packages/erlang-doc/doc/system/readme.html d0deeefd15be0415567da3084235d310b54720bca83ee5d92605c394ad44c55e 2 -/usr/share/doc/packages/erlang-doc/doc/system/records_macros.html 2fa89d166d394fb6ea269ab0b42e239c8a559df92488f2b327cc20c0d21cb970 2 -/usr/share/doc/packages/erlang-doc/doc/system/ref_man_functions.html ba61e3c4308699592cc9cd3587b4754e9a4f8ff613b136cf9ab5c2f7379ff912 2 -/usr/share/doc/packages/erlang-doc/doc/system/ref_man_processes.html 48c9b509af4c2b1ac48a59c6043e2604f3f4a2a6aa3b6a92701c315afc7e8d1d 2 -/usr/share/doc/packages/erlang-doc/doc/system/ref_man_records.html d3a828d7bae8dacae55eb30c7d924e9eaf42f0ad64f39ac94c3091cdef6ab5d4 2 -/usr/share/doc/packages/erlang-doc/doc/system/reference_manual.html e0040f7e82b759e05b48c5bdb8e8f5cfd1c7031f579718e780dde392c94bee4b 2 -/usr/share/doc/packages/erlang-doc/doc/system/release_handling.html 7a81dd9e168a7d932f0d4841a83ce3d0e534ee14f26acd780a76a81a0e626a33 2 -/usr/share/doc/packages/erlang-doc/doc/system/release_structure.html 9116edb50f9d317a98d2ced6302c65b5c6446b2d8498b19d8561556b37aaee5d 2 -/usr/share/doc/packages/erlang-doc/doc/system/robustness.html a75e571724f1b96e19928e95e01994aa4a79f60577f7ecb69f7d13c8355b06a9 2 -/usr/share/doc/packages/erlang-doc/doc/system/search.html c416d2e19fcbb243ffb0d18e11af1c8fabe04083409ced249f38946e53197a9b 2 -/usr/share/doc/packages/erlang-doc/doc/system/seq_prog.html 13018461c16d8464820b560652a4be9e836e15a5aba46176b24e0a922785e2ac 2 -/usr/share/doc/packages/erlang-doc/doc/system/spec_proc.html 42f4cc377b38848a755b2d50bc9c2501eaa977aa2f34997818b73ed0a32968e4 2 -/usr/share/doc/packages/erlang-doc/doc/system/statem.html e28b1d2d44abe3b6c4581b0c0bdfb3a9e173ee0fe2937e6d7bbbdbc06a628f15 2 -/usr/share/doc/packages/erlang-doc/doc/system/sup_princ.html 45868725a686b20431133aee0795dee1087419adce18c16b129b265b00385ec7 2 -/usr/share/doc/packages/erlang-doc/doc/system/system_limits.html 2b36ece6050b36deb74c2e871cbd694c230960a2de9b216f7a0ffc3ae43feb36 2 -/usr/share/doc/packages/erlang-doc/doc/system/system_principles.html f5d2112a3eafdc63fd235ca462645711b8599e3cff9ce25ccf10920ba06b73cc 2 -/usr/share/doc/packages/erlang-doc/doc/system/tablesdatabases.html 3f0725a38413bff486d861bc9ed86e36306b48d9bc58e973635096a6c3c7bc85 2 -/usr/share/doc/packages/erlang-doc/doc/system/tutorial.html aea4f0bf90c523f5a965bd098c97aff33cb1d8069f2b25a5e684ddbe6ecb94d2 2 -/usr/share/doc/packages/erlang-doc/doc/system/typespec.html 9bba24661058f750d5a03c5fe64f1731eff5d717033f8976ca09bfa723481bc5 2 -/usr/share/doc/packages/erlang-doc/doc/system/upgrade.html 07f7b2b8b0ebbb3f0e765daa62270ac1d6db04d800c056e02314854056380eb0 2 -/usr/share/doc/packages/erlang-doc/doc/system/versions.html 391ea7d80d0442d5a771c1c7ea1e3d4f2b9f38fb31b2aaf114415e35ef12546a 2 -/usr/share/doc/packages/erlang-doc/doc/system_principles.html 58ddf75f0fa45c9fb0412d084ea39e377b28c6f5ed0638dc33aaafd69b2c7ac5 2 -/usr/share/doc/packages/erlang-doc/doc/tftp.html 29c9c1223208c58b4f9edd6784ef8ed058190da020a8cd3947a76e6493e1e820 2 -/usr/share/doc/packages/erlang-doc/doc/tools.html 9b337e6b8309c78947762e0caa53958199d71d10de09f8bbe851c83108e297dc 2 -/usr/share/doc/packages/erlang-doc/doc/tutorial.html 1b0fec7eb8e529006662751318dbcd70e04e8c218a19b152eb62fff92d45f1be 2 -/usr/share/doc/packages/erlang-doc/doc/upcoming_incompatibilities.html ef95de21116bbb3d456e03cf0fa90bf81ea0f2e0b736c41c20c0afd543cc5df1 2 -/usr/share/doc/packages/erlang-doc/doc/wx.html 23c77cae4f357651b158eda7f4799b0744df6b9a7fb45cce7327c44b9f3223e5 2 -/usr/share/doc/packages/erlang-doc/doc/xmerl.html a6be0805d8ab581a0f238621b4f7f9db34f560d7608dc85cbf038e4c8872ab51 2 +/usr/share/doc/packages/erlang-doc/doc/system/install-cross.html 4820b366a70fc8e62519677ef56374bc771c70a21069de47e6416d78a4a0e525 2 +/usr/share/doc/packages/erlang-doc/doc/system/install-win32.html e4bdea0f0c9140c0e3cb925ef43ceecb7e14232aeea8831f70066189e92f6e4d 2 +/usr/share/doc/packages/erlang-doc/doc/system/install.html e363d9b60babfb3d9becfb7ae1a43bdceb48aa0182bcafb873c7bd34356e5518 2 +/usr/share/doc/packages/erlang-doc/doc/system/installation_guide.html 493b4187eb4be840ce35ee9e087dff69510d76c44d747d60d3c8ad1bb95ac09a 2 +/usr/share/doc/packages/erlang-doc/doc/system/list_comprehensions.html 39e946f666e8a1351e623ca0a7d70eabd7f7195f30b0447d4aaf71a5d760b3ec 2 +/usr/share/doc/packages/erlang-doc/doc/system/listhandling.html abd6ca607acb10dfcf6c5f1f3d5f2a5bc2b75e1555419050f1257447b5e376c5 2 +/usr/share/doc/packages/erlang-doc/doc/system/macros.html 0163d86127a160809f887ae1623ac365607b32e967b5e6280d91b537ccf81b2f 2 +/usr/share/doc/packages/erlang-doc/doc/system/maps.html 96591d876e35cb65f122bef019ac961756f712656d817ca62bd155d827265266 2 +/usr/share/doc/packages/erlang-doc/doc/system/memory.html e1c0b0a72ee4e674adffb387af66c7e2dc6b23cbba2fbc043fae162ba8ef7bfa 2 +/usr/share/doc/packages/erlang-doc/doc/system/misc.html b7dc9f670fc98833c65722829416ab7cf1f1eb9a5cdc7cf163a5c2d2fc06c91a 2 +/usr/share/doc/packages/erlang-doc/doc/system/modules.html 3a0d03005ff19e5e603f978a6acfb61afdcbe6085d87cec91ce013ea02bd2f91 2 +/usr/share/doc/packages/erlang-doc/doc/system/nif.html d59f237436cfd2f80e544c07a6a5f36406efdf279cacb15e4a9286ec87c63d62 2 +/usr/share/doc/packages/erlang-doc/doc/system/opaques.html aa6503f42b52773023296179f68c67eed64bda5027fc7388bf9f727fdf064e6e 2 +/usr/share/doc/packages/erlang-doc/doc/system/otp-patch-apply.html cdecf5accd5aa885d1b290e6c2e34aa54c0674f007a0c515fa99dc8a798f9122 2 +/usr/share/doc/packages/erlang-doc/doc/system/overview.html 6773f9d06a2ead91989ac99e2c0ccebc8d0f788b686c0c488f37fcf623e8eb64 2 +/usr/share/doc/packages/erlang-doc/doc/system/patterns.html e5d6d453999f22032ff9f23149eb7b7f1650f124df06ba86fadd9891f45b8dde 2 +/usr/share/doc/packages/erlang-doc/doc/system/ports.html 0ff4b767a3148f1fb8d6561e8779cf7fc5857083be2e3db9c22ad1e08f768af3 2 +/usr/share/doc/packages/erlang-doc/doc/system/profiling.html e4942660edeaaabbfd78972080be6df3a11c35febe1da72d6073422eaf009bc8 2 +/usr/share/doc/packages/erlang-doc/doc/system/prog_ex_records.html 561849e27eb5d9fb8a6098338313b97115b11eef7f67115fe95ffaf646b77214 2 +/usr/share/doc/packages/erlang-doc/doc/system/programming_examples.html 28de4b2be99354d3613fbad3f1dc5542a5d7a7c7176be0c447e2c07f0e3a5fde 2 +/usr/share/doc/packages/erlang-doc/doc/system/readme.html 5549d2874579e023f27b5efb606d593860a942837b7c3d01a4713852f888db24 2 +/usr/share/doc/packages/erlang-doc/doc/system/records_macros.html 2132dae63123c2505a6aa633f4901245a217ed8f6c3f76e1cfd03ba8b0febd2a 2 +/usr/share/doc/packages/erlang-doc/doc/system/ref_man_functions.html d4c3260a84c8895880bf8004c22b349b98851693b78adb26de5951b5499fee03 2 +/usr/share/doc/packages/erlang-doc/doc/system/ref_man_processes.html 56bd35a34602e2eddec88bd87b1d64edc1ad65a71601935a754998e4a7a306c3 2 +/usr/share/doc/packages/erlang-doc/doc/system/ref_man_records.html 45615db1e735d1d72de299e1b127944d3a874f89e8c5334f9442fd0144627e51 2 +/usr/share/doc/packages/erlang-doc/doc/system/reference_manual.html 497e23844eb404e4c49122965ad431c8aa72de881fa96cf3757048edb1e297dc 2 +/usr/share/doc/packages/erlang-doc/doc/system/release_handling.html a6ec53690d7dcef1de351b7b9b5a2a7ad0fcf9e342de1c0538487acf7e6138db 2 +/usr/share/doc/packages/erlang-doc/doc/system/release_structure.html 67b6cb70f7043a28ad8c35d06b3a0a150cc68cb17a72f592f5396f4e79a9c0ff 2 +/usr/share/doc/packages/erlang-doc/doc/system/robustness.html 48e563ad0a809feecee1f0bba5b2c83a6b3ebe39bb12afa05010da5ed04ea049 2 +/usr/share/doc/packages/erlang-doc/doc/system/search.html 68f15ef053aa101b4b31b38a6f4bd3af960cbafbb3e9810a2f5d3816077b80f7 2 +/usr/share/doc/packages/erlang-doc/doc/system/seq_prog.html 5863d40f99c689631df5660becc8187a76842131d2f922c1ca521e8b634ad00a 2 +/usr/share/doc/packages/erlang-doc/doc/system/spec_proc.html 4ed6ca9e8c889cad5739b2881fae1a77faf57bc27909f343c199ec3b4680f536 2 +/usr/share/doc/packages/erlang-doc/doc/system/statem.html 9e9ab99801609f05740c6be12b19e930bb57413a4c00a8e34c127876b11a6331 2 +/usr/share/doc/packages/erlang-doc/doc/system/sup_princ.html 432d4883be7b637c65db432c343f6b14b5fbcf81be961db429ee16926bd42ce5 2 +/usr/share/doc/packages/erlang-doc/doc/system/system_limits.html 4bfe064e15037877874038555535dbbaac87fd0a34173279dafa7bde1ee75a0a 2 +/usr/share/doc/packages/erlang-doc/doc/system/system_principles.html ce5cfb0981f7693133845317a1806a8584d95325eba43cccbcaffaf9072582c0 2 +/usr/share/doc/packages/erlang-doc/doc/system/tablesdatabases.html d67ef25199bccb04dacf68e5b5c70b079c15bf16d078a6e3866365f9b4811414 2 +/usr/share/doc/packages/erlang-doc/doc/system/tutorial.html 83f175ce01707ae5351047325549abc849405f9b01fa916c46cfc5a8b6b81677 2 +/usr/share/doc/packages/erlang-doc/doc/system/typespec.html 418c1a1d64f9b832caf5a121821f83ce0684ed8896f3cf41a5c9c4019b6f3c9c 2 +/usr/share/doc/packages/erlang-doc/doc/system/upgrade.html 3f3179b11e0787efbe86ca05a7b63bca6733c58888332536b4bc2dce496d03c0 2 +/usr/share/doc/packages/erlang-doc/doc/system/versions.html 6d72952be2f21d31e8504c883da09c0ccb568f34aef974439a08c750491ef8cb 2 +/usr/share/doc/packages/erlang-doc/doc/system_principles.html 1e82129aec188aa8a42aa8c024b33fa8d8a369caf716a09ec9ee0776c63c99af 2 +/usr/share/doc/packages/erlang-doc/doc/tftp.html 774c141fc070358a3ae4b5ba70473efb67f9e2136ba057e52ca8d20929ba4634 2 +/usr/share/doc/packages/erlang-doc/doc/tools.html 44897e20b52b32af5777bcdf4c23fafd0f4ac623b3980339f154597758d53849 2 +/usr/share/doc/packages/erlang-doc/doc/tutorial.html 798c19a0315229412dc5bf54e10769c607592eae7b8a32957f4e38f061a0e250 2 +/usr/share/doc/packages/erlang-doc/doc/upcoming_incompatibilities.html 8eb5c875d2b8c952fc947ff2484beb3e3f8bf9ff3079fc56cc570098df749b5c 2 +/usr/share/doc/packages/erlang-doc/doc/wx.html b10d0032466458f65458a582ef7922f48ca404bde29374e6a21cdb24205f5e0f 2 +/usr/share/doc/packages/erlang-doc/doc/xmerl.html f5b0b5fa37c13158e7982205c3efb3343af215f985d57335a31bfa8efff55c86 2 @@ -2520,5 +2520,5 @@ -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/404.html da391990c7b9fde9ed1a52f20b246ac35484ede63be3500fd169d0a04d60a749 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/absform.html b6c9f14e82245edb6fb330cf0b7dc939ea6c4306c400b24090ab15114a758a31 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/alt_disco.html bab203a11e3eccb93fa90a8ace47779190807c055fc30358a03c35e5c34243da 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/alt_dist.html 2ca2ef755bdeb83e855406b215233f8f725c0915ce2f2d79913c81ac53b78bf2 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/api-reference.html 3da1db900a4dce323542570bbbdb438689f0b07593a6f0a6b8496bb428fd5423 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/404.html db309c4d1327a08101b0f6d3e67a2dcdd24bb531e4fc52988a118bcc08526f2a 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/absform.html cd7eb7c516ba6299289c6ab8363df0522d38bee336425002c04a74ef2a09c8d8 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/alt_disco.html 45ef393b364a52e507475f0aa59a2889aec5bb160424d1b3982f43b81f237976 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/alt_dist.html 78a7f91c407e34379feffb33bf2790b382d37d4be28787c75f23c01829c2f200 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/api-reference.html 118d39c7fc83887151dfac558074aa1ea1539059ee65fa47f5c03ffd23155ec9 2 @@ -2540,11 +2540,11 @@ -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/atomics.html 70597dd902aa163072b32d31ab01253a518ca744c6c967b798acee9159c4e31b 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/automaticyieldingofccode.html d8598909d5645bf501f79f198c777e6dead942250f692838d366d6f4451b168f 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/beam_makeops.html 4c345e20699a1389e6bbdaa95a8886295220a04cf4552ec77c066223f03fd1d9 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/beamasm.html 535b1a3dd91b516cdd4572fc80de40ece33f1adaa3336c13a0bd25736f7a2dd3 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/carriermigration.html 14f93ed86594c75836939fc67a4b118cdfcb570702e8a912c8c8a1c0ee6d237d 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/codeloading.html 73f7dd859636d8b94020dcb4ae136ebc2b2bdaf33f47f7cf197faecf600fc52d 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/communication.html 9224944bd57694302894c0d083917761062afc54de3aab54a331c73bdcb5364b 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/counters.html b99598496844cf3845703c5165b3e5604d18f52697c0f59d0f7b24758530895c 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/countinginstructions.html 2c179911d0dc91c4e38c871beec298cb886b564dcad281c1a9de9fdb001072f3 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/crash_dump.html a177342ab8940a0540dc9e5a6bc5c1e083873a72772cdedc71b57a7ab432ce99 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/delayeddealloc.html 180ec058abb08a7a4ef7b6ade14cb7091910684eea8606923f3e73f7ab38a757 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/atomics.html f1bd8b8ec3726571e37edfc3c3add6830bee754dee56e58958edd0b279edc019 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/automaticyieldingofccode.html d52d96ab4779e8de2d6c562e090e0cc8fe1a71d6fad526b4b35913bb38f4a9b2 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/beam_makeops.html 04391ce72d14cf060982511decfc57b782048a3428fbc7d182272f86d4b8db23 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/beamasm.html a080b550f0e8162c1134fff458def6027c44fdd9a30296d14ebd28d27ba12999 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/carriermigration.html 8fe89233a49a05a9d4b41c441bcc80f266634d65b87ee02fe3c011b22bdcfe8b 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/codeloading.html 1cbd5a94054824f852ecbd5cc7fd24e02d6cf3d2cd9d0216f7bd6659837ff0b3 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/communication.html f0110ab9ebba5e310837c6f2717078048aab850e551ebbf9720354e44412c69e 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/counters.html 6e55fed2afa39797d19008181bc0e8d3480528949f04eb75374ee464d4c92344 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/countinginstructions.html 13f7213b1de2b3a0a2aba0192a586b8c898b894d81bf1ad1cda7f8e5a38d86bc 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/crash_dump.html 760dacd97f18db0f5b7bdd0c7567254ba8b1ef88cabe1a94b06f3d45717ed76d 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/delayeddealloc.html 95194d55929c6e190c0a11dade5a5311e442e63d80309aa85f0795526206b095 2 @@ -2571,16 +2571,16 @@ -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/driver.html 66fd21aaa8fc59bd73eb99f59443eef96860d09e366d6cb5faffb131a958c7c9 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/driver_entry.html 8733789f1680638106c79a3dab2d763d400b9b30ce9cb2af2e8c4cc645976867 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/epmd_cmd.html 21045ae3d0352a1795a0d7e537914a0ee032a25656a8220d6fd352951ba16e35 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erl_cmd.html 1dc3805e1aba19ea463ceceeb254f5fff5fec0b43d0b987e0fe7b273df3ab65c 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erl_dist_protocol.html 47c1b0d8c1b6b11b1f0c0146c4443299ac39d35b77dc75d42e6c34f11eafc111 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erl_driver.html 52b991a9878fe047205bf22f79a2101be5aaa1cd6315978b6114ac1d7d82abbe 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erl_ext_dist.html 35f3be19dc7694fd291fa0d52e9cb69229ffc91a9e6cbbcd2adea07949338912 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erl_nif.html 1f83c6fa8a3f771c3ee1f44b05c4f0685f0990541b12317e0bd6164cb137bbc5 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erl_prim_loader.html 55afa67c0b7a87a968e67d0b5a1dfd90272d00bd9a8d76b2b4a33e8a7f1cbc27 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erl_tracer.html 00632941bb340d5c06800f9f9e40ffdb9798cfb69f83d82c3fde613643730da5 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erlang.html eadf798cf5dc5b32c00f0147c7bff281f673e2fac3c6d8e50dc28d6582e5cf06 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erlc_cmd.html e4c3e971f2e4950c771ef6eda519e158d8a657272b32bc4f4c7c4e7408f09f2e 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erlsrv_cmd.html f76028e627e5bacc155791eda215d351d2bc4483bba40d8644dab2107c407788 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erts_alloc.html f6f1aa1a0010e44fdae632ce256f780ecbd566b7b31fcd752b66c92bdffacf74 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/escript_cmd.html 97133c953b6e16fc15a18a5c886e8b3300934ef24c47b0c422dc2379efebed28 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/garbagecollection.html 958f0907579972e69fafcf8cce27ed09205a02bad1d589ddb552148393c0c6b5 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/driver.html 1b0f3c55a05e72b6fd30538c57fdddde16ec4a60dd886e9174e08a27a604152d 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/driver_entry.html b71260c7bb83581b98edf95b540beda0e59e9a9d17e6a177442ae032314eaeed 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/epmd_cmd.html 1948a5cf06ecd3b1dcfa264f45abfd82bd5cf531c021dc99864e62d2405c9f2a 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erl_cmd.html f8b6aeee4aaca4307e1dc41f3ea6624e1d4bc440cc1a16d4ab140b80525c339b 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erl_dist_protocol.html 43fce6f9639a64a40342467492b43241c90c2ee9861385f258942b23267bdacf 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erl_driver.html 7606110b69a5ae83b4546c7b3f19401c6f65d57e6a0243a29954a97604d52052 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erl_ext_dist.html 7404c3d40771276b2a80003a82ceac7fa6dc181830cb2c8190299104f42528ac 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erl_nif.html d35761df63b4e70737bf645f3a4619cc4ec45e3f039f71feab34bf21d2542ea5 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erl_prim_loader.html 5ed6b3e2d63edb491869c2d33f16b6fe15e49e8734a4d8137d023aae4a107b64 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erl_tracer.html 64a47dce68a706fa0c993a776daf00d80858c41993174298bc4c0c8aa3cea60d 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erlang.html 29b6dc6d6bb48c3c182e5429b9a066c033eee291e7584b178f9c1f82ceeac9e5 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erlc_cmd.html 8dce2f56c3f38e0679f6568b45081b0a9d9ebaa3f969de87e1340e669fac6a98 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erlsrv_cmd.html 9821bcbd23a55861b4a117cfea5de5ad77632f0b3701fba4e7ba396c1178bc8b 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erts_alloc.html 379b4a3ea42e4b6a88620271f30ef60897e9cfc9844cb112a59388b966544f81 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/escript_cmd.html 90b0c3d896451c5ac6f50e3555ca50ecb458007e037328378a9dffff20970c77 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/garbagecollection.html 62b60fa301c45159944db4f639219e80240e1c8d62e7afadfefd44fb4d589a8a 2 @@ -2588,20 +2588,20 @@ -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/inet_cfg.html 2be1e259a558dfdc572f2b8ef2ba933e6b8dda0d3d5e65425d4128bcabd385b7 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/init.html 0e8b180ced6ef3efea00d7300e0c224451aafd32b44f53eb9c49cadf455002cd 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/introduction.html 651cc0b1feb2f0e281cc9a72a74a056f3cbe6c319bb16e3687645d7204da363c 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/match_spec.html 1f2abdc0a67b1b1066f19faaa71d40562f673c32852fdebf83b6e23e17c1aa28 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/notes.html 3f1786d2fd782d2eacb138578e313bb03af01bd043d2bb5f8529911de3832feb 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/persistent_term.html be126f570d564ca29d008f86cf59672487f15f7b013ec554f12566af1ce48151 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/portsignals.html dc77ed08cb43ed331ee828f7700e445f5c3db2abcdcad74270a70a1eb8b6551e 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/processmanagementoptimizations.html 3245016a6bfd7140b6a34f892673193928265c83e845d1fb8b1835f8aa5aeece 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/ptables.html ef2b1bd7203ae5a24aeb2b3948e034e7cc224244cb4ff4e4f1d04c59709eb755 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/run_erl_cmd.html 216e8f7f0437e076e907b3f6193b567338880e545de1e474a6299d3094328f9a 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/search.html 93e6b4436a57b6bdc31525b28a30e821c9acc70f5c1d02ee4acf7afc65e2338b 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/start_cmd.html e8fc11fe075650e7a14b5723cdd8f6f8038f7064a2e132df5ec635e9907f40bb 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/start_erl_cmd.html 26e1f9b8a8dc3d1c01bc9c6ef4bb2a7810bec5f0730772749022156651dab51b 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/supercarrier.html c2b26bd086137bb8be6cb2bdb39b4946cec225fe5b450765044426d98fd37f3a 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/threadprogress.html d1edc056b3c975d9dd803b07d88655b84d5ebfdc82c46c3947b37822faf9eb30 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/time_correction.html 791c455e096defc25b4ea3bcb510b6600f4360de7aa3ef92000ebbe5679b2bab 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/tracing.html 261bb3b9abcadf5fdc17860e94694a6a693d50f3051060a9616356deb9643b24 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/tty.html 4d2690945bfb17dd20c6acef9588c265972edbc314ae9235995d1de9b00ba227 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/werl_cmd.html cdec5142950b719189273e212c77f2c6739de6e39770fcde24245b3a4dc338a6 2 -/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/zlib.html 46bdf8fa77c5d5d014c9bb25d99f36ee93cd0b56dbbba73d5c4b4e890487494f 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/inet_cfg.html 140456f1e12defd1a9ac21345ba6b74d35e3550b652ff8810874cfcad33a5c41 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/init.html a521c0acfd752b39401679b1d2aed88c09e7550b1f90ac09f2657570185baf16 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/introduction.html 8b5f946e68c503ba65c0b0841b641266a24d6e4fa5567c7a777ad55f3d5040cd 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/match_spec.html 97863a4e401861582a6135a3aa13572e600b861b9347119aafef70965956677e 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/notes.html a5eb8d09bd95d3d6d19029a24a3c07ec1c2133dcdc7b814f3908a7f99f35fdd7 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/persistent_term.html cafbd26cddda35c083952c31935496fa0f2c504b52cb3ffeba8a6022b70005de 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/portsignals.html 7d16862eef68c02084825adfeb24c3a19be8aa2d1d2b9d7a7dcb63d100a5bfb8 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/processmanagementoptimizations.html 2a0ffe741a3896f40eb07c1a9c2b65d0252328a99a6217683b01537e6733d4ac 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/ptables.html 72e5a14331b7afb878cba2d6f0d6c1944ec01f204b0afb91043bfea63ebac205 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/run_erl_cmd.html 7f6dc3df025eacc757de7268f173ef659042b277ca37a330d60e50c26e2ed90b 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/search.html b77ab15fd8715fc90f32258b466f08065f4d57af99acab874a4e694dd2332fdb 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/start_cmd.html 9eebf5b9d4e225d1a0505a26cf46f3e902061fd918de3c776a201e438bbfcc9f 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/start_erl_cmd.html b3014ab7f1c58a6be15cc4ed8a47fe5b90096cefd0c2e56e53fb453ac2bb6f08 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/supercarrier.html b719baf64c8b3f957e5093727f416cabbac49e99bb1d6e39d88ed0615af8afbd 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/threadprogress.html f6a118ede4a6bf0c3d6c90b47c2283bb18f20e19ada9f7e2325bf04b9c0b03d9 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/time_correction.html 5a9eedd8317652104955a66fe379b8b9a0ba09fb15785acfde840e33197983df 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/tracing.html db8c9939c918260deaca7315592cd8de3d1eddc2f310047bec0326916859690d 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/tty.html 8beaead65c90bb93266b9efeff8fb4ab9a9eb782560858e841c11ae163d798dc 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/werl_cmd.html 8f4cd448a66250ad40361beb573280c6b06d5792ff77adfe5449facbe82df890 2 +/usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/zlib.html 195a0d0d834e856e12e5aff6e00a0f8aebdaa8d164664dac78e272a211f7cc27 2 @@ -2612,8 +2612,8 @@ -/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/404.html 0666f80363b7406ac2829a9805b1fddba6346fe8beeddd76b637b57e7b8e3f31 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/api-reference.html 4e3ea562ea9633e141a64a56de66eb071db41c986e54a3b0c18c30b880499ddc 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/asn1.epub 6b6341c52509cb9acefebf2b0d897cf5af77327f4bac297578e9b00ebaea9847 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/asn1_getting_started.html 40389dca62744c4c64cdf89bca83b115ae30e26d29376022b6f6a301cc111e5d 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/asn1_introduction.html 7b2c04803152345ad6543391f1369977a7d7b23c6f84ab28dbf4ce794dbedd18 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/asn1_overview.html 6b807a81a146878a439d3fc4b9f519e09d686dc30d5b54ecf273df0f6a6a26e8 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/asn1_spec.html b70c67ae7aa1be0d9e32e92d7d0672b5ad88a85f548d04bb9c7a313999ad228e 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/asn1ct.html 280eb06fec437bc30149ba0c14b1431d54f54ab5766bdf335e101ed3b1c7accd 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/404.html 3b4945917ddd02fe74fbd048c9865aac785a1d9d9ff95687861c444a5d54abba 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/api-reference.html 48fac20a452e700ccf8320b8099828752b5f9269a2406536bba9b18c06313312 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/asn1.epub df6869c1a4636c1430cf294647006cec606e731d43933ad6677b2ba84919cc85 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/asn1_getting_started.html baa064db8eef894eb5546e06d12308e95f3ff72ae2d3db679163680da2db13a0 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/asn1_introduction.html 760f1c34ff929c83c9d3f65018db737b2cf74abf5bfbcb90d41ed5ab31b85b4a 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/asn1_overview.html 8e5714b3ddd0741a037e46f1901546b74c7ebc2dbc1802f109d881e4a704c62b 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/asn1_spec.html 9387e3e06122ddbb9968f0b2e3079a5b0584037b8d7b507cdff66878c7485730 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/asn1ct.html 17a4f6dafab08d4dade6d962c10c02d66c50b61b3aefb554a231e6b30e12f954 2 @@ -2643 +2643 @@ -/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/dist/search_data-60252452.js 7558649d86242b3c69235c88670189ab7e6df5caae0f1a5171ab3163798dee68 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/dist/search_data-22628C0D.js 033c3f5bbd88276bb8241171bf2c46a22e0cf0d9c377c8fa3879ab43b0ecd123 2 @@ -2646,2 +2646,2 @@ -/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/notes.html 694880f99480edfea139cca76b3272537fbba63032447613a9c081ef28961cca 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/search.html cccafd9badc8b18dd7692f8aff98bc863577aba1a5630c0824b0a71ad8dc1eeb 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/notes.html addaaedc96c731b00b187c9245d928475fb985863a255fe2bab936fdbdf2fa82 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/search.html f302c9c306f6434ff17c306986b5684ac8160e3a070df279403f84457deb3c7c 2 @@ -2651,2 +2651,2 @@ -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/404.html fd809d88dbc5e8c141409e440a223652bbae5ae78bfbcede3b25fd8b5ef79686 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/api-reference.html 13002f8b33cafd1d3186a079b9bf72b0caf9fde12ab9f52a47cb52dfd5302c60 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/404.html 23703aa41b6d8ea024c029d8dbd90ebf4098a42aa2ffe1f5d8348251b564eee9 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/api-reference.html 24b766517b7154b879eac7410f223fccab3ec75265b5dbc28b9361fae4e9286d 2 @@ -2658,24 +2658,24 @@ -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/basics_chapter.html d867a27284df75c193e8ed797d6bf0b3a3156d7e0dd298a2bcac052a7671302a 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/common_test.epub ff7711579302201a70fe1a19f0b7e3015f1bf2b8aa17092f9f123a51f17e29cf 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/common_test_app.html 47da37c239e2e399907fb8aa7fcb11adb49b86fb11390c7c5631f236086654dc 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/config_file_chapter.html 2c18d36f97ff176e96f89290cc86f7cb27474f845079c786e154608465504a35 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/cover_chapter.html b7b7c51657d5aaeeb928b89a26e859a710f1790d8784080a05089f5990ced875 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct.html 3aba8fb2f86850dcf3d836629e51c22118cd119deab916442e2a2fa261c55b35 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_cover.html 3d518d787b79b58e09ba0ddb1576dfddef95811751fc955672892aa31e300dd6 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_ftp.html 892023a7657837f203392bf545e3ef9fdb2b14972937d2d6e32ee3be465b44dd 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_hooks.html d6c8e30a2c900a0242d2eb53f301cf0e3427171a808dd9a234ca8a6a076f9c07 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_hooks_chapter.html 7f49323463f798ddc6084a157effc7545f302a56f3da5cdec85a19d6d51523f4 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_master.html 69b175b5930c0fd9bb431599146eb8d0eb378b478d99f202ff72275b3222ebfe 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_master_chapter.html 1c4f80b2b1214d50856dc27f5447cac9325ef7bc8ed8aa351de5aafedba44664 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_netconfc.html 93b92204af9f9f8698b889b1badbe5b9259671fea2f5265159c054636a3f45f8 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_property_test.html 2c0dbb5e517ef1f91df87c74ad23a46238170cd1116dd8097778d9a45c9ae03c 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_property_test_chapter.html 18565e4bfb5f1262a5018cbecaa1e01ca2076e3604a42093a13445cc0df04075 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_rpc.html 84042959b718a634b4db06030f8bfe7143c846bfd62315d4e3b1ba3c9c22949c 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_run_cmd.html 0e071887587d58dc1e69a05c1364770f1e0190a853cafe64197f3a1d048b93c9 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_slave.html 56ad7606a12a4a03b4beb15f4b6f74a0eaaf6aecb5a7c1381cba456aa84b5415 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_snmp.html fb3df6e9cceb240eb3f619ec28f5c9e84f9452533d7bd4813e710e1463726b4d 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_ssh.html 4d6b68ce12b1fc478a54748ea22ac463d19f499780dd0a14b711e3a25fcfd93f 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_suite.html 589ed9a10dd2053038cf797bb1559b0dabc514aa0251c1606a1e41f6d59166df 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_telnet.html 795224a466023c4315a7a67268d49fb8fd5d0259850b534f8b6e31347e5ab2b5 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_testspec.html 98ee3f36028dc7e4258239d1dbff2007d899474ba488b35a37f5a33d51cf4bd6 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/dependencies_chapter.html 6f07fb00a061210abe2091c886ba4e8b89b2f2df8c9131793aad881122399fa4 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/basics_chapter.html ce6179af804edb232e390e20fca9cc11769ee33dd7c13bb866f198a837eac2bb 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/common_test.epub 5b160ccc433dbe8358b3b5e6ee9991a88c7eb3fddb9929cef7a37213d4c844e5 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/common_test_app.html 35a76d4b8adca01d4877a4559d7cf45b7e36acfcc404621120399522e613294b 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/config_file_chapter.html ddd1e54353d99d72ca3ea87dbbc01c006bb38232f31f45e133f1243f43fe4192 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/cover_chapter.html aed79fbda86b56ec0fd425c3624878dc50c947b76c3022340b6226b92380544b 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct.html c11cb0b2d9b2a88a38b53c85dab6c9dabdd50ef3979baea8aac4dbdd38c3f8f0 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_cover.html 80502277234b76b0162b6ff68148e5fab4b854b3f3ba7f9506c56650fe585cc9 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_ftp.html e6f08f2c698a15de9821d8c14e0541c651de60aeab9ae89c868c6dbff40c0b18 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_hooks.html 68ed408736da3b8c6b31595fa7e52afd789ad954a15366c9cdaacaab09f562b5 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_hooks_chapter.html 9d56df7ec074ee6e04a2268190edb5d6c92af841978e4581b249670d84173771 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_master.html baa01cf520df980362a6e3c5b24aaaad4d4020f5322f51b4fe4220dcb377371c 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_master_chapter.html aacff12948a7b32ed610b66a30c4c14edd17b65916bde1cbcaf1ac87b81e5092 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_netconfc.html d8cbdcf762920c592d75f875c517a2cdd645b292db75ed07a1e498590ae30763 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_property_test.html f3c7af84b47f80d14f3f6f6433facb2bf7f451ecea6e6723eba952de3b46ad9e 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_property_test_chapter.html f88be6fedef20b986d317086db67e1162c3113ee40d876a33fcfcd6383ae18a6 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_rpc.html 04457b7fc3745cf1f51ceb0a94055e8d6a00080d8438fa6f5b8ec6e3346fecaf 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_run_cmd.html bac6dc97e8935c129024c1c4720830d25d89a164525e6970975552b5493ce2da 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_slave.html e1c7dd5a201472213d860b1c1d14a73e3902320a839931946238a862a44d36ea 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_snmp.html 56578ef464b4b179b0ae9edb1f5742922c6c8ec14e042eeffb5b35b7d7235902 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_ssh.html b91021239cff3c6396e9d6d6bcea704f93e04e9ad0d04aee03fc352e7892dea7 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_suite.html 1384895f77ee8a306dc13e5f7d6261ee357f1aae6c84ea91c1cd9b0eab9c8063 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_telnet.html c297864b47deb8df9c8d9b862bd20589e5f04c50938ab80233bf2263ecd29552 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_testspec.html 8b3339e70ac1bfff8a0fbc4ed7a82187d4601ed3ef92219bc93d41125344bc90 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/dependencies_chapter.html 8a5e0f13d35f597beaab4333074472c42fca811b1084f9eb1fcfdc5af44a6da5 2 @@ -2702,3 +2702,3 @@ -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/event_handler_chapter.html 17957c04afd19b1b4f12ee14125fbe0f6cd4d8d69b931d3f3815d9a92c2d1666 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/example_chapter.html f5dabb3ee4357501b778f58660134e84cbe96839ed8ccae1894c774c0a340409 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/getting_started_chapter.html f09a4f60534ed2344b0a4ebe6376094e5d7f3b4973d3f8fe264c08b78485898e 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/event_handler_chapter.html dd77a3559400c6baa220d188bab24b5d5bd174188e18af98642af482cd6eda10 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/example_chapter.html 3331119f09fa60c973d683ed4f960a86372a53fbbb6b2016f9d73e1f090527d6 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/getting_started_chapter.html 4e5571952dc0a2e71586f1862287f91e867709f4e40885242a087986783af61f 2 @@ -2706,9 +2706,9 @@ -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/install_chapter.html e44aabfe89c37e57cb19070c52ef356766fb993e268a227fc5c818edb50a437a 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/introduction.html 5b23c8b8256ff572ffe5ffb532f3e43ea8c91c89c2c18d01a78128d48a6491d0 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/notes.html 6e21ed2611c93b9f9f3f1f30f3f521cdfa322c132c487b4363a997196e1e88c3 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/run_test_chapter.html 2bbc49101e0b01bed760b66affde3053b4f8d8d28d6f4e0e7dbf6c49eb4c3d02 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/search.html 496e40c080ad3e69a24aed7b4a12fd7ab2c3235c47db7de46b2ba08591e22ad4 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/test_structure_chapter.html 81fd186e8c7bd33d6268532a4d8557d64d3060c9857529e906a044ed52baf191 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/unix_telnet.html 1e8e50a00a6d89f0ffdba3068e658300fb50e4c85f84ae6e56e783b3c872635d 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/why_test_chapter.html 55162457b48be8eaf46757a1410158771575617908e6c906a163cd5539e9d8d4 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/write_test_chapter.html db58f3119c79a89d6b79f4b29f8f8daa156fdb404d8da2fed717b0ce0c169503 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/install_chapter.html 28afe777bc7363416447c547b0f888510963ba127af2b2259eac57cbf376ea7f 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/introduction.html fb600fa15e366fa0d92f3a4e9009da9ad12bf979204d8169ad5257012bfcca5e 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/notes.html 3157ff6f879125589867aaa7c0bf6c74d1d59c9b985c70cf01523936e1536cc2 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/run_test_chapter.html eee3cf343e68ce710114e14eb94fb64690f5eef40973d32215179ee7e32b27fb 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/search.html c2094174513a3df069b81ffafe368277ef85634622db1c04f7ba83b2c0a76bec 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/test_structure_chapter.html f40045c38754a21e1a43f86463ee820e841fb305ac54f0a1ed847fda5ba4c6f2 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/unix_telnet.html 18046bd74b5515c8402493f2af2919d6aac65b547f09d20e29f5c31fe00595ce 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/why_test_chapter.html 7cc8d504495bcb22decc6d1a0575e934568d3d474da4358ea82907dee64774f3 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/write_test_chapter.html 29abfbd6b0b53fd7e132a6cd9d14f9cea332176e20845daa61a093e112b9a8e5 2 @@ -2718,2 +2718,2 @@ -/usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/404.html c1834f0aac964e8e269515108b8924eddfa2aef18b50b9df0b1cbe82cc60f9da 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/api-reference.html a697d7bcc1e5e008fc0e6229ed1026aedad2ef0ca81dbb165caf9d7204673fdd 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/404.html 70792f07ad74159fee859914c22d631f0258d368cc1291fe2f512c3f11bf8ee6 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/api-reference.html d5887a56c2d05ee1b5d4b8d09ba98c3e3b7a430d751c58d2d9fb22ad0eef61a7 2 @@ -2722,6 +2722,6 @@ -/usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/beam_ssa.html 6602de37d9be9b9df6fb9d33efb80a95f82a08ce0fb09b7a89c52f5b1c11629f 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/cerl.html fa6bd9022cd4e0c652d9890e7ec386e34eaa0ab3f33f89912fd142a467d67e00 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/cerl_clauses.html c79e1d4b7077692cbd709e2ba6a6fffc5068a9267511a435f85e1935a63ff750 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/cerl_trees.html 2fb144bdd004a0f18b9ac55c86689fb8581267338ca1ef320b3f2434cd218044 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/compile.html af6b7f17cdac325c4582ae7431999a2d21263162307c7827940da557ac06cd0d 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/compiler.epub ef4b1473746c00be6606264fa7daf2178daa8fd2ae7c22d994315b0a898805a8 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/beam_ssa.html 3012c4704d9c8a4db5aaa2e49cf400ca2211974a14f98245b53056d1e16ebaea 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/cerl.html bf90a8a689ee6aa4ebd055641a98c06cdadc07d68b2f60fb53b7db51e93c7884 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/cerl_clauses.html 057221bd119b19ac172c845d4f0be56744caac3ce70499a48830c2d6a6181429 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/cerl_trees.html face2aec57a79b541989587c1fd475d4f59399b52c3fb176d387911be80f5636 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/compile.html 6c53c17a220cecebb63ef2edb46722779a99e42383cf58261f8d1173598ba4b0 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/compiler.epub d4f3090640f48639cf4ade24120790084f5e5f71ab4e70dc15d4e275e15a42dc 2 @@ -2749,3 +2749,3 @@ -/usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/notes.html 5ed23e3c8f7257418d2761f315e57664e113b8aa70a0c1cdde41df5090be91f4 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/search.html 3f93686468ea3add4de011f112cf488411088e704ed3d77bd021ec0618e10064 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/ssa_checks.html 99ccf9cab5ebea6bb52e1dcb282b61b90fe736e2381dd2e9f985563d972c1678 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/notes.html c06d58fd4bf481816f7f6059a76033fef1c5845d2acb3622852cb06a441a6a52 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/search.html 54dd82df47c5a417cc40e18e0671ef7df65fffc4354ba67b377ef932959ae3fd 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/ssa_checks.html 27e36cf4578e09ed45969c52b2a58d6a55b5d94ea2bd572f59c062d54512e897 2 @@ -2755,3 +2755,3 @@ -/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/404.html 59416c2aebc716fe356d903fce44228bf4281bde77865a6049da9a880c682efb 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/algorithm_details.html 914bb575369028750189916bd188646080f9c996f8d5ce621d99ef8dea8d921f 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/api-reference.html 30b301c43cbd09a2645ddcce4b0bcfee0c914c0330b4f0e696f071dc714b1509 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/404.html 5c29237069f59cfe6877238f82034f05d8f3692f2e816ca754ac21201cdef1df 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/algorithm_details.html 361dae76651f4d72b14eab85453113e22bbab9997deec6b07f0359f9efab51d7 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/api-reference.html 947c7786996f1ee33baf3918aeb27667bac9207019f50386fae49a87d057b7a2 2 @@ -2760,3 +2760,3 @@ -/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/crypto.epub 9b38420469a2038046f1656e7905e6251db5c0545592938af7aa3bac0abb61fb 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/crypto.html 6d1fe8304663a9e4b048d7c37388a22fe25512b8fc32e971a8a671d1ecb453c5 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/crypto_app.html a078567e3cd2f9d7bff68b9f4d37d0129568449de057be3ac4e546928bfbce16 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/crypto.epub 2170d42eb23feaa16746e00527b8e3adf8324fd47f374304fee3c1124ab329c8 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/crypto.html b93917e70173fd878f5c4fd92ec4dc9f59d60819ff693c53f3555beddba4a5bf 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/crypto_app.html 76ed8d8c962f0bb73be02b7fb899ed50758b0c42390d97847d5d9a1d92159a34 2 @@ -2783,3 +2783,3 @@ -/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/engine_keys.html f0e0d1c211e10a596d7f50111e2fa2a402104635fc1ba64044c598923a20ef30 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/engine_load.html 9d2004dd05e7f353306924688a4534dfa443687f689dec0d2f2f002b0d38d945 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/fips.html d97339d5285ce79e74f46c17d8c6b45e3095cf69683056c5ec6d7bdf4c675757 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/engine_keys.html 5007c3ca97c6d29aeda846bc42b61a464252a6f7df4a0ffdab5e091fe80dc6c6 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/engine_load.html e97d5892b1a5b588f988085129de9ed95dd392253ee3d592dd81b9ceaa064df8 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/fips.html 6588f3d8bf6f001a91c1274bf32c7bad82c6bd9ba968640e2e8e098e2888c280 2 @@ -2787,4 +2787,4 @@ -/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/licenses.html 1c3e3ece865aacbe1edd8e6b38e77b561baa5fc25039db0981b6e6f54c250593 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/new_api.html d3e8217e2a0e4c53ee5bb52997381231c32e251ce843ac2a0380e936a0081812 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/notes.html b9e6026ba428fcbadf4a9c9fb377cf6df57570003abc8f755c112e8cac578d57 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/search.html d3083bd347eb91daf7844bc5c918b92944022ea720a92881f70af827ce1a06c6 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/licenses.html 38defff4becd66a6c9851126febed98ca6f81996216dfd0b0b3f7155d08ec594 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/new_api.html 916da78961741682217a81e5b7bacbb4c9b860edd8b3a0c58c0b05c39ed13a35 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/notes.html 2ee04a88dbaded384ca435c7b0276bb8aeafba24893d5aee25cc09b66e04eddb 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/search.html b06e5d4a187d764ae128b565f5e1a97c49d8d59fff8038dfe95127756d4c8eac 2 @@ -2794,2 +2794,2 @@ -/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/404.html 0cdd4ae86fa5519a959a700171f6dbf092c1fa48a390a29b264d20a0ecdfda56 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/api-reference.html 526e24aabfe5fe52755b1f116ecb5b553400ae303947f2fa3c0212ea87932cf7 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/404.html 91fa2539c548163fdf240ce314ce008f961fddf26ee8614d7077d34577d82379 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/api-reference.html 22d82d122fd7c865becb83a0ee457671afeaa62d4745233b84fc5e6aadc86ad1 2 @@ -2805,3 +2805,3 @@ -/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.epub 933634030e6a2683a06ad89838c1b418d317a98ad2e093a64def1236898cebb5 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.html 5315dc987464f3e2652a4b86f83bfe93d4f9e0c14c5d2a7ad05b9ad7ee87fec8 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger_chapter.html 4bc055757365ddf6bf68a09a1c17ab91175b7bc2e12eaea4dff60cad93c538b0 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.epub 0381d341b059e4b5e072d88a2194f2662ab45a58fcd897db3ae98466dd6597de 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.html 855c7936f060e8eea88dfc06685a3f1862905cbc4391befba05632183a6314ad 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger_chapter.html 3a310621a4ae6c1b5cf037952e746af651d47a851d4aefc8931053f87b76e398 2 @@ -2828 +2828 @@ -/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/i.html 06319b9a0b87e92225871040c384c9cdf45fe0f2dd3a927b4e9a18ba9f4fecce 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/i.html f96094ea1f73f3bf97b890ee062df1cfeb006356aea6246db717f032ad8a674f 2 @@ -2830,4 +2830,4 @@ -/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/int.html ca6226c504f968e7218e0c8e9974f143446d3fb9a7c5e6602e7a219407b29eb4 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/introduction.html bfc3eaecef80dfb39538ba45a19188a71c9f3b5796ebb94a960739b71294bb00 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/notes.html e989e7b9123ab54932052fcf31dcad93ca49c9bec7bff2cb2ecbb620978086d0 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/search.html 9d479146a97e9b6e4de0275eb05e3fce0a5167041706329afa1998f8c2988572 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/int.html b6cbc567d3cc421cecbd1c22ccb9889e865c28a104a75e0cc1d29cc95c1cc336 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/introduction.html c86fe99123a459f4c46e0ef318cc79ecaa43432c5290a7926e11c2c289a6aacd 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/notes.html 934b371561765a60ae03b94db6f1cc463a54f6002285b47dc04fcb12f68d4ee0 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/search.html 379bc26de4c66070d5599a3abb1ed6a45bc23111327ce5e915ca9e4e6f381e97 2 @@ -2837,2 +2837,2 @@ -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/404.html a2e7818a7d206323511fadc19e7b7e079161d1d1a011ae8037c8b6708a894441 2 -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/api-reference.html c1f7317e0f07b94c82cdf1666bd1737949b7cb892f6d0854dc835d5e3cd006ef 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/404.html 74c181e891af65efd060eaeee7c1841c445ac58fc3721e52299376d6abca0f7b 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/api-reference.html 892c31cc4ab03f1eb4e14e4f9057b1b55fa77272d3dcd74bf53fc4b8085e4853 2 @@ -2841,3 +2841,3 @@ -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer.epub bd1f147ff41671d825c550334d04550ce98a0c363a1b20c8db8f44859eed92b8 2 -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer.html eefc185a10f0bef859e2d7b48f5723288c919ac31e589bc67a985a0ff405b12a 2 -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer_chapter.html 2a7bc19bce782d6f8319e9b30bb9bcb8ce024bc5a9626b050bc5fab0f8bea296 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer.epub bfb47d4896635a75a9521bb3432397777f7d0dbd87e3acea99269c8b705376de 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer.html 5010632f1e2f3290b81a2758c885940e68d1e14c354cc12cba455e5ec7c0fae8 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer_chapter.html d9f173b3db58f2a1e015d2a72d18bbd688ed8bba7d1177b1f46d7bebc6107eff 2 @@ -2865,3 +2865,3 @@ -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/notes.html dfe662c980f831baa103f7c860c4a4976170a7a40c3c712d016ffde8a0817b5c 2 -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/search.html 42ffa677c95dfec7ac35b8d4368c5548dbd0bd20264bd64b5d77b03d0401875a 2 -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/typer_cmd.html 103e2764582fb493ff9757f572bc37baf478111f7d0f91b6d37a931036141fc7 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/notes.html 4cbab5542f20f1f94fb8814c53f68c1682105454a2e9f8a88913c5e7bcdd0750 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/search.html 4532bec4001a9d98dee0ef2a7b0a7ca08eb33a1500948dca03d74b10e781f302 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/typer_cmd.html eb61a561bc27975c36de69d83a49498e586ccce2e5d62349ccb1669b327d4c11 2 @@ -2871,2 +2871,2 @@ -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/404.html 933dc521f4f20174375d3235fa470c641806bbdd41903d2c70590332450977f3 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/api-reference.html d2a1f9600095729901c2353f0ba84adb5bbb4c08d798cff7dcad9e5b01b241ef 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/404.html 9c9584997bd65fe38c64ba83f9fe85cd05a7a081176379ca42eff8ef590c3ecd 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/api-reference.html fd4d4ee214783e7f52c78ca68f5395eb34361db76d3a30122bd5e47226fd0453 2 @@ -2875,15 +2875,15 @@ -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.epub 4734ad5c0823b6e5693062115d5a43c6957676f737ae4bf28394118749099e70 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.html 87bdd009887a59d4b7d4ccc56c4ab7f1c5811e8e68c6094912775968417f8218 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_app.html cdc24c1125d651fa28ea6e4fc9ce20fc440de27b8132d9de94abaafa146b0315 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_codec.html 44ced2f2db848ee6948121fe17292b7914cb0d92b2fa26b787f1e01ec4090514 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_dict.html 29fb2484beb06c8bc3ac8ab1611f1547769e74c9f266d9b811fb214ba639396f 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_examples.html c3f35666c8c237c73c48fc175d7cfb9b51d23b5cb7ae8f13d6e3fea187e0cc48 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_intro.html 3738fe8acda70c11f219312185132a895f7de9494b22435c954711511372a0bb 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_make.html 7b938ddc10c12ea775ab7a4f3c75db15d4d6fa42cbd4f370bddef5a96950df0e 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_sctp.html d7201382ac797cf112f7fb889e175dec44f69dca2d454f491dd6c6d291fd29d4 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_service.html 452ee9e774cbf9133789e1655b6790006997b53eca2e5d19f0e11254021440db 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_soc.html 8b367d70e762dbf5004425b37f17d796894f7928e68ba72245cb43fb340c3580 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_tcp.html a4ffa0f60c27b19052a2a188ff9c2d57731fbfbedcf1a62e920d62212da1052c 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_transport.html 001922ab2285978c805d175b4921d64f3cc0907ac117dc8648ada260ba91e287 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_using.html c13b859387ebe680f7f606f91604681fbc34f1bc1b6fd64d16c9cd61f666f44b 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameterc_cmd.html be6c6d5a1b2fc41ee2f08b8135957b08bb00f55cf94977edf8213d2424005133 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.epub 4521e7bf530ebf3eca312e8416c0694f9c1b823810429ca84e3fdb199bb5805e 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.html 914ebaa257c2c49ee6d81a308bc1f125181172555ec1d4a6e7a81e8748b6ca94 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_app.html 7dfb7f42564029e57a3dc7f39dee0c7d8f392cb1a74294ef0a5445d40aa65672 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_codec.html 6f34e34b9573ec75a6ed577e4da2130ee75145cf36261fc44e72a717856ec7a3 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_dict.html 61c6dd8e59bc9010bb22a6d67392b66a0633c689e0ec1edd29253b268c219ae2 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_examples.html 3ebc8d3873a543e084e782276e653bfc78db31bd2b73fcd8f1a37adbf5c7cf31 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_intro.html 7a8e545006501d3093895700a550df65f676533a7fe31715989b6b199f8f8d4a 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_make.html f7fd466beadf1579a816f45a70fa868d20a6c25a05546d997b72e9b2e0e946a2 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_sctp.html 1a892b4adc6d5a089ff1583452f6fd2b43d396cba51b759bb30c6280ee83a413 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_service.html 869e394f96b3f6109cb26db302706cf671d9a106487d89591cd5686da5741626 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_soc.html bfc467442b61bc7255a6e8a48e46e4ed82a07f776cfe18fa33e580f7dcc0d6af 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_tcp.html 4603511e7e51549a1da44f5b605a73ced069b408dd816cbca3725ffa89df5452 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_transport.html aac215169a616facd1d99ec30e067432e169a1b844f368393e66f17eb139b793 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_using.html 6e15a28f779b21bb65d9ed47d07a524e4c6f7db781e5b05a0c1f46d1d366ddc7 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameterc_cmd.html dc10af335c48d97cdadb270d498c69596aad57fc8dea054fbe6395b454f6c421 2 @@ -2911,2 +2911,2 @@ -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/notes.html ca8c993d32b7dc955c8265b3b4653aa213a4221f1a003dd83cfb98f01dabdb1d 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/search.html 0b8800fc893e14f2e95ee79e60c636d4611861079eb43310cdb0734e1fb51ab0 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/notes.html 297dd80d3cfc7066fecab944155b8c638f07ecf3deb28da3196c1232c3e294f9 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/search.html 3a4708b6b1f320c6e593568c9329800b2846de24e6a672e13a5dfc80b6988109 2 @@ -2920,2 +2920,2 @@ -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/404.html 64057b6946d4aa51f2d44bf68b82aafdae9af36929c441d9eac7b2625c6ddd8e 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/api-reference.html 1cd113373ee407b6875a6bf24a9fafeceabd2967ba33042ce0c7731c145b6e4b 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/404.html b8abe6515edae5875dd732fe366856e8bd29399ff1ac030accb235a00fc62acd 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/api-reference.html 4343988457b728cdb0c247d03a9ea7510f5eb57e635d711d105699c803d45b19 2 @@ -2926 +2926 @@ -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/chapter.html c7fb89820854c6f8ca186c121c9f9d8149660662733462c8612e6d472c99fe1c 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/chapter.html d8d3bbabb7936ce2f5839e4df13e3dbe44aff3fa004d243a3171552635a3daf8 2 @@ -2947,12 +2947,12 @@ -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/doc_storage.html b735f3c7c063ba0e12e87342df826467d5f208e0c6f77dc7e531e9af46255783 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc.html 12c0a8331b211933f0ba9d50b0941164949859aed0cf282d754518c1d44654d2 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_cmd.html ed320d34ca4ef50bbe93408bf839621d4c035ba0558e14e750ced327d4dbc96c 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_doclet.html e5e7e2092e428cc6f6c64ee0263d016e87b2e30f02e369d3495706569b84a643 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_doclet_chunks.html 199a1669716fe7f35ea7a2b482da26f4b86d016c00d12da9b70fe8147c139632 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_doclet_markdown.html 0bad44022c51ceb989a91869e1cbdc0a3e64bd95f31fec7d91e97b56f866c471 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_extract.html 3afa675fb2ed423118d899ed0750abab1aa5605c077f593d48a641a095a7b9b3 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_html_to_markdown.html 29629e0b08e3a36745608f887a2bb704aa233746933be36bdc800f5116581078 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_layout.html 001f638cbd0bdf76504a7aa7ef1785ae3a2d71131f93f9fa740aaf7b380bff4a 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_layout_chunks.html d4c9505719c0d05071ff57e57fa95e77dbe166d26f62d8b520e7fe28e9c45aed 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_lib.html 19b5e8b1a0f95345f61d0c5d350a03b5a42e2cc7eb99e7e527b8e96f5ad12218 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_run.html 081519877285a1aa7282ead8623e5d09707a9a3e59de255855073c3dfa537244 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/doc_storage.html ff54bc7588bdf02ee4065f676c92b705ae2b775a78d687057dbac4e976ee0428 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc.html b570070c77c3e2e72ae9fd6e2727a10c7980e039c859998a8b3c9fe49856ab1b 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_cmd.html 77656e89305f4397e6a786ec616deb27e7b362f386fe377252d0ce7dc5b50106 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_doclet.html fcd02125dd09e0d6d4c3c92f4e9fa69aceab9c68f25665f0ae85c793865cddcc 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_doclet_chunks.html 2c41123500d2d0990f05c6bdfa12c5e8d90067ddd46b25ae3d20c9124f78e9f6 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_doclet_markdown.html 28d90ef96c5f6a81ffc8040ba598a60c97e941c2a7119ee01f03004e863d4b5c 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_extract.html 6b769002724510623978150f2167474db408cbfefe63f6e566ee58772e0a78ed 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_html_to_markdown.html 468d074dc4e54fbde2a84f569be878b8b0b509caee9e0e3bdc4a4e6cc1974e3c 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_layout.html 305f710d9a278f313782347c862242b37316c8805fb700f76c4f463b2f40ebed 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_layout_chunks.html e99ba3e05dc9668665c0a47a5c9d49211794f3f142a2d8c1f7c98a7041c1317d 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_lib.html 7aadd6fba16b4ea117d767c9f88adac546a414ec3c9321738beda25fc5823a5a 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_run.html 211b6ea0c5cbf3b88f75fc0ce1df13444e113451746482e042eaeb3008f5b164 2 @@ -2960,2 +2960,2 @@ -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/notes.html 0f72c89066034cd8b16df3980118c67258d66a0635802bf413ebed25f10753b5 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/search.html 966b6c3266a656b1a03763914cdfcbeefb420c0d03c2cceb61e61234c344e4d3 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/notes.html 97b6b23181932c3d2bff3ba4feaac456a70bba6f3c5409955d1a6c10bb07f8ef 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/search.html abd3f6dee23cc27a01c06a40cba4e5e2853464e86ffb9353b036c58e6234383b 2 @@ -2965,2 +2965,2 @@ -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/404.html eed6283eb56568cd496ea4359fad5044834ca2df59002d655433d6b79c63f06c 2 -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/api-reference.html b56bf005405303ab65f69c6bfb02f0fab5eafe078219443ff0e4c400a1effaa3 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/404.html f7b751c28aeaee6f11842073e355adab0174b157fe57376917d1867aa9a09ae8 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/api-reference.html cdccba6dd52ea1323701061c1ff1cc892e5ed389adbe51c395343cdc14ba8da6 2 @@ -2989,2 +2989,2 @@ -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/eldap.epub 0803be70507276d4b9ecf1363e8dd07bf034251ef2ea7f7d6e0ee7ce03aa99ee 2 -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/eldap.html 798024ed00ecda417c81a17d2d2c3623f0ef5dbbc5d696e72fb8d213e23c326e 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/eldap.epub e4757a9e213a081f451e831d6a5fb2920c17e6fddb0001bbe5d5f0f3530f3a37 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/eldap.html f1d21ea692fe0c54b045346faa009feeaad46cf972ab5882fe6c88e68cb19713 2 @@ -2992,2 +2992,2 @@ -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/notes.html 3f38a8cb7ba88a6cc8987c58aa92e3263fdd6ca901f4083ce21470264cdbaeb5 2 -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/search.html 82ac44b5bd4383abd90eedbeeea29d5e7ae209ea193551ec1b200471d3f10a51 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/notes.html cb837afdfa74a1572f4d170753fb7a169b4434b0fe46e6c1bf9b928af2049ef4 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/search.html 3da5496bc1feb0d9744d83ed581da140ae11dffd8bf04a9f0d9a66affe7e5deb 2 @@ -2997 +2997 @@ -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/404.html 578368c59349ddb01b138612ca7ba7fb29a23618dff498b5a3e29782a395ba70 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/404.html 4616a7dd7e70115131c5b0844274abbb329ee2542864340d50f37fe9aeb58355 2 @@ -3020,6 +3020,6 @@ -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei.html 1be53c18a2db80de54d4df5a92285e435fcf5e87a25d35828f33989a8cb1b096 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei_connect.html da9c743570dafe0f7ca4124ab2a18a274cfca532949432ad12f980a527ef11b5 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei_global.html 37c2df35618b371d52cc48c53281cbc530616dd19c71d81f62e7f18f9d922388 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei_users_guide.html 01efb0310da393bc7e41b18af0f4afc8c87fe815a859b1feca73a323ed91ec47 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/erl_call_cmd.html 8ae335c314e7004caded1252fdef40928d9024b370f756fcfb1cbd35e06d8cb9 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/erl_interface.epub 0f0f9ea2e00f740c174bf05b3f189de9ddcf52414599ef871e39a6644b3c56b9 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei.html 6d01d9e30d03d49db82cfd1f50b7664987a8867b0ed6659a53acdd39e17f1aeb 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei_connect.html ac6b0c095871ade83d3227995d9670c1a51e4f2771d98b9d1bfa6066a609ef23 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei_global.html f2964ddcca38c82e53c9166631ba52b9a7df0fa38fbbd9d63e9b0eb657a930eb 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei_users_guide.html c06849b052938f32f009529d24b9c848cd38439ca54160e5e9d89e3fffc96439 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/erl_call_cmd.html 5a059f66d4eaa1c9776afa609e06e401b8e136092216a4bff8d2eb3e5b17d55a 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/erl_interface.epub d7c73cf669d84e7fbfeaf7c520b8c3c049537804feadfcdba034bb1e02aadb50 2 @@ -3027,2 +3027,2 @@ -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/notes.html e28f3288a7f12d198f028c9b987c97075a4851ac96d898740892703ba5c3e68b 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/search.html 406886beb04b0ee8ad6f671655bb291a34ca3cbebf4ebe8ada776e4d7f877bc4 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/notes.html fed69869dadf79a93a23d8953e8db0ab9efc31d7ad68aad23eb01bdf8f1edf9a 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/search.html 2494b55f3c248b3efc34d1d2c9b038fdfad5a4880fe67ef9eeeaf2bb998e4b6b 2 @@ -3032,2 +3032,2 @@ -/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/404.html 8e0196fec1a78b2c56af7d2408fa1852d46980a6d27aa2192fe42f16e1a41e68 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/api-reference.html c11520c37c6500e0c855b8f7110eb4639ba15053571d51309bd877eb5a7544db 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/404.html 8836265a7aa32eca99d62954c543aaf55ef72bf7811f375848c5273cc27bc7f7 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/api-reference.html 05dfaf37ceb864db4723df2ca095444eb96368446dc15fc52bf46a25f90a5022 2 @@ -3067,9 +3067,9 @@ -/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et.epub ef788e32e09ab38d6dc17b6593597cb2237432d2e1912717dfee5132597c0de2 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et.html a74abe7cba56b34ac7b0685e1071e52f0f52c9ebd13af97c55fafab0ebb1d443 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_collector.html dc816c7ddc481a1ec9cef5fc7b16220f01503d276dfef7845ceec8957bc737e2 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_desc.html a0defdd57557f9dd0290ed0ccf9023a9ea284322e2a0fe446c0ff5a3dcb18540 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_examples.html 0d677b58c0eb05f5086f1af2d3d94afddb22db67f8e623bfaa2b14f22635e3e4 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_intro.html 20990ecc933fc73bd9f2d1ee10367a538b5ce8155644893371e0193251460325 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_selector.html 65aecc9f0b1f2403f41d072047e2f86253b831e92ea061bc21aa7a8b9ca6acab 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_tutorial.html a750dcc749febdf6dd3b7233f62211afa5b4f9b585f02eb6b9aef8fab2794e3b 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_viewer.html f2703451700c109fae38f962ef2a9530b96921534456f4e84a3d18af10bb5ed9 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et.epub 6048498a594ec43dcb848ad9da55cc0f703c5a42fa25d3222372f49e79431588 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et.html 59edbf33382556999320fe941159f8a9796c04c17ad0bfe793dbdd8620b3be35 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_collector.html a68575494c137fe94d8af27ae1ec4fecf97ccdf7f8bc0f7e14609ba727738613 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_desc.html cddfd140a77b14b036f659acc98efae8f837b18b184affbddd0059c1b162ffd3 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_examples.html 740f582050ae0ede1444032e1ef6c00c9c0c2a5bd6bdb8bd8f97673eb466223a 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_intro.html 4ca092f35c295fd47de12b1f7508c807e17cec460af7f4566fca0502935a3e0a 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_selector.html d78a3ccce5f611c168a95e6c350d448d5bed96009d0db31ab68701477ad95ca2 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_tutorial.html af7a7a338cc8af11600ff82a23a53d5094b9c3492c21613c99934b389502edb8 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_viewer.html 3565018cc14a49db576b4171feffe1a4373e619d40dccd31e921aea498297c69 2 @@ -3077,2 +3077,2 @@ -/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/notes.html 3efb6d64a540b4165f96dc87a16b5127a085bfc408fd7ae9161acaa8fedf1452 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/search.html 6ca73063a4113632e8e0e52f5b4fa92298e65c9a1d90d74ad1c8d097cb942b9a 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/notes.html c6c742bb6901caf4f2128a29c0eb1058bc982d709d6c4f2d3e36b6199eb1b834 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/search.html c98cc765e40f5a7731bb36110ec81b0f956f6732d52be84323044284742585b7 2 @@ -3082,2 +3082,2 @@ -/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/404.html c45f358b5dba1c89b5900c3f98727ab4a9ebe49d36e6fe31ed37014db73514eb 2 -/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/api-reference.html efd13872376aa5b842eb9d310051109d7ad2114136d8c2419c86757ecd931f13 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/404.html cba9a31f076a340690db1c22abae9c49f5c8bec2b3ed64e4d5ddff942e048d69 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/api-reference.html 97d376516e8adc52d9fd61c6d1962dd62c2264865ca4800d447c90e6a30bf86c 2 @@ -3086 +3086 @@ -/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/chapter.html 282a0331da2ed403a66f398517cb86f8b7940098e99e9493278d06e9e40b4a13 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/chapter.html ee73fd2334c8a1b290d3e2f624aa19787949a31a12a639272d54651d4783c59c 2 @@ -3107,3 +3107,3 @@ -/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/eunit.epub 1134bc539923376eb6ec82c60a7843a42a012374c7b4fb528b4b8c24bc3f4ce9 2 -/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/eunit.html e6a27ce1b33ce111bfd5b88da251af124d9e53b988f0f0d5909b2c025cf68899 2 -/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/eunit_surefire.html 171de602cfe3fe98c595532257651f31fc4f9b7dfa6f4aa2871fcafd17a6754d 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/eunit.epub 3c8f4425d1d52bc5af2171a99f6d27c7070c742492eda5b0a6e539fd32dcdaff 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/eunit.html 1c2cd9430033177e128843f8c7cc7c6c6df4a32e0a7cdee0c65d48d0ad00c058 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/eunit_surefire.html 1ec6c2a26a8be7944869f5aab59ae4d22ea38bbaf644f63deb583b2abbc6f635 2 @@ -3111,2 +3111,2 @@ -/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/notes.html f5350deadf8b2612e597c193498603862e2aeb6eb960ae35da51a474b47d5092 2 -/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/search.html c4314cc8e09e04159f6414076b0982e7810a2346f6925c61ad1f0379e8b3ced6 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/notes.html 7897a51746c92ab655e9693dd725ac8a1eea8e43b47d0344764c01ffab74c9a8 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/search.html 3c45dde268e5a9e8b536b5a64d8ee0d3895f78bdfd41884d22cf4375bc26c731 2 @@ -3116,2 +3116,2 @@ -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/404.html 9fa5b0e281673b76f3edc6cff1c2b01bcdfddca4931194c7185db90fb3c54df1 2 -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/api-reference.html 2d9b5bfcfadc18177037dc667ab1b122dcd637e48d381da91f1c27549d40191d 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/404.html 88f1453c17dd98d9f22a4960bc90945f1100d4b1ab86becda930b16ee188a662 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/api-reference.html b0c350886edb5e3b2a89e27e8d58d7e7d5a8435e353fb3d32e945d7c552d9cd1 2 @@ -3140,3 +3140,3 @@ -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/ftp.epub 5a127cbe4a451eb4f0124aec4412acc69f601de2b62f8a4bd97a18429633a4b0 2 -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/ftp.html b7601862ecbcf26ab48be0df65a0337ac59e35ce02dd99b0dcf3114747983f85 2 -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/ftp_client.html 2106cf044d314a7cba69a1826a2716030e8578ef2a9fabd99dbe243ee1fe90b2 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/ftp.epub 19ce3b8ce420046f97c0aa9198f5c77538e38cf60d89f548d8518696b9fd58f8 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/ftp.html 0f265f14aba882b54e49ba72278a63056eae2aaf7ba11a2d0c87c3b4eceb45ec 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/ftp_client.html 477d7c5710d9c5691955f283ec30e306e0db7bb27bb8d60fd6ce7360e8000637 2 @@ -3144,3 +3144,3 @@ -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/introduction.html 3a61b5c3d9aa1b142b5d2ad46f7487a8cb02f0a938e91d6e2495b252459db5fb 2 -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/notes.html ce9e5246f6c7756d6ec930651f7b185fdce722d08f78d0def83359c702775771 2 -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/search.html ae0e880a14c77a1701fa06036b1aef691708435126e79bdd71abebef92ab2140 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/introduction.html e7660368003357026bd6ad99795e83f0b5994ea129b9ab34ad741d12de67d740 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/notes.html 4772d8ad8a769aa7162f838536b09429e8804a67617448f5c446d6487430e50b 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/search.html 09db4a192b1b1e84f03c79e3833771e1652606f45bb76345760f1193f9ac8f4d 2 @@ -3150,2 +3150,2 @@ -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/404.html 71a9f3c476a98cdc66b0a10ec678d5592ffb6889ee6068e7fc183a405b71b489 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/api-reference.html 697cd7ec239ffebf26ca3f2c0827c6d2333eb20051cfccb76870b7978261e0a2 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/404.html f15c02435ad90846252a8a77bf34f2bbeb043398b32b305320bbffa5431624b4 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/api-reference.html a14b6b4a927999f6b9671ae20ec58ca61ce75eddbbed9a46fe83c94fb0f7eb15 2 @@ -3172 +3172 @@ -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/dist/search_data-2851E262.js 5309e15676250c8f21941764b1a3b90c86c84f6ecffc47b56b4dc0cb7739bf92 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/dist/search_data-5E285FD6.js 643aa3719c926f2005c0d08802a5325607f40cb6dc31ca7a1d1ad161983ac287 2 @@ -3174,8 +3174,8 @@ -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/http_client.html 456ecc6ee62e192f362be5d46db23187d09437ce9a7c4e3a7ced10cb7d275202 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/http_server.html e4d43dc90866b0b85b4a0cadcedc0dc7783796dd9f2f0ac09cb2516de4e95c3d 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/http_uri.html 0b9f25a39b37a9fda0f6004b88b6f6eddc4736e53b2fe0ae279cc38624435509 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/httpc.html d4e54ff1659fa22da1dd234cab215f9e1cea808e0cb98ffa6ad0ad611cb3f42b 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/httpd.html 2e60625d72aaf42c83f68b176277c6d2b78ad32818f59020fd42d90149767aff 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/httpd_custom_api.html fe0723f99e7a17605e676864f5076031429f7e972be11af3bb4ff2d9196c6a88 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/httpd_socket.html 9d606e2b639de02653f93b782ec3047bb4637941f7bc306f1033cb8b07ed60f2 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/httpd_util.html 3449cb5f3c1c918a5d981a49f7fa8349bb5ee61d2116471b467aad6ffcbc64bf 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/http_client.html 54dd00640a73373a93e9586a185473f4c79895c7093394278c41369041423ab8 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/http_server.html 4c635e5886ee72e8b909c73290844f3929fee069d9efb21670b7613137c5d289 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/http_uri.html 5e18814610da5f2cded87f953ef6bd78517ccf39d554c1a858b010056eed80b2 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/httpc.html aa7541bb74a37629e214d9ddc1b1f86d43969d6cf11dc4ab0395f66de2123b72 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/httpd.html 54700331bf22423a1e90b6a675696978fd3c21f13d99308570a4363eae765541 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/httpd_custom_api.html 538e52c724a187c1742e82e2a33ba13cfb27772252816a0684531c6d2f38f2cd 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/httpd_socket.html bb2bb0acf9ba2852ed96b367efa45bcd3748357db3a7f0ebc7f5afa8f6fd7fc5 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/httpd_util.html 302df022daf01abedc9c7b6489ecc8ec1e7c54af4be23f4e9f8678c76b62c0b3 2 @@ -3183,10 +3183,10 @@ -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/inets.epub 74486f2b88be9e897b7554859d4d66258c89696ad1426a48b777aff3a4107914 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/inets.html 6601357a11b628c53dc7914a9b09e482168ff4abfdbe1420dd52ec3577bab23b 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/inets_services.html fdaeb9b12d02d1eeee237cfcc8276e24ca6a9ac8660a3076119f5b50d28727c2 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/introduction.html 03031ffb80f2a251c4e46f30964f1d4a27cf73afd49e75c1676b6cbbdcab99f7 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/mod_alias.html 8bada82a19d0527a4aa7ac60a527a8cc6f189ea987dd5edd0f4a89cacc3a9b1b 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/mod_auth.html 2b865e39868bff16ec6950a3bb7f409eda2a1154e01975af947a2582358b8ff7 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/mod_esi.html 8cf683903dc9231bdef11ce79f42a58e5e252b4a66cd0f381cf26e3b9b018481 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/mod_security.html 5ea7c8f03c2cfe305c0bca60ab0a4d80804d879304e992c4c0dab5029683361a 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/notes.html 49aa350f6436ce0b14e3c8f26bbd7c6b04f0956499e17a9ae31a96c19ae4ff05 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/search.html 4ba41f194ed027209b3ceac0ea7001d87d27790d4f4a659213c98e7b89d1c488 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/inets.epub 87c6f52c5736760ae80d7fcb8e06ff9220a69dbfd40fff609eb414d38699f329 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/inets.html c20b00794303a4ddea4187fcd4712f10863291d379e452e9e97f36951451c50f 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/inets_services.html 8fa8b7e3b3ccddf0442f09eb2edbbc7252825e5552907979d0710383eff33b5c 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/introduction.html df2527bf1d54c19b9040751964cfc603651d2dd33d27e3596e18ba374e00d381 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/mod_alias.html 7ba0bf0763cd5f5bdfd51e196904f624bf121cc59152368c05243a1513350658 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/mod_auth.html 745940d727acfc46b2d1227b1c28d5167017f1acf8d4e9c47218d632bae84bb5 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/mod_esi.html b7ed6cc468147f7cb7d6fe3b987637b5bc31dbca9f967e3c96733ed4368cc722 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/mod_security.html fab483c87bdac09f96b98730f94a811b3d66a27eb812a04da996500258573be4 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/notes.html d8e256afe1fc9c4da1ca04013f48b2795be72c61a89de5118e25dcf1b17efb18 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/search.html 1453cfe1c39e8db307f64c1642fe5af0a70c8a8027e7cf84e82b1a3898a49ec5 2 @@ -3196 +3196 @@ -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.14.1/doc/html/404.html 8e99ca019cdf040e917734e4d912d3304e2a67ed8b801c42b5af3cbe99bd7470 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.14.1/doc/html/404.html 7c4296a3fc20b3d9020584cfb176e61bc0f9071805f8d0d1771f8151a92d6803 2 @@ -3313,3 +3313,3 @@ -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.14.1/doc/html/jinterface_users_guide.html 11f32c998c4194828c2d1e91f292cb429ef426618fbf32e79cdb4ad2ef26e401 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.14.1/doc/html/notes.html 2bdb8513a0f6c5f10082dedd1a3fc1f9e9e61db3ab61c68ea9fb467131a5cedb 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.14.1/doc/html/search.html fa818141d69bec84d7be05b8ec9a8815526780c2f70d2fd0dfcdad6c9b4fd116 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.14.1/doc/html/jinterface_users_guide.html 5239c3b84171f7985057f956bb0c2f6094f3ffbdd0a5dcff6370829ff48f32ed 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.14.1/doc/html/notes.html 2fe9919ba4410eb5ee4671c935c9c23de5ae942fc30e96d2f609151e5ce8af6a 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.14.1/doc/html/search.html 78b8a8fe552f3cc624ccd7d6faa62b4d2247256fd87f5617ee18cf37d1bf0241 2 @@ -3319,4 +3319,4 @@ -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/404.html eea6010fd7dae2494a01039fdde04666210fa85d43f9cb39ef60c8ea30da35d1 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/api-reference.html 2810658af688ae497a0581b07aca38afca6bc05bdc7a5b1ac857f6e4f11b784a 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/app.html 3247559b16de7c315bf3676cb2676ca71e9f9f0dd8898161eecdb2d2c23a52b4 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/application.html 6f90acb6a5adfcfd187310bc4623071d9bf76a7051a426e360b1fc5e9d34dae4 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/404.html 373cc285094d009951c3fd7cdc0867f753177f0eaf8ec1a034a97513aa586bd0 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/api-reference.html cbe5484d3f0fa4268c01ecc462eb26b455e1d3fbf7668e5a93e9a7ce31b347ea 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/app.html 59b799201d4f0307275e88991f3d1b64e74714a52730165b4c8b39bb11192a92 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/application.html 5b9e9d193a521c95bee440a6edcba152184812b5961f75e1e80e8d19e1a2200d 2 @@ -3325,4 +3325,4 @@ -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/auth.html a6fe18f795b9379b38c9c04b846464202b258f143bd09592c8723fd821aef082 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/code.html ce9b1326d55e4b501c53c5aaa92afdff7bfc3489968581cd6174117845d88e89 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/config.html 173c05994d6d8262b663dbb61babb9ecef1af83f1a360949597b563edd1fad1e 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/disk_log.html 5de7cb30084cd4e928f90e58f390e2b50153fab3764d09af3189a7ba09297b24 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/auth.html 35e174b2cd874db27533d9747904bd5f522bb0bbaa32752cf9053da10998dc39 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/code.html f844bc11509464a457015889bcda7f09c639c2fa1b337634af9fc1e1627918c6 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/config.html 9fa9e5066d2ec90c5f2f082a3934213982d977d82d38a79df213770ec5badb4a 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/disk_log.html 612a56eb70a41e239490c0f12d846e9a460f712ffa19c60b90c69ca348616614 2 @@ -3349,14 +3349,14 @@ -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/eep48_chapter.html 9b3f28af851f91e1381a372f0a2793bc0835ad98b9be93754f572e5a5de82078 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/erl_boot_server.html d9d9bb5d747b5b3977e969d85a0973df2db3d44dc9820882ec5c32862379324f 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/erl_ddll.html 0288c274630d80734b1689d3762d01b87abfa8c60d8d0ef3c8f263c38652f819 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/erl_epmd.html ce0fe8be0163aa6727106e266fe588cb12a87b9adf00d5f1ff11bba48a094f91 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/erpc.html 2c26710b5da1bd1c6f25e5e0b14f8a317e855d443feb8be8438721191bbbeb1e 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/error_handler.html 68b9b8f566198059c39720c610b4537155ca28d117d774fcc64c036081b29c7b 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/error_logger.html 67626fa49f2c45ddd875640021e13d8c390bb5356f0ffc0d30558afc6e621cf5 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/file.html c1ebfa81b8c8292b094581bb5e70ac67b3a79ab432514fcde15b38a9c90e8332 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/gen_sctp.html ebf08359a11d4338aef83b78447c7f17bfaf1a2b598fcc3431097d29bc34df7f 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/gen_tcp.html 222c3e8401fa2769cf85b663f3009b2c149e5ce266c2f622c87bb4defecba5c9 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/gen_udp.html 871ab95bef970b6e5052bc3fa845ba5f63ee5f5b77eafe0b7b39154eb4ed9d11 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/global.html 7a514e809c8795d5675bd8738e170f5da44399f1551d1ea95d071597cee32a04 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/global_group.html e7759238d9e715f0e6bbc1fb2996e93996e3ccdddd2727a74618df36b77fbd1b 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/heart.html ee60f5998188344a2ed1060993b73e94239ddd4b33159a0c85959609d35a6f97 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/eep48_chapter.html c85438db1a635ffb4643b73506d679efb7c24def55ba8e5d35d4196d2873c27e 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/erl_boot_server.html 510de2229dd1d212ccca61ba24d12e151e9b3dc6046df5855c3b83e93a118e1f 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/erl_ddll.html 43884620e4655f991dcd42fe99ea4db550ff73270f58386f6823df919a6284b1 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/erl_epmd.html bc72b89342a2e061fa2adb59a2de6b831ac7a8c7aae9703eb8684b0c9bd55ce8 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/erpc.html 25e1bea40455512e7a2bfcaf7bfd18ec121c861d78ffea18414a3db3e3f04e7f 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/error_handler.html e5a1f9490dc026427f2ddfb7880e92618204313f99f6dfb08eac7cc0a7ddbb0f 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/error_logger.html d4d7102bed7c505717f9081e0aade11f72878a8273d77fc1e1611d0503534b9f 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/file.html 712ec4166873ca300dc0a3408729864d5a1859d1b42491688384fb8060e3db07 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/gen_sctp.html 333c8f76fc5970829080b9584be3e3a8594444c5afb2cd99c9d76528896a25b8 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/gen_tcp.html 8082107452745eefdfbca7d7dfe05f6ddf39af829e47e5da6d42320e73cc078f 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/gen_udp.html 1f5bb8eeb3a40eae5e79bd71a51eb9302051684898a0b5d7171479fbea7855c1 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/global.html 49b75511d4da644926fb7d46a3a1eb63f9c9e62b04de640b7a199b480f1e161b 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/global_group.html 70001ea8733b2f6c1c15b5620977195c55c0810c8930890c5edbda24649a4400 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/heart.html 91c0cfc6825fa115ae6f05cbe0c07a802383546f275ca1add8b70f89be727d49 2 @@ -3364,26 +3364,26 @@ -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/inet.html c9bed9e5a45401c8123746cb9c670f11d47dee4ad5facb3efcf838a86aa94528 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/inet_res.html 4e5dde369e1fa21bfd724d1cc3911438b5a5c33bb52ea589df6c62e919140769 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/introduction_chapter.html 864d40322565d00f1ae4132c978deb02a7f0245c771bf29c850401d01d5ebfda 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/kernel.epub cd69b53bccde82fa7b194bfff949e18734f7b517f9b37edaede6ac1aed9a39bb 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/kernel_app.html 3c3f0c879021c038693933bebb0313f0bde6c3703067d7df789e6a1ee063376a 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/logger.html dab7e41fbe8b1de60f44aa950826dca53fdf06ae34e1092770c0b1898c66f63d 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/logger_chapter.html 0e5e52655fb979dd1902142e22301bc16e67f965115b17a1c260077f9fcb7c4e 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/logger_cookbook.html 9ab82eeb9faeb91053219d5ac0440345e888765d15f8cdaa1002a82437dd472f 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/logger_disk_log_h.html c7e2527cb4f3684f27c945e21f252582b3e0041d6b44c3e91a397fdb8ba7325d 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/logger_filters.html dd707ff51af7ec0bf6b97f49c44f711aacad0251521d02584266657dcc9e3641 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/logger_formatter.html 2395c2f7e80f4ec371d0f8dc0983dd5f2e591a86934fbd762c56db86de0e3884 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/logger_handler.html 800012b5a78e1cef9f92568cb4601c9eb3b8d7b5d9732c90d99404c842cd5e08 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/logger_std_h.html a3aa5f9638fa93fc3017419bd312ad2ac3cdb942d187ffdb676c3684b1b7ca49 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/net.html 1ceebd1f22900c4da5e1590ee47523fa3046d6b37495c8802dacda3904f7ef31 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/net_adm.html 07ccc771ff080035a980694bdf31b3832c5894e38954e51168375dc65312a9a8 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/net_kernel.html 5d8f978a6101435533b9323289a421b05eff70caa41d189bafe01c544e9c6cc2 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/notes.html 59c3d2ef64caaf4b92793cc7791b24e4f612921d73b666685d19d1cc661e887e 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/os.html f3793a7d7b0ffd83d25e78cd4bd46918e810c59f6cbd45725d479ee457410f8d 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/pg.html eb16aa723052bde1a07715c45aa467cfffea78b5880af81b7b6fc6ea629671ba 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/rpc.html b477e19d2e498711b2a1f146bb6ba9cf8e9650db0371990092e168369695f155 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/search.html bfd1015206caae12a31a2e4f2f7c20e9420691b245ca3df318c794c9ef9d0df2 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/seq_trace.html b922b5789131df58a5175d85ff57ba47dce0474d4751e18daae00918edcb2d72 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/socket.html 06c0f946be4d1988aa466f271a750cad406fd6645bcd8a1f3223b4576c3a8c8b 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/socket_usage.html ca6ccc481050cbc8e45a5819dacdb58d40080038573105819bc8de742be91902 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/trace.html 96aab09db6163193a316f133558ea47beadbdc7688cd30d81e6f766468785d7d 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/wrap_log_reader.html fed23f9203e2d54e98a691287f90b6166895b1e358fcbdd9a007bbfc8d4de97f 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/inet.html 8544ef784fdeb8c1fcdfbd504938c7ecf557aaa871f1bfcf73ecc4b4791d202a 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/inet_res.html 51f100d687352f7708f51eeba9568f11b36a209dda089f2a5c9680d3f9e4cb6a 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/introduction_chapter.html e74ceb0a132efef43172400f1ae5af51d6525cedca577951a3d141ff9b568f06 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/kernel.epub a62aa076360668e82ea93f2cad17f91343b86395532190f95dcbbf0597b40b3f 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/kernel_app.html 283d4595ee2e3f30a9bf04bcdb128f030010ced272160d31b04c9ace4475823f 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/logger.html 53f815146ebad59e85445280570f4c7e6ece1af59b0f11454445e0a7dedec701 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/logger_chapter.html 32d11460c2bb91c98494e8feb08014d74f8c7764846fdb0392562298ede65384 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/logger_cookbook.html 7ef52fd6ba59501fd0b35b9a7b6e08b533d8c23c896d4423171cf2781e24cc6f 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/logger_disk_log_h.html b3bd94598219b8dec3c59221470dff66fa8d1d37df24a7e01350704ead0aa7bb 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/logger_filters.html 92683442ecff5fa5035bc8034a289108267684dfc67b85e82c18290d04da01bb 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/logger_formatter.html ed214d372af2cdcbec57708b293491758c629bfed7d967d86b6bc239c4a77df3 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/logger_handler.html 9702086a5e1059d854fc55b712300f914dcc34a7c4fefe57ad65850c06198f08 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/logger_std_h.html 01143f395aec1467217043d6db69e5ea3872ba63e36b4a4c40a9b18abf91dd49 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/net.html 80a63d5e1cd3cb6462f591181608f7ed2b6993b173fd55037e51e3cd709b4a5f 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/net_adm.html f9576f0449e1cc657e974c06bce274c9a5a31ca922189c7336b7ef5a0aedc271 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/net_kernel.html ae499f6b7c3699c4360ac502672341f36c0bb41d31f4514c5d3f4c79bba2e960 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/notes.html a4e5824d905698cdada6de5fd53cee4e4ef4cb7ce7d3334cbabe9fad6b2cca0a 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/os.html 360a699c6872b19089e796b369bcb9c48d3c0230c26aee1c5e2a27862e6b3b19 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/pg.html fa1c7261a952769b0a194537f386d3db8c85c2f8cd2996a7232df7b49820a0de 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/rpc.html 52e07aef1cda8c94298d3c67a6ac281f502c361d75d3b5e35b8c4aa5ad44f86e 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/search.html d659615625133f0d455a525c5192191aad1b40350ba302291a59106b4f1555a4 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/seq_trace.html 3f0890d0aaaf5b98639b3ef11dd0dfbbf7637a71310e1c78534942be359a95cf 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/socket.html ed87ab850046cc72b89bdf9ebcb4b1a61f795b98f78bf9591a391a0fb6f5b773 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/socket_usage.html f3217c462e638bcaf38420d5df588d81dc32aa2521d17e4b4946229477e01dd0 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/trace.html 9d928f31e108d9f0e2588312408e9bf9c0cc628bd8c45d61c4317a4560a761df 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/wrap_log_reader.html 82eb1e2c3999c7a7d210e5f8af76fc37124701e1197a5cc26b824acf812c26b9 2 @@ -3393,2 +3393,2 @@ -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/404.html ae3231c65844d2b35079947a9329d167a677decc7ca1c8116df956ff9826e4b7 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/api-reference.html 23168ce191d3e7bbced36bf32123e68f997b1787b29b18a21191151cff2d9f83 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/404.html 2d901fee8ea908c015841702d965dec35b6dd4e66af8fa2af2e9f9c756dcf57f 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/api-reference.html 6fe193ec009051dd75575a05052a0cb2c5b1502654b1bd27e65c2697f6d7ccbb 2 @@ -3426,26 +3426,26 @@ -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco.epub 6239bac732c6789694e8b629c9ec0b4594fbe9c623a12da25c95058de67142e5 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco.html 68900962928cfb6752b1dea6986704f67d98ca4081681aef7735d79a1abb29be 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_architecture.html 6291bb036a5c54dc38eba90ae4222296a0b6ba745941922c53f4c42404c284dd 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_codec_meas.html ac67215a053edb21f3e5969cccad91c699468994e52e0311c6b6c8deae8a7dbd 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_codec_mstone1.html 6cd045f480ec3365a95e2ca5b227c97bef7de290f0e134f74c0f84940cfc79f9 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_codec_mstone2.html 98b948ac2a9df9336ae27f46d4ba9289891135af15a2bb5f6c1ceb1d5b23eb9f 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_codec_transform.html 3b0e0248d4d3745cfc800e2676ad3a56c30d658ac7ad19e79aff1d215167e6a5 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_debug.html 15836a30fde86b9bbd7993f589ccf6d62ef91e0be7f887c076ea45ba8f1ff879 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_digit_map.html c61a64a16bf3b23280e5392cc400fe2bf7531f56ce1c542a149061c741036317 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_edist_compress.html 84d50ab3102230ddd48e828046d1573a4a8ba5d5281610046cafc1beec7db4be 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_encode.html a49d1045582c9b4f90105f6740563c76b532ca385322962e784bf3d7177d1c32 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_encoder.html fd3280c9dc2379d2c10d379a7fff08f6cf7a51c6349ac35f7c951d5a073cecf7 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_examples.html c2a83ea13dbe3a805278333a5564a25eb253cc8f2aa5f2702660e2c64d63639e 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_flex_scanner.html 5fccb0ce5efeda528ef0df714a3caf9009bc0b028710e2d63217ac440d6872b5 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_intro.html 6bfc087088c761dd77f0c6924938ff5771ffb29d70fce016820078ed167c4cff 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_mib.html c70c5a4dec95a7bad4674b711889b0668332b779c5821f76d232ad9c19d1c400 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_performance.html cc1733d8be5d7af0b2a8a29833fc7629dc793f4bd9d669ed3b3c737de69db3aa 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_run.html bab825ba78df4c200c520fbf497cd2d905a0528486775f0056c598ee24586bb0 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_sdp.html 273ec8359988c7952e56ffedbdc53f77631bd14df1b8a2e1508859bcab91165d 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_tcp.html 7318136e5f3ca31ec2a5c5a6e673f326cfd4fd0dd2561c5a1883549b75ff9ace 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_transport.html a7fd42ce6f5da52ffb07c7d3a6befc0edf0a5c0154698c7efd39d07c65da0866 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_transport_mechanisms.html dcb0ce516794eb69ac84b1e255744c2cd95192ac6d56df6ac0bec357910f82ad 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_udp.html f1d463521f9eb0809255034f261c9f4152c5fa67ecc5d0f1ba985cdd05bd7c04 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_user.html 19def7151ba46065a4f137fffcb5b25009f545f06f0c6874d4f4558befa2471a 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/notes.html 8fbee0522440d5ee52efcb1b4c4855040b87b6dc0070a9cbde0afe7bd72ca2d4 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/search.html 9c475b58386cf242f0ef046185433539434b7c4e661cfcfa75b0d4766b1f99de 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco.epub 82b3414121928f5ce7ae3b9959cd6bb175518015e244cb58336f9885c1354972 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco.html f1441fe39602273c81a530701b38ae1a7aaacbac5aa4a47648cff200143ab068 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_architecture.html 9c490066257714e3f1f45fdf8a0de9a3e39ac3ebb42f328ddf26159242dcefd7 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_codec_meas.html ba336c2d54999d300d57c10732c682cf2e6f2d1275d4f83a5aff3cb5fae40958 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_codec_mstone1.html 0bc3385d2fad1d06a03d24d47e00f5c7ce3c4036236755579463bf49c1b3633c 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_codec_mstone2.html ba35af5c75673defb5e34cb7bfdbdc44bf54a20eeca31b22933ab376f42e360b 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_codec_transform.html 849587dc6edff01c59e7e2f67a7004f69f79a91a5621448c1cf43db2456c206a 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_debug.html b931eaa3d73d63e2b3b9dbdb3296897752d7a3ff14e46e740a1a5ec4c68659ea 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_digit_map.html 80b8863df6a6550729f9bd32c67c793ba0c407bb93088e1cb70d734970f6d042 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_edist_compress.html d47af0fd09b0d469885695f8b82dcbb172c8928edd8f20aa9a921814ecdb93f7 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_encode.html 1c281f28874929781b49f39304e1baebcf5d5a70b361dd2e3b7df22c616ae77f 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_encoder.html f459435f98602c1b33e3e957895507151df3a96f14680c2afc81fa94c8fb071d 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_examples.html c30e61f1ecd6e9f6680a4346c54eb185e2abb6d3a6a3330c1e4698e3357dab7f 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_flex_scanner.html f6ade054e2534dad99c6235771d49a28871c21d8c6c8fc8ece15ef39495d1a89 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_intro.html 7e6f5ce082d923e07c3ee1521d363c3d72f6eb263291ac9bec464e4ba02a30a0 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_mib.html a8e9ceb1e3b29d356cdfb551cf2039e36b796024798d601ba3c1b799cee5b96f 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_performance.html 3bbd039450647051577e878efa0ab10e1aad22b0c7e61dbf112cdcd7d38f0034 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_run.html e0cd5681c85824c93554e72376ac8195d3b3350241ffd0d24ca150bf5fdc7ea6 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_sdp.html 7c726b793d2c205f555d824ea9b6d93f64b2b7be865b06968b916c81c7f81a0b 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_tcp.html 45c75cefd7aa8141acae2def259d8e7c1c786b015b6d1ba10ce36d9e1e71fc78 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_transport.html 2991cce0c20934a86b58f866f3aa6b0970b920769e98f84c92b44a1bc2fe261d 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_transport_mechanisms.html 51ad647736db2b1ecaf01e075d0d85c258ad29d43e07fbffc0bb04760f4efa68 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_udp.html a5892feb7686451110fc5c7c227c1cdbdd1dd9f092ddb0b37f8ef81a6e2be401 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_user.html 5e8c96b2c9a227f1134805c4066f2c8ea762acc68cc669c9b9941faac90cf43e 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/notes.html f16665aecf4d8d8354e977088ab2228271411f3d246c2ea42c894746d59c7a01 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/search.html e54b9d7783038a19deb0c02c9fb2111ae83dab7bd6fbafe5bf17af5d391dc242 2 @@ -3455,2 +3455,2 @@ -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/404.html 07122a628d2418bf41c1e4d914ac6f141d01ba396e6e08cfb7c5871210a81e95 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/api-reference.html 08b58bab6adb179955597a5afad01c7c35540243f16ea8d9fa5be5c42da43b6a 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/404.html 94f8784c21f638e2d2fd450afa69de4c71d3e13156ec00a8f2295cddb47579cc 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/api-reference.html 74b4814d34278f1862a9851910403f11ad10c8017eb28ff409b7c89979d25c15 2 @@ -3480,17 +3480,17 @@ -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia.epub c2b59de57f236dfecc8dd45a837aee7a317139fd9aa1cae79601e5369bc439a9 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia.html d5b7a7d64135e6d3838489dc4be7a6dabb8c40da5a92d388c79c4905e2b7b334 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_app_a.html 192dee9d511350d891bb1d3a22cb9e26ebca254e28aebf15beeb85746a348bb8 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_app_b.html e882f307f29eb6bed93f47a3f0369ced0ccbb39dd9bdcd81e1364043a28113f5 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_app_c.html 73264305f2af1762dd1e73b8206257ad839c7a4b43c67cbb8d98f1ab659f6253 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_chap1.html 6dca56833750e896efdf574de62e0fb35ee191db3f61d4ddefba8790a456d28f 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_chap2.html efa0cf96e1104d365ddb0aee68a7913f7700f39afaa0b0f69478e8d0a55fd8fa 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_chap3.html c960a7fa347efe0aa81bf1afa8d41a6f8abb85ef07f0efd2ebfc75309405cfb3 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_chap4.html 51a15be3c80c42de6dfe268873a39df6cbd24b94f45792fec9ff3e2d6e828296 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_chap5.html 7ccadb225ea1e6bb3475a71473f5d63e86a6b42e4822d7ca396e99f575a58f0c 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_chap7.html 411a77f5c404f73db994e9672af369282732d5b94bbdf12a826e613e9d38d6ff 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_chap8.html b16a6c9855b39b7068b030a4da5fec628ffe669be997555d6dcdf8cfa23a68d4 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_frag_hash.html 0f871af92606a7fcfc5c3c32bb16fbfe3ca0e2131ea8b8ea547a1e2825c3412d 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_overview.html c2eef4c52d94c820ac94220458c9b955ac676313b5e1c9154d39349acd5c970d 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_registry.html 2395b3224b15a41c688881d5d72f16f907a8546d4f93709b4a0bc93f5c7c57bc 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/notes.html e19af470f06acb142395d326b4c9faef0fb026d331de9f74b50263c116ac97ae 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/search.html 92639af7d2c3f432d67a3187ee6c651e60da2a349ca61ccaf16ceb7606c59860 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia.epub 56b7374cbdcede1226c84cc6a6df8dea6ae9eb6fe46a7f3cd1eba883a0e0dc44 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia.html b57bd73fbd354f086ce99cf3f29c44bf12aa414813a1443d08fcf68b8d991228 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_app_a.html 51ae14864b870494b58631e309ef3aa7a99beac6657cff8c892e3b2c6960d094 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_app_b.html 393f6c7e282b53d45fe23546d1efc6cc22b52a93e37228b4e53a0dda3890e79b 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_app_c.html 2aab3fefc027c48b866a241e1bd6b6c8a5b0d4595af58118d9ee873b06226b2f 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_chap1.html 3f1ae06a7f4695879bdeccf3ec71df562d94f1e10fdc0f0951dd73503b32e3e9 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_chap2.html 0ee3e7ee488907a933a6d666a85742267c26d510143cefefda35c5a052d7db32 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_chap3.html b4c95bc3e27da80cc5df85e47550630f6f0e34f5f343310a57b13826c044c1ed 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_chap4.html eba0d4af9d6390190a8a7a195a96adede4112cd2bdcf86627dd0b983ab9c6f86 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_chap5.html 9bccc172a978a0cf7ad75afd5ad4163cbebc1be8c2dfcd60cd3524cfee7a8124 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_chap7.html 96bc5322bf897b7dba7e8fd1e3ff5a2d840e4aa27dc03d5bf4773e4f9f0c678e 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_chap8.html 45b20a7e2400e6d20327028e7af1179c456180d678c12de5b15e5032f061c106 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_frag_hash.html aaaeeeb1b6d608754ba23c834f940fde6afa2e82e95304f0adacde4423406d92 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_overview.html 3eec032899efdb98936b2cf4bd7838249f3d1cdaba9aba3bc868c033ac36c5ec 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_registry.html b35121fa2318aa58da320c296787cd3079b6d8e92828306c51c2172eb6f7e273 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/notes.html 4063aa61741b66557bf80973fa5c9288ce7b3a108368c49048cc706fe18ec1cb 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/search.html 707d3bf3be825663b2d0835352af61255bf2e3e95356ae0f5f5bba678a7f8e3e 2 @@ -3500,2 +3500,2 @@ -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/404.html 7a61294d9491e3a6cf2abc9966c175558eda5a17056af982b3b3ab5724355923 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/api-reference.html 37afbfc2becd253a2b4ab279edc1e21a5ddb5529c57ddb3d3a3ff0e582b3003d 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/404.html 7babb7731e3489beb7476813ec3c84e3f24e5a89899a1c0b69bb937e9b5e3c1a 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/api-reference.html d431800aaae597c7c01135050cbc074fa422f08b64a477f59bd9bbb4eaf4ae35 2 @@ -3506,3 +3506,3 @@ -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/cdv_cmd.html 289cea47e0d5bea17aa2f856fc874084b27b7c56bf1e4e595216d3b4fbdeccae 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/crashdump_ug.html 9882b5ea7fabfcbe6ef8286a8e917fb72b54f2c1ce952635b950942880e4e436 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/crashdump_viewer.html edf4fb14aa4e5848d5011d966f637269e426c28d45477aea5a9e3fe56226df33 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/cdv_cmd.html ff17e7bfbc9816aafc831c4b4bbfad0a4e8b582c1c871cce6c26168c8b1ec593 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/crashdump_ug.html 9b397465b8d82b29a91769f766ce20d6cc7991c356e96c1b5dc449bf675e4909 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/crashdump_viewer.html 328697f95ce4a142150280611123e7d7cc6896313e2c3d290585abb16c663055 2 @@ -3527 +3527 @@ -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/dist/search_data-91E2EDED.js d1f96fbce5b4e0d485ad61b556ea079677a268ee2362d0d875ac3f31480e8779 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/dist/search_data-227F454E.js a128807fa44eb0fddccd638ab78b08e0429396a10735aa7981ec1641ecb874cb 2 @@ -3529,2 +3529,2 @@ -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/etop.html 21989ded9e4e478d183735c4018733feaf27b78b610b22e809ad4d6e03ea1552 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/etop_ug.html da7fe094448c1414ad9d323149f730a9b2c4400c2c35341114dadc6d9a490215 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/etop.html b430a32de63382369a5ae879538b0a326c7ae0fcb606f6c6ee047573043c73fa 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/etop_ug.html ad3da88f2c2bf63f715fcd9f0b116462bbf9db2f9e96e50e5702cc4112a90dce 2 @@ -3532,9 +3532,9 @@ -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/introduction_ug.html 44f9edc8c77799d25c38bb0f0e01feaed210c45fef724e6be332b50a0d5e80cf 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/notes.html b882642ac121d001f3f5a8502be660ecafcce7aee54ba4cde285175e5810f4e9 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer.epub 20f1973365c1a9c9057be466a767fa64326595527a9b361ed12f55bd8aafe473 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer.html 728113d9d6373189bc9d0c970602d9330dcd329c17a642442c05888f102020aa 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer_app.html d37925137f84700d64bfca662fc7601860c6d1778eae1d88f2443b7a1595947a 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer_ug.html 2143a0ecf7d930ce08f5573359349699afddc6fc71a1841c68c9736bc49db50a 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/search.html 1b472cdff15748d21d7ca9a85b68d5385fdd7885238df1c0fe37509b6faa1d9c 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/ttb.html 1ec68d95c399733556e5452659bf7ae6ffd98088d95ae45e1b6ec40e329fe1e4 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/ttb_ug.html d68209cbea18256f9194f68eeaf00d739a5ef61734ca6c12a4131be61d0fc6de 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/introduction_ug.html 7910278d278b463e50f7f3c7974ba83330784b95e4d675a19ab5693fd26baa18 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/notes.html 4c9ab32032997823f7be2baf23aad4c13a7ad27120b227df8d915298f085253b 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer.epub 8ba06004705242e19eb33e4ddb0b38c6cf8d66db5f159aec7d85b045eb93619e 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer.html 886df893c13e31d819338f7f529b01738be28e454a5def616f40621896b572c3 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer_app.html 4b8a03fad23373dd21fe5c79769a63ffe7e56975d598f11e615189eb06dbfc82 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer_ug.html 34d236a09ea63c69d2cbf6f1f43428581c2a8f1f58faba45f6bbf13c6d62de08 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/search.html 3c9187abf2bcd90f0a857d74462722ad5878f0dbc037ada6ae1b5ce6bdb42656 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/ttb.html e38ffef73cd62a1479896b84d3c3923f186e44d421e28dd60bcfe819dd675502 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/ttb_ug.html 1f1184aaed5fb820223dc9d82ebd8f8067015ac51e493a1647e00e5962914f97 2 @@ -3544,2 +3544,2 @@ -/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/404.html 400c5598d1938f1c4f5302f026fbf12c16e5247924799f21fc79ab23c92dd8aa 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/api-reference.html b9120c85ab2c54fa162a80ae94fc29ba164f5f999f26db61359be05d484af29e 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/404.html 7378463a45f002aa75319284f24e4c8815ceedb85214d6fa0323eb15badcc13f 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/api-reference.html 1708a17ad400c4875c9864dc1fd3fd111103a1e3e19b03be85eb79d719900480 2 @@ -3549 +3549 @@ -/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/databases.html 9677ce48cedafa7bb620d1731e8b7fd686cb4117ff0e69201f2770be0b0a28bd 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/databases.html 5e702da4fbcab0beacd734e61b5a6dd7afe200a876111f8e420f43084db44096 2 @@ -3570,2 +3570,2 @@ -/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/error_handling.html 0b37b464f14f779ac9eb5956155e9b191f1d6b03f6c8d098163c5741ae9f828a 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/getting_started.html d75cda8d6d6cec849e88f6b85637b93b77c5ca813ec8d78c32d21b5fe7cb8c67 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/error_handling.html 49e16aabeb73b186b1a3b40e84695f505c1d516108bd53929c3a052940ac248e 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/getting_started.html df3f5cb8b0034e31c082b272ac03bb19ba8dff805c10b65bc6b6b8e95f527842 2 @@ -3573,5 +3573,5 @@ -/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/introduction.html 169a715160af8e30eb91038c6e9b9a82bfe3a96555a71e2c976eb91b1027ddab 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/notes.html 9991119dc337ae42471631d2442e8ff3190395bb2350a3b049652eb7b8211c74 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/odbc.epub 315f47133ff6172c786c39f986184a9382546c00a2e1f81a810130016d627ccd 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/odbc.html 72ef63f9630050c9f3a530b1396e94d1a80d6b3452e875ab4bf3814feda215ff 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/search.html 92d6e77c7e1553129d7e44a05a2fbe148533d4854960cedff6bdadfe52af7a22 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/introduction.html dad2937b85dc462aca4e49dbea7affb1140ad3b4016c78e71c8f79bd7214dff3 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/notes.html 3bd428936bc91b65371d6b2efb00bbb4eb0de3cbaed28a0e44723b52dda47856 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/odbc.epub 050ae362bc78f363180fd7019536d9965e3fb7d3a06e635696d58b6494ca7ef8 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/odbc.html 85d9a8c432877f43d18982c0c688922e5cce7b04191b2fd58797f79456c7caa7 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/search.html 4a754cf274e52ba71a277727cd5b540738c059144f78c6e891d8af75d81f81d2 2 @@ -3581,2 +3581,2 @@ -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/404.html fb037a4ad1af83cea950b2a973175171357ecf955e1e420aa5b0f02deb68d83b 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/api-reference.html fa4e0da70b34ebf5676ef20bc50143a8673c29851d4478c51fcab65140d2ff1d 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/404.html e6e739eb8cb4e03559c8bd5914c9be7b7bea20961a02f0a48ac3dee913e5e565 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/api-reference.html 80d536df06b1f8525377ad17b9a8369bc7c13633189b201b5060a78244394085 2 @@ -3585,2 +3585,2 @@ -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/cpu_sup.html 9d82814ffc69686440eecf56391627b72f0b82b3715da1cc3e9ebf084b82cbcb 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/disksup.html 7570c94293ca124203ed83a3d538bad676ca1f246c876fa83a068720be4cd15a 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/cpu_sup.html fd3cf5237af92aa12d3687e036bfca6b1f7cacf153b85b56811fd9432cfec67a 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/disksup.html e54b6107f7b1ad56ad104e2234f54ee353e97269bbf876e77e4987760594c2dd 2 @@ -3608,7 +3608,7 @@ -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/memsup.html 1c9ba4566c9c9b0361d395da3f723a013ba7a459c2b2d6986acb0f96333cebf3 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/notes.html cdb9012e7ecd87a331194216de2a42a8dff74e20e3d10bb9b227e495c47ee75a 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/nteventlog.html 537ab8b46e5d0cb60298edef00c3370b8f45551e234f4218aa1ab6ea10a519ae 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/os_mon.epub e0f3a9ab657e60054a385b7fff297b686f637fe4e5ef3e4a99c50c67781a224a 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/os_mon_app.html d61db442c6fc84036562523886bb9a6c0755b0928851cc5309b9376f892c525e 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/os_sup.html 8d0da409f57df3a1d15211bfeb4ff60d2200d8a46933a8492495e7d0f5efe9e6 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/search.html 68379bad2798686feb3b2dabd94abe1c4ca94eacab3492c1d836d59d21970c58 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/memsup.html ee553ecf3ee42ce289bae7b8aa624d547f0a86f0dc1595b9942839db5e0acd2f 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/notes.html 6da3a463d52009d295765f64c1aa3a68730dbc6ce5f42440f7195c480799bf27 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/nteventlog.html 8cb1d10e05e09092f263dfc963ae454fd25ac6a75a47ba5681f026568691054a 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/os_mon.epub 9c4cea0f633c818c95242aca0a47fb667a4676aafd775de8ca166a86571b7299 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/os_mon_app.html 72b3b3801bb39469b002277dac165a3292bed67a91214abd70df974890e8444b 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/os_sup.html ee91f19086f30689506a4ca81f4e55f850c520df414157625c52e470bbee1128 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/search.html 4e7559b92f8aa47947f895fb36acc806e6243014d059089182b5cfc040609067 2 @@ -3618,2 +3618,2 @@ -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/404.html 0be501bab5b56c037b5c900697d3d0393352f3eabdb2571256b63cb709ec98d3 2 -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/api-reference.html 0561269e76111a8ad58dd16a18074bfc2a978cca31b870e29a852c3626f0f460 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/404.html 1e7ccbcdae8a18dc42b3eb7bb1def3737112ba082c894f61668ff7110421e357 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/api-reference.html 6ef5d6b8b61a65b09fa3622983ba0abdb4f89ab7f80cc91e508ec4638215edda 2 @@ -3643,5 +3643,5 @@ -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/leex.html dcc4c548b6919def3af6103604d607b2db688f00d9379a6c5f8560570888a51f 2 -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/notes.html 90fdb3ac9790f4edd2a10f5d3230524d6c6053763dff1f879e7f6e402d063bed 2 -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/parsetools.epub 9a6c051ebbd895c939f4456ef574708889aec750559e1ad906e7049dc060bcd2 2 -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/search.html 103738a0157b3c3bd1d2f9a41f00295da5d7f33e9d45c3433cb4327a45e01b58 2 -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/yecc.html e2019fe7ac73a664fc5e1653094970e3fb6e8f1e23bd073bd224b1d68fd7bafd 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/leex.html 9828375bbca8bde659c17b347f76565e0099b78364fe9a151110431558df49ab 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/notes.html e4e40b3ed71e8a538db96c70cc9dfbd0eb843d398cad17783589b68cc839d4bd 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/parsetools.epub 473e8cff86098935dd6ec269be7133e78191032ff39001e1e8a8ddb1518e5c26 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/search.html fd33dc2c05385449e4a0fb2b638552442059bbdd3105d1a2f10367934a86f78f 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/yecc.html 848a9e6ef4e0d4199b556e730bd85fada1354d3cc58685a9c8bd36502606be01 2 @@ -3651,2 +3651,2 @@ -/usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/404.html 23c3b8605ed8f6df0378b375d97655d550f88f7bb35eacbcbafa6a672edb7657 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/api-reference.html 243052d2644836665ac0fffb47feddfb469ac7de67cb6aee92360cca1141f95d 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/404.html 848c6bbfd530e337c7ed6477858650a43d1e8bf448c308e5ad8938f073a9eb93 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/api-reference.html 813d974c09544db1e7f6774c4b07a61fe19aea9f4dbedb4381eb94caa2f19702 2 @@ -3676,7 +3676,7 @@ -/usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/notes.html 238d991cb98de51142eb06effa805a57d798d6480a6982ef12fa23a3b56fc4a7 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/public_key.epub 71248da419d536f69f4f17fa9dfed8c1d564847876836f2adbf2d1e42fe7446f 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/public_key.html cec743516d9c1ae706b52754086daadcebc8344ccf3833b54362d0a33c1fc7b8 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/public_key_app.html 81703312ac5130033a8c49dce6f6e33b0e0ed8093d58e8235a4855b5b6d0d795 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/public_key_records.html 2b786b88ba211e9bf5e49e56374466e0406db89871354489b0ed9c26ef6f5227 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/search.html 2aae109f6dbddbe69ca5b16a530fcbdd92aad6e0797363697975d527d6c1a908 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/using_public_key.html e5d2f9394c8eee5277d9612afdacc16190c9bd27d0f7788af1e96e04d9f5856a 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/notes.html 00f7e502f196fa4d2416df97bf51d25c343a4bd918854f60a9a0f8015ce4f128 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/public_key.epub be80e313ec4b0dd8c5bb594854997298f6b1b108aea21c153960385046d642a8 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/public_key.html a8d0a30c8a0e4401ad1d6cb72e585b2b84f82475729d3ab889f5219e584b9590 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/public_key_app.html 715643ac5167f18d66b965752c10cca09f6cb165a055a75ac0c947d609bfb781 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/public_key_records.html 490d36e0d5425069dcf173ebc20e26f3e49b3177d6eadf086584e950bdf0c284 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/search.html e04a4308c6374d83d26732f433297f2c5840ba24eeeaa2da2d784ac1f58508a3 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/using_public_key.html baebdcbbe22d5a7ba81f9fb88617eb950afa93d4fcff3c9c3d6920b993a2c198 2 @@ -3686,2 +3686,2 @@ -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/404.html c4641633d47154780e68562218485905018dd26e249e89437052cc5e75a320db 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/api-reference.html fecf814a7c57779ec43a6e37ae3a55663f1afc7dea87b1348895a418d576e8a6 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/404.html 00b69eeb3d9bed5fdb9d77549134cccb34883fe6a8902bc860b22374aec9bda3 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/api-reference.html 6fc13065a6e2f3c20c83f84f25aa2d4bd4c1e31bbc631b6911301373a653b72c 2 @@ -3711,7 +3711,7 @@ -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/notes.html dd0196162e836bc1f1e3b730017a2d00ba1799f5285e4e18debc05a4b97c5d44 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool.epub 91aca5d9868cc87660ab4abd03a9763329a54dec70eb34b4f83adccf2e7ed186 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool.html 9428e662145a0450288e5c9577a33d34273371e727e2feb0ef209ef5c9cc269c 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool_examples.html 6de8ab67638094e2f6a49253d20f3361446fbef34fa4de5edd07db372f5039e9 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool_intro.html 9a098cdc1508f830267e34a2e0fcf10576ce5fc8a45e4f819caf439ff588a431 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool_usage.html 15557f6bd65e6104f1773753ecdcb8cd8509b4fce6ba6ec4fc9db45efeb5128b 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/search.html c48133ae25ff80d036facf26944dfbf4667c92dd92ae2f5dfef05a2d01ad061f 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/notes.html 3d69decfbd3ac585e0fb3baa5a419df9173ece3b1caf0f8f9f9e316df8f08a6b 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool.epub 408156b259ebd4afebc357a5e5fadd3db4b851944c79ba28c7f8d1d3d437cb00 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool.html 49b1a2c01586d238012f67c7615f34de586e062e812f31129a2638dacf9d396e 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool_examples.html c3e98b525f390e989ccc206bd2d0ca611b413bdfe3607e0736a9429b10a25757 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool_intro.html 94949152b79093070c06f9515858ca8590fa7b522b47d53700c99fe62cd0d48a 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool_usage.html 3c33b05d8c1058a404ea6c50370ab1bf71626efa3c9cb4d1434299b777e76552 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/search.html 4e642ad1f653580ef01ade11381dee263017a5a09e7acd4464bf6f72a4a1fed3 2 @@ -3721,2 +3721,2 @@ -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/404.html 5e450615e148c8cef43a1c0648188c2ca297507e2d5c908df9257c7f739a63a0 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/api-reference.html ed76a82a9792465cc8dfaf329234226c31582ec6d1b0992e7322e164f69d18f5 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/404.html 6c81b6f2c0a58e61dd4cc572986020446952c1840f033b5a70952ee551853a11 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/api-reference.html c1cc41409133b047814c2a6d730ad01530c374c2a31f21cee90d4962192d0d35 2 @@ -3725 +3725 @@ -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dbg.html 522ace12c2612fdcccc972d203bbd4bfdfd0f8fe3ebf12bcb12a5b92a0badc3d 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dbg.html b777b0916f5eac468437d9df8063dbccebb5031ed59cec8c343e0e86376a1590 2 @@ -3744 +3744 @@ -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dist/search_data-B508ECAC.js c56958863a4168f539dcb8146148252484e0999ca4aa1b503785f99592d8e1ae 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dist/search_data-7F27CE3F.js afc0acf16f291f2dd121cee0a5a3b4858588c2b9835c8dc79c5c48a10607cbad 2 @@ -3746,2 +3746,2 @@ -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dtrace.html c13c8744c4b0786ada32d6d35c63a3c9dd268c100ef5c73789c85b63947a6d22 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dyntrace.html 3e0f6746b6128262d0770a76dd8dc5b414a5bdcf3c7f6346540b22ea1a6c8cfd 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dtrace.html b419430862bab1018ea9de7b9f85f5bee8d0e0fe1bbc05b00ebfc1ca7cd4ac41 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dyntrace.html 82e457c0b9a4a909b104e62fde03436ac716a7e49cb8485955ae6afda3a643da 2 @@ -3749,10 +3749,10 @@ -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/instrument.html 11724882949acd949a5606bd707737139141e73f2ea340fd3d37be12b210c644 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/lttng.html 9ef977d0a54e09e26ac0086c36fde2e3014cadb47baf555461d96f6a8f4a734f 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/msacc.html 0ab7242fd7f14ed02ed53f9a800f4c3de0682a56a7c19df1ad0e7d77e1d80195 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/notes.html f9c61f93929bab4456ea6284d4b7d4731fc3d276d9c3a08de91f183d832d81a4 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub a737d8340ae1f4d6936ba1c96d519bad5e24b02d4967d88a66ba1cac0379383a 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools_app.html 58209f99dfd59f99d2e531b793a06bf257bd50b118af1152a02e37c1c9745e45 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/scheduler.html 608e4737cf0c4db10223e859d303bd51e77374b47473dfc224f5aa3d9d387983 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/search.html 6bf95a29eae78d59eaee570b31d1b517cb082d204b56c89f7fc6aeb91e097360 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/system_information.html 30c93c88f7265366eca841d6708c166db7bff07ef2a61af29d8bec5f5057aeff 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/systemtap.html 2989f439aed58eefe9445f3cd1b0d6454c6986b3c92a717e83f164b3d560e169 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/instrument.html a13a971b30dcdcc63853eb6b4eaaacc883cd2def9819a2bc184a1064c418428d 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/lttng.html 72090ad412cd2edd206614c550a5ed279f25ec015dcbb400ead8a51f6416e5d5 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/msacc.html c107e7666e59fb7816da0fff19ee15ab24402828132fe1f3c03b38e77f367dad 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/notes.html 3faa56a1285522e5bfbe160a1a449eccb2f9ca1e42464a1952ef2fe3e1fa3629 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub 79ce19e7b6aed10d394ee50e0e4d442c401f8a07f45de5e06471bdfa28709dc6 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools_app.html bc4d6b87b8c3713f7df64ea6448a2089873cef219a2873e4231504652b4e26c5 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/scheduler.html b95324b7f740ed92cad3be4775809d953db2fd2c21e76ecf3327c38cd5301306 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/search.html 4f90104c83790cd66d2a397adfa56f7a356507c77daecf96fda9f0c10e60091e 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/system_information.html 2ee6eef5fb2b1c109ffb34169b87b9c1a3f4f79673acc9e487a3a81a581bb7a3 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/systemtap.html 39c574ead592261f5652ee9289a699ecb31b37a7afd2eb267fcad63829de5789 2 @@ -3762,4 +3762,4 @@ -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/404.html 3f1bf741f0d9021472e7270d7a129c8afe0e1cbbb483abea1be65521f6aa2b0a 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/alarm_handler.html 349e67202e2dc86dc4c73e19b747ee7913c6dae7e1c504c4772e2d913f1b7f3e 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/api-reference.html 2d37097afd8cac99b481fa25caae870884e26a9c6eb810bb0c330cc32ba52b4d 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/appup.html 67355bed3f28ccb5982e40581d835ac8e554070963133d14af320bd28f2f9965 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/404.html b85b799302104b8253a2d9ccbd3f7704e92403282132d328d364a5ba1281652b 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/alarm_handler.html eb8224e08d7bea2bb67568a52625531b6186085d088cb95afe9690e6075a3f77 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/api-reference.html 3d07cc749b1928e6f7d7b208c64aad9fc99af0d3b4f8e08c96aad34e5d4214cc 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/appup.html e668abedb2fac6c045e4ca8b788bc14cd8f8c40ccaac43bea24743cd38e3de37 2 @@ -3786 +3786 @@ -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/dist/search_data-12AAC588.js c23d12526231e2fed3940ce1b97b6a11060ae38065d0c1b0cfd815fc3f4f6d99 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/dist/search_data-D2253CE5.js 678b50e9092253a4c186068ba31c5d2c2ce327f477d5475f52a12ca7381ae2d1 2 @@ -3788 +3788 @@ -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/error_logging.html c1bd840190930ae707ed20cfbfd533fb3cd7491d35c70190b83b776d60b11302 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/error_logging.html b1640712d0ae13623d28f04b22cd4d6361bbe770861572064b4d3383b6d6614f 2 @@ -3790,11 +3790,11 @@ -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/notes.html 6f544d0c6c7f5dfed7df7c83f4ee397df4179ef707a38817dd5fb7e0301d54ca 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/rb.html bbe3874892da37ff74377d57edd96b682db0b144214ec8b76ffb09313cdf3e58 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/rel.html 0bf4bec0f03cdd2505ef8bd5dade2a296f284c90fbba855ae6f39e25d039f43b 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/release_handler.html 7b32f78bce67110fcf37007285e0ccd1a0dea616832ea718862621e27808a990 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/relup.html b8e1cc2c02108190dae5d8bb466d43f173424fa3b70db8d39fd3776aa211d972 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub 4183f401a8919b81bc202c47557d3a3fa8dca0cd15bd842bc7263c778a3a8a00 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl_app.html d3b7fc5af79dff9b88ab097228e3ab6e2600d0b8460cff6f1c9d815643d373a0 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl_intro.html 9fabb18a30b1beb2d776e1a5163bcbb6f0ef2059bb6ff95118f54e759aceb389 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/script.html 75d4cb09405c7820c1d7499619a6f1351fe1c0d80dc5ceb7935d0b81f999bbf8 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/search.html faada98191d285dc50d3243bc3456a9e8a3bf8ad0d469c7ed94ab5b5f539211f 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/systools.html 4bdba5405c301d90bb30ab22e4fa5783a03107a63d40104681bf34fbcc962ff4 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/notes.html 064e01e27a28184372461fcee0e2b5378e5d066ee3f1984b0b109d6e4f840675 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/rb.html b62d77dd2eef4dde0464195ec7b5ec7f3f207cdc4529830f49db0f8625a8a5bd 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/rel.html f8da80ed26bf6b304fddb0305a1a7e4febe67b09c1040d11f16a4397942c67bf 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/release_handler.html bbdfb554ee63c7ba233f429dcdf096551065c2298c0f34ead9deef6e069b628c 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/relup.html 96beb91bbd58099f7e63c2354d185d0605bda384bcbd33c3237ecc4544e8ee8e 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub 975ade0295a274eec628ce2712a1f32e4c5bcf682f24a72aea6e4d9f74b7013f 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl_app.html 1b1d19e6ab6dfe81888b8cedc0c98715868766595689abb608a184972fd36a1c 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl_intro.html 4806f677cc0890a432bb030098d0a12a2d40a99f0c22a275abba7d5dbeae9b6f 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/script.html 0365c529561e3ceb6c558e85957e45cb9d249f209be32c6220e9668d5425edd4 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/search.html 2db833b5d41bdf5fa5c9a43ea80c44a713785a99adee1bed6882104db8142027 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/systools.html 9168a07708e5db3665364ddacb774bfcdb9c0cd9e14d4495a6801ca58dd465dc 2 @@ -3804,2 +3804,2 @@ -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/404.html 69d93e3e48a64199370c7f301feae8536f9923894630fd5f9325e988d72f5575 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/api-reference.html f2cba3a0b325980ab0b1575484171d83240604ef583f2f04acb06d6ca82e6839 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/404.html 69bba6e51c69bbd4bedef9126e2e9f8021069fb6cd6043951e9151cb81f7af65 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/api-reference.html 2f73949725db7ec976bfff93381d8e15dd525e6e2da2f0c13f2c2ba64cb185ed 2 @@ -3839,57 +3839,57 @@ -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/notes.html b794d07b5dc0afd4ae60d021f520785842904fb042fc42942a460f1b52b87101 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/search.html 9dba01ccdd915d6b1237a83980c239813d0cbd5ed3bc175a71272efc0e3db7fa 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp.epub cc9e9a73cb0a6716f73d3e527ce18d515d2f329cae89fbafaf3797bc5210e733 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp.html a5f0edd4856f6b49f4b2a4c0a0c31d0348484effbb5f311fcb6f3bed13462a83 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_advanced_agent.html 4321aadb349d9cc8101c0f777e1491a0f5f410371cc020ff5e452fbdc76a1792 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_agent_config_files.html a9133e8397c299c3d5216be18df3eb65ecb9afd8e726ddbecc6d2ab67ee70f82 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_agent_funct_descr.html c572807f032fb3f994f3fe8e9c410281b20f9c334d7d2e15ba4905c75c8ffc5c 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_agent_netif.html 917e9bcbfd4c3467b96481bcf9242712d59fa8704e35e9e81934c9fa17d5a7e7 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_app.html 26a8d33055bf438998f645ee2f20a23cd759452e28d8a0972e53d8405bbf0d2a 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_app_a.html ef47dbca1d32f7fef89c62f15017234ac3976930c126f6ee33d694335fd0707e 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_app_b.html 89d8bdcd280f74f2d2c063bd0c31ae389ab4a17c8b6a62b305739db39d58fd3d 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_app_c.html 5f5cfff30b70cdaa402b5ed8d29eb159449c8b0192e6449882ce6116aa3e57d9 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_audit_trail_log.html 31fe5160b9ba11c9581c461a426de6c2d5940ebc240db54f821fd49696bec25b 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_community_mib.html db3666837e0e278d0e3991784f116398e85fccda7ea7a07afc67b0427bf97abe 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_config.html 2de94a93beff5dfd1da504b0a2c2ec4be2548eab84eb3154978b529bc5b023b4 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_def_instr_functions.html 95acbe48b9244b8ddf8e23e1994a8528ed1abfaedf99fedab88d5ff34adda211 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_framework_mib.html 9423b5697c28f33c41397371c4bd87c6f5aef83a532ab2649137094ee9cac41a 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_generic.html 1dbcad22df1224dadc27d316fe1a31729411d9cf14141aca5e9529853c2607f1 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_impl_example_agent.html 774b2d2c3e69d4669c441e121155a6179b57213069afa1bf229e310e95a2d868 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_impl_example_manager.html bb4d088337b3469f8ff97cf2637c83528702b01d9d9ad3a12e0f2796d4e1b740 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_index.html ac565de044bd1bb554f29a2a9662daae6cdb49a054a9b651371c8d21586ae6d5 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_instr_functions.html 21baa4ec95fa1f469c751d39e791aac662da26ab624b041a1e5599db0a4deff1 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_intro.html cb478b1f7a81a45b7b3e36ebdcd09d4efc34cf961fe892135c15c45cb368f499 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_manager_config_files.html 3c4f8f36ba29dc52b32272ca5fad7834b433944a6c349c6b6b1cd565c2cfb718 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_manager_funct_descr.html 966e1e6f7f37c4b8efa7bb1af458f319b224bc5dd65e97520da1d25b25091d1a 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_manager_netif.html d204626f73c6214aa013bc01d3fb2902dfbd868931a80957e1f13441fcee9c1f 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_mib_compiler.html 80e5503d4376dc8e9835d7617398427894e0288052bd67255a2cf15d974ae21e 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_notification_mib.html 2cfce93404ed0a10272fd4bf1ab74d70258248f0e972db9d2da4fef1384d7839 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_pdus.html cc9603c35d23678e2b23fff29cd908981a6c8376fbb69b2949efece598c89b74 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_standard_mib.html a12ab9f53789cb9a7a85ae2f2f8a9592a2a8d0d9f48b1d42527a96e8044758cc 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_target_mib.html ab155d228a5f18df68035f299c2300cac625bedc559e408384ee6b313421966d 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_user_based_sm_mib.html 934d2dc39be493269b229bc631f0d144a48cafb82403ae086f4c3c0da76367f6 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_view_based_acm_mib.html 3876e57bfe2d16f6804f84041934b76ea76e125b11f2d18f295d679d96d25b1a 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa.html f70497c24c8f384ec2403313d4351653b50d639052c7b73e5a33c8b14be4eaed 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_conf.html b5c551f10f6faac92d6c4964432580e50d00249b8ffa507bc39e4d9431ea2133 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_discovery_handler.html 90ce410f00b124fab70c4088b215c16791a75a30797f2f4c93bf1eb54ddd1cf9 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_error.html ca306cbacc99e4a10c3559be7d2b6fc984183bf040b03d7cb079de492bd792fa 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_error_io.html c1d2960b97588437ba167dc39f6ed0384b44f0c0253c77b911b3166529dcd9e6 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_error_logger.html cce36b9084171c30b857d145ac226404e5cf8823694c5c0ab365bb47dd58c2db 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_error_report.html c58591c9d27b28357db8c166c9198fae13fdda8fc3a2562ae10a796b78bfb9de 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_local_db.html e999e93fd6a9e861ff91b11cc4c7cf214fe8b4829b7ec1c6d0f8a534b2226520 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_mib_data.html 2b924aa61a60baf7a4a0771ed092f786a02700ef15f96847ef277fbb13caa52d 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_mib_storage.html 253d71c4abfc5abfc2fc63c811116f2206ddfd45c7e91e27c2c9ad1332d9546b 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_mpd.html 0ff2341a09f3481cee40179d264d5aecc06e0fe9ccbab11aa4a6530b58360d5e 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_network_interface.html 43ba7361f1b49df6d6d0b6f7e5970c88c68d3d6a883d883920eb5cb5971caf10 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_network_interface_filter.html 5cdaf2bbcdfeeb649eb8e4f6e332d8e51b64cafb491726a30e5e8493c65841d7 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_notification_delivery_info_receiver.html ef03f80348cb9d5f49e37fd1aef0bce14eeec41dee63b232a8b9bbd0c8d5f190 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_notification_filter.html 47e3ea8cba573ba3d5bae3ba27279a28fa1746df528651a38671e1e9de8a8e68 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_supervisor.html ada8bbdeffdd54f817f904e0bc127fd154a4e259558dd61ee59abd79601fc345 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpc.html fcad46e53b119da22489798f5de7f8d86ebe4ee069dc2ec011aab388a2495bb9 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpc_cmd.html 83a81630bd0c6547faf5dbaa3dfbacfc44e68e5ba530fd8018c3995557f343b4 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpm.html 3d1d6f5156bfeb51256fdd922844ea56b6072a4307e6d7b61e68742398b9e6b3 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpm_conf.html 10a495f023b97be314f74577315b76317c46137c0ea7f1c46ff3909ae483e255 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpm_mpd.html f4d428566c740c3e66896948c79b00af62f1336b8209f26bbe0253614e383d62 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpm_network_interface.html a86c3777af47ce42a0a3a5608e4e19ea77c7e84a6a56a0e8b24f595b5ec192a7 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpm_network_interface_filter.html 92b251381d0036428a06262ecd27b862ecf12336bf0196bb85954942ffd6be30 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpm_user.html 960230721641ebf5be048226a8489ffa6940acb290ef3975ddb57dc9839f6090 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/notes.html a930d58732b21978662439be18873f28a42a3ce87a590631f52c42b3b60ad325 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/search.html 8077f5dfa9db900c45af128ea80942001b0fc9487f969cb801c7e0bc1464b266 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp.epub 4ed0ad4a2bf7cfd73eb6f4ac9a583cb0543b12482629b890de2e56ef1c8504ed 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp.html fb92666f0d007d2e85bab6bf7caa105d747fd4e768ffae956bc72aeef717c89c 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_advanced_agent.html 6330e137d877e6b79b8ec497f5e29facbda8c57c88f8e7cd4076da0bf3b4ab9d 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_agent_config_files.html 665a47b11ed95dd7e6a3ef3adb2bf91776e82da787bf28456618dfe557197f75 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_agent_funct_descr.html 2d7d9a399c63f30af7b7b023a5915052ad8b376fd3f03f644dd9dcf012ac41f1 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_agent_netif.html 48edfee552be0cd9cf03777b2c487d1d3ab93c259b8569877600c9ff9fe16c63 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_app.html 29a43b0213213123b9d1e9c2f1031b57a918ec5fecf2744eb117540ec75b38c4 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_app_a.html 5e9a60e5e0fe12d716a5ad74286814e3c57f9c97c59932e7e2338dd01aa550b9 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_app_b.html d7c1e30d316c263bb0e28ae6bab6719bde4d64e36240dce309370d58422e571d 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_app_c.html 4129998c249b174e19082d36f61c8313a2cfb79ad32f957c136f8e4c6d6be9ce 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_audit_trail_log.html 3d186da60857cb5f32e28df99765341a203fed2952abd7cb93eafa265107b58e 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_community_mib.html 7937c34b954ca40741d765bf9ea2e9844eb8fba4493b20357e1b741c53b16b8b 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_config.html 5cfe4e865141e0893500a5a1921062986cffe87b08b0534763acb755eefc2281 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_def_instr_functions.html b49ce0b826431c321a276910493ffaf0d75911263eca73fe48f8383667a9fbdc 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_framework_mib.html 57a11c3c368e1dde9745fa67b00696f7fef9e32ff9ae3cce45897e7c016a54a0 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_generic.html e96d3ca7dfb870188c81fae850d314f7a5315ef98f6c3cfeeca55267df9c3fea 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_impl_example_agent.html 6b29760c1f1846b33dce0e6f78a3147a266cf8c74100a4e723fe4cdb268d96b3 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_impl_example_manager.html 4d7a2d1d7425cbed12622791ab7da10a2783b88e9d459d3036a9d79305d06a01 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_index.html 1c061ffe498fb3e9c03018a55e43d93b463bb0444453745d89ad3621e9c62a6e 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_instr_functions.html 8eec7ec030a6090b9d3288aeafd5864386cf3d1257113f8f326c239bde65db9e 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_intro.html 69f8ebee1b05f389e632e480010197a3057bd95408cdf63a2b00b6a508640da2 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_manager_config_files.html 88fd3945d516f3258d4a94ba4d18138892adb10addd0ac0ea014f75382f504e2 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_manager_funct_descr.html e8710ac3baff95e4f8ade630237ec3f3d491c447d6bc993987300b2e3cab2a44 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_manager_netif.html 9c6b2dc8297bdb1a3ce8c864aedc0dec1204bcceb7da9188142f2b57047be2e9 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_mib_compiler.html df08dc84ebbb614e962cf99ebf48667abd4667633223a00582b8c6c5093c3bd2 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_notification_mib.html f94ee91ba4b9790b50b94505fde75da8ad9cd60af286024cda4273a3eaa7cfcb 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_pdus.html 2736625a466ac3e0c40d0a7724d34d2a3aad36b835128498d3ae23f768eb4a73 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_standard_mib.html 71ad1385eee2bd141cf910fc3e2ade4d708507c2d38c25b3708cd1bdf4d1592b 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_target_mib.html 211d2ee03081932704a91224cccf7e3bc32accc90c85101c5f7ccc1e817ec788 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_user_based_sm_mib.html e39ff3399cabd75780a0295ab3b3507b4943aef4b190cc9fbe9c6b4667924cdd 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_view_based_acm_mib.html cc0df2b8c3745fe40e14709d0ca51abe9f65c7a0578e85465a03d1cbccff0a61 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa.html 2ae6eb879e2bf63144515a41ba5033b6035938b397352106b54eb8677486f568 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_conf.html 77f9dac9d8ab6afdba44535f81c0d76cb10435bbbb1f37ff14d5edeea7bbd3b7 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_discovery_handler.html aa73a203aea1429063b6f9d711df3ee1d9c3fc22c7ce4060dbcab2adffec6403 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_error.html 14db1d7feec18a9af8edb6db177689cc0a3d8080354030a3f8d4af92027ac20a 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_error_io.html de65b4d18787341413be70e204105084dcd59f63b68dcead153b5b1da9214ad2 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_error_logger.html 9f49effe3c4466584cf0ee413639ed3006a552a35ee421f52fe9c06d70ea9b23 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_error_report.html f99d28d33c1982e0d88a1fb7cc472af6ae5ff0d689ba18591a133ed07b82eac8 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_local_db.html 57d077ddb2f713c36b5bfc0464b8e9aeb82b68202eb1a9121a4a6220fa937b4b 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_mib_data.html a53845de9c871d82a163d3d98baf94291aaba04dc22493a6fabcb96bfea74988 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_mib_storage.html dda4da9868afd384e522f7463f1280ea9a741441f397b8b5228f9edd2f66b4aa 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_mpd.html fa759e6ba048224bb217e30d566a9a32dde791d3af1a0ac7ad414667d28d3073 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_network_interface.html c8008db0548836eda501c554fc7f96df4ffb4f3732721d2f9f5c5d21feab40bd 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_network_interface_filter.html 285cd25e7d8a983ff53ea54b7b587081ba6c4c99822298aeba648ac0a2991085 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_notification_delivery_info_receiver.html 760d75a1cfb7698357e5d872c1ebb83270e1f383595335dfa868c6a936abe894 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_notification_filter.html f772f7b7b5486fc05dc1ed7602f1ede837977d12b7e5fde4465ff3b5ad7d1ec1 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_supervisor.html 4bbc3273dd07545cd9c7ddfcc140c22cc2414291b04aea3ad39f7e3e18f725e2 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpc.html bce740e8a544d00d1fb9d29b4c94f800c72dc4f2c934d83898dedbeb4295109d 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpc_cmd.html c952de3f5c9101c9cb89ffb83339a382108df385ba78e04f676dedbf0577035f 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpm.html 0989d07df868cee67b9342b20f0b4bcc602c6ae234dfcb42f64e2ce66ba514fe 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpm_conf.html bf12158c37244bbe69f57280c912f8e68ef62095f867cc8b5d805969664ca808 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpm_mpd.html 61350eff17079ef365a15bd552ca4fa5352bbcab9af268948539c1ee0a04ecff 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpm_network_interface.html 807801c4ff51205aa0cd649b7cd9451335020fce8fb97b97b7b9ce497be8fb38 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpm_network_interface_filter.html 0f9a2bc9c8e5939d8605a4d8482c24a05e7120e28cd78adc4e59cb1d0b07ee4e 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpm_user.html 79d36cbf6f3414a65eb9553cab62311ddb50036bc71ed1d34772bd3cd07dbb36 2 @@ -3899,2 +3899,2 @@ -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/404.html 6e9c93d3a7f70ffc780894becb985de088da092f79629791e70b6759cec718cb 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/api-reference.html ef7eca514a65e9e0fd624b12dfe74a39b687dfbbbf4702b11c0e51f910863294 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/404.html a713a6c5a8a945763b6baa6214590cc04338154dd74ac75a0e498a7813ccb613 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/api-reference.html 3cf57ccc2e3d6722718421fe852bd997cd7ad9e4ddf8ae36701163814c7cdd22 2 @@ -3904,2 +3904,2 @@ -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/configurations.html 892d4cfc79528ab3f43e761d9070909d0edd7c127af534a84cd1ace1c4ab0f78 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/configure_algos.html 81f1beba67000ca97e77006c8d371cac3cfcfded5775738ba916f2eae7af72b7 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/configurations.html 8409497a262021b5804b7328b27a6100eb332b2fccc556bbb8d436992cd87df3 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/configure_algos.html ea562abe732de2fe8e25647a5db2881d25cdd58bada0cf2a1418f084716e7fda 2 @@ -3926 +3926 @@ -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/hardening.html d5ee429d5b912de2562113cec0b5dd4ad0953de59602197c3d05584b8f191559 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/hardening.html d78499171e25b0a61bfdd607ed6eb0d858c3a210b43d8874ead2d4af4a790c4f 2 @@ -3928,17 +3928,17 @@ -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/introduction.html ade2d124a7958e4fc0756b65a52160586473aaf1b1db4ef21819218c6b834968 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/notes.html 7b0831220904d055d9ea1d1029faf85077850daa0a6596644389cb9e4350dea8 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/search.html 4438bcce79ae0bcf7c0484ae272f4e13be39fe303ad0fc8c53f47534a8fe3d8a 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh.epub 2212fcae89871f2e7dd8c180558ed5ac0602f1181a045c2006643b3bb0bef23f 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh.html 0baf3f1849ff9bd0b68438ab469b7fb2ac86eab783ca3fa109bbd6fd0b5acfcd 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_agent.html a7814ef1252d9e72de7ace95fbea410372bdc1ec169190ffebe4e8a6e5ab3154 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_app.html 6ccbcffab31e9b6b74a3a05d42608ce022b7d2b76379423051c1e5157076fd6a 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_client_channel.html 99a2a41aee50afd62f30b5ed71e2ab6015b24f2e0f12be24293fa9626dd97ae0 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_client_key_api.html 335e090f9fbf219f505ab198838c610bacaacfc79569d5a0d74c4238caad76b9 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_connection.html 15ec4ce1fc6ccb3cb215ccf30e4d15960e5312d3affa780d3d8a5eb19993a427 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_file.html 92dee526ec235ab9261f12addd2d8d0d05776e9b624b20e74f61c895d3919053 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_server_channel.html 6b41fd0dea58c6e07f9e014bfc4179e6c0210bad56219020eaf3d13e0125f045 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_server_key_api.html 8b501152c682cf784a443da49c7075da65bf7cdf251457ac472ef405ff51056e 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_sftp.html af51f61d60f93268b80ccf270b16c62445249421e36489e93481485ac159efd8 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_sftpd.html 4f5286179e65419a0d36b506ce3dc51ebf35fc0ff141e3595fc1009d53779d7d 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/terminology.html 13b70af5cfa61c5992580d9059faa1c721af894f9a6b0238c51daa9c9aedd121 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/using_ssh.html 131cf905e57d1f876c3346bb16faf6c6748204017a788590c8f83874ae7f6688 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/introduction.html 52bb4e4cba3ae59ce7063448adb7975cfea92eb069ff988ac4ce2be968d32dab 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/notes.html 3ca86bc6b00c9091e722e508be8be292f23e299ecdfa48fb4f5f63c7594e6ba4 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/search.html 8fe7cda99d967c851ec5ee24f5e9570c20cf26c5df732dcd29e1dd4273e640b3 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh.epub c46e65912f0452e8494d772e7dd61e45a2da5bf6e9e0da6ef0fc97a1f3e248ee 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh.html bcdc509e4c99cdcde2681096532921f08b5685294f20c978f9146b5172f495ac 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_agent.html 2034b2c007ef78260cbe1bf6b8b2934b29ed558e762cb819381b55a4fccd695e 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_app.html d1187531594f9072a87b419b85746f8146e50f9a88e5d74808c815ee6c151e40 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_client_channel.html 78d15c5475d6aa6dc7b7e8b8841a3ad3a8a7c987bf9a06eb4a33250cf9559bca 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_client_key_api.html 16a1d32c3ea6aa91f59f69ba7f2ea4ab6a216e18034c005a3d0908a53e892c83 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_connection.html baa420b9a56395b571da82ec4fc3f41d3c0cb6b3dd282b91eb7136e4d64e0897 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_file.html ec2380d8c3c927ad8856ce972090734437272444add8f93b6fbe6f595b31b8c2 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_server_channel.html 58a57762f118eb99999d099f168945e0c29bdd77399d38b16a3eeff933039b44 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_server_key_api.html dca6370e7cee27bc95cbc7b00c7e21d53289000c52af6641faeae1a03695375d 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_sftp.html ff4adb5808bfd4b60bb187475c52bedf6b76b1d3f5f7968d7fdffc6d722d2b92 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_sftpd.html 40edb7d6ed02992db1ead3980105e77c22c897af1cf4d08e79c3fb0832df0ad2 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/terminology.html 7b959808a81a417f9d06b9bd911bb7595c4808e9c914c9685168b6c69290f8da 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/using_ssh.html f508de43aee6d2878918f8e0161e5fecfd962f440d597d21a85a8544bd9c3509 2 @@ -3948,2 +3948,2 @@ -/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/404.html 6b767a9386ba1ee9cfea9d0cb516cdc7cf26a8f9da33a4448ef707ce1e7e6341 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/api-reference.html 8e43c07c36ccdf228bb3804053751f414156be4cfed4d37e2c2ef483e252e062 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/404.html c7ad9ddb7dc8c40629e667d7505218a680d736dc45a50108749f79a5a42ac356 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/api-reference.html cbb820486077f8d1f61b45e88830a56bf77790a4a3fbd01c443f7c24e1f93cf8 2 @@ -3973,12 +3973,12 @@ -/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/notes.html d671ca2e403750589b9a933b64da4185848bf078d0e260674f6912d28019118a 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/search.html 791d791cd498e39cb4ee033f56f7556749adef8ed3e6dcf6e0a6b57bf5f8f4c3 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/ssl.epub f566166c4bf3b57a34f8a84d25df301707bb2c7acd6bc333a89b88f77b22e816 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/ssl.html 812162b3053bc16be80641cfe6ef3cde7b52ade5680c0cbb945b0fc761547754 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/ssl_app.html 0208eeb88ab24bb51a1fa051e5826b04a0256998fad663dcdbe82deb7d10ef75 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/ssl_crl_cache.html 4922e8bbef68a71d6f9bc7162da90a0e3306bf6c062f79add6c5d3602163930d 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/ssl_crl_cache_api.html 6f72da2809eb9a60bbd54a65d43220c0c725e0e81c24400a8f9caebbb84e14ee 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/ssl_distribution.html 34e65c7079d70d2ab22d07bac96e3013abbc2c6dda4bb98d1abf82581d6c63b9 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/ssl_protocol.html f4a05b211de6d3905d8e99a60c694036533981e6395c19e11bc95393c63ea788 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/ssl_session_cache_api.html 64d7d6c6a3200f267a12c2f927bcd057e4138272879e46859d8c02ae3658b4a2 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/standards_compliance.html 00ffea463adf582d5f7bb8b2707104b1eca2e249af66d1e1807d9debf04b2226 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/using_ssl.html 75feab3f6f8cbc7ff2d69fbdc0c7ff6a2dd1c0db773647a1c15108b9faf60597 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/notes.html 73d4084a50c034ca5c5ebf32d088cd403ed9f96bdcc5b623d35122562e39ab1e 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/search.html 232c243bfd85dff6c482e737b3b20c1fa2bc3b29cf2fb6c5d353a263fd89f555 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/ssl.epub cad79c60cbe1f8c9e6a3d23ba7ce0c897ee685afe16d8036c95c76e883258697 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/ssl.html 545f27ed8c0ba7e2f991d156229521b55a632ba108103dd116ca70185c832c10 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/ssl_app.html 54b52ce82642fbfb66fb36d1ef6eff63cb83f90e6cbeb552ff4ecb0b6e8d5991 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/ssl_crl_cache.html da85e841b80606b32edb6b4eb64eb2fe9f487d4576092089bc391452fef51b8d 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/ssl_crl_cache_api.html 1d0095514451b8b4ae771729aa4790f04e3a9e7778e6257c294c472b880a8365 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/ssl_distribution.html 695fd64834420210e77fe4aefdbc1e5f1e0b30b24ede0fb177a208220d84600e 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/ssl_protocol.html 5018873cfbf6cd7d939720e510f3c66c7b5a6d755f624a8ea68e426308681347 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/ssl_session_cache_api.html d7dd2f2eabd7fa2eda9e310287788ad39b5e896b697356808186b66a14f51402 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/standards_compliance.html b12cd8b673adca52a2193e748f1318340c1d1b2eff0b09f51fe6cdaebd79fb4c 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/using_ssl.html b823d91aa7bedbf5c69a70ea5dbf8cc9b806bc8459628c3d70c68fd5a5539dba 2 @@ -3988,5 +3988,5 @@ -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/404.html a1f3d24b469b550740f5280b0d1c40fec15f3ba2c0060ba79ee9f4ad3aa39aa5 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/api-reference.html b01bcb21dc9d2145ef79753a9edd770877de77b4635a25bf5248ecb0b3ad62d3 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/argparse.html 29e0981dc112683bff52a945f0c56f3f1213931bf5638b31ed736ec3db18793f 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/array.html 469244151fcf0cd62562a2fe23eaf40d4fa13d23f64991254c9ee58c2aadcc24 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/assert_hrl.html cd6289270ee19c83e629f33c6c99bd51af73c2289bb4ff71337263a6a55a4a87 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/404.html a2b7f360a7a24aacaf9c3c2b22320e9e3b6f669212a348f625885ea3a0259fc7 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/api-reference.html 610233d59980c859481193b58cd26ffc307c3f01cffab3d2f88a3badefb67eca 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/argparse.html dbf18c7057afa7c0631e300c04a8a559fdff6cccf776c9272e71c7c0e43056e5 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/array.html 94877f9f554ee527c9995138102aa986558435be5890ca6aeb2b1b4f5961df97 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/assert_hrl.html 3e86c3e021bd87d29650f97d668bd203df591897930f92aa244185c0331e101d 2 @@ -3995,9 +3995,9 @@ -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/base64.html 71fc550cea89093ffa854888087345a4c8a59e9bef40d4a1d606b30a3c179c2f 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/beam_lib.html 6bd9b3f65fa23da7e94f350b8471179a021c027ff738729d9ac74b8e1b50cc49 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/binary.html 6bc31f6523494e0f61f5509b8fdf0de0790cc3a9e4ae18751593be7bdd068c40 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/c.html 957f3f25086f531fd83fbbfc60705d16b0a6a3c4a8a285ad8d65bc6dc392e341 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/calendar.html 0d7c547160a8efba8d921a81366d33ce441ed22a0477c676da5a261442f598b9 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/dets.html 22350ead76253544305c786cda42160798ff3861d4c8f752eae962b720d566f4 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/dict.html 3f656344f37b0f176cf4265baad35b10c0743087bd6a3de909b94a338d705efc 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/digraph.html 504c39bea9c2b7f3d0fec383410486e5abd0f73e54c833229b456b3b983ad6bf 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/digraph_utils.html f3265af12e8d254b377c19b7814756b202cc7e93c00718384b8684362e46cb89 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/base64.html 7955612387b7738a30fee2a0b838daf1e29d9409cfa63a25a3da67cb6bf6d768 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/beam_lib.html a122ca9e3bd40a10d090c3cd2598d5f51dfceb95c21443ef6e65dec1511dd251 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/binary.html bcbfe58ad0c28b87f28b836dad9e3988deabe519c233d38fe011062781a7ade2 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/c.html 6af0bb26c9a7f355b67cfbc3e7da648e47485fc44804da96ebbae02c4c2bffa3 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/calendar.html 31d500b4df74cdd8c759198df5621c63206ab250ea14dd5519fe0d3cd3ead38e 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/dets.html 7af90b3061bc52d4fe0adfcb81b29568a8973d2f1c16be11993e4a4ad32d1ccc 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/dict.html b33afee6eb9f116219442a9a361e27db165bacd2d20037c3e6ce5ed94f23c5ca 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/digraph.html f63f1795570a27ff0cad93daabc1e35e0837a78332c07eee881503feb12d1272 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/digraph_utils.html f36d9a802906d7e3543b1256422c33a89ad21befbc83607ca88b63d441dc15a7 2 @@ -4024,26 +4024,26 @@ -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/edlin.html 6426ded98b719859040a60ad79cfbf6508cba963e713c9c535c9c5eb62eec447 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/edlin_expand.html a3aca198b2d3af44dc0951be8adc822a0559b1792f67ea31b953fc6c2e3e04cf 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/epp.html b52e30b09b812b9f41871d2b4b83e8dd5e8c5bfda2e2e45ff510d882bfe02cb7 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_anno.html 97b11c3f852fb22fcf520cc09dff1cb0c903895add47e272c7af9ea1f4031ae4 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_error.html 02acdcac4ee99090ab782be20a8df03475c9c1cc75100edb11afd942b4e894ec 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_eval.html 1551765f31c53f4997242db158279959ec5a91ae4c706ef635dc123fa3ace42b 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_expand_records.html daec817a4bb93a0e886def8ff63fee765106a7bd9b821b7b1844b5e402a9fda9 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_features.html 439cb9f28323b69e86aeae98db5c72df9c93b125d8ad27ba7364e627819897bf 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_id_trans.html 07cd7ab6532be7de6fea474bd2a5ee9652cd9e9ecc39fe8a77f4d343ddfc782d 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_internal.html 62cbe16c89d0e60b83e017fa8398597f9cf80280b3ef6ba45ecc2118321a849d 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_lint.html 3b11f000cf34f6a05ed7bc87d544dee8214ec97cfcacb89f80cc7424dd89a5da 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_parse.html 652b16216902f417868beb3567eb7fcab9a510a9a3da41fa77f12a86d337548a 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_pp.html 4a43cf1fa8e77498a6bc3141d9d4a35f95211720a6dfe802d5f28969583c8c8c 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_scan.html 681fd9fa0746edea040c95c4aa2ade1c343c26dfb6339597e16b43acafec324d 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_tar.html 90629a5f5c7288a1ef2fbd880efb7288ea4e523b185e7929d251cf90d1527c66 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/escript.html 020da3d68c8b3287250cce68f5a9b29c092182878ba3d53ee8e3f2b7f514b00d 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/ets.html 7aaf23eaebda5c2a7cb4acdbac93106484edf9bcd2a2b3ac0c68c512a5b2a85e 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/file_sorter.html db8cf37e374ea7460698d80ec76554694757e95fb7606e5b92762c227544b0cc 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/filelib.html 578b7f9f07518cae4394e3b77e5b589c753315b775fad7d30689ceeb35ca42d4 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/filename.html 33cf9c8e0882a3d94fd03f48f37fdc3754da031ce70d1ba195bd11c2d0558abc 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/gb_sets.html 472355c304a487da63584e45337bf906b0a9cbb8427007ed2536fd075cce8f2d 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/gb_trees.html d3f6000b850927061e3539fd0263e8ef7afda5761c0fd7ea018660c43498b93d 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/gen_event.html 3a08956874e7745397d56b980fc82ab191295865b7b4637279406a76a1b8c33f 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/gen_fsm.html 909871608da290744096c7d82860a8110ff2e3df2c04c0487ba3308383e4aa19 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/gen_server.html 8ae695dfb1327d0670bd74a7d1068e6c41f49b3694b5c801afa29d3f59c01e39 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/gen_statem.html 2384840431d6e13e27320e63b16648ac144762565cfb238b347fdb92e4ccc7b8 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/edlin.html dfa38483c3599faee2ec672b4721f72e081ae59be87b5e42de194d9e3ecc2f37 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/edlin_expand.html c3a8d0b91c9d7b51a5cdc41c42b88b5a13848402202baabe787d5e770033ee9b 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/epp.html 1967763496be3643be09dd7020b10cafcafe6dff0464c5ccaa293530a1072076 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_anno.html 5057d641c2c017d15b7571b22aec7ffe9e3b5e8462bda489d75feaf65fbb3a9c 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_error.html 6e55152cdcef26e72923628b0e29f556c420a43555dd7c578d58941274a86009 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_eval.html 799fb69c26edabe9d5f293cfbf7bfb495a62e2191644755ba76ecc00a160c882 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_expand_records.html cdea7bc52b0c3e5fcccc176567c0ecb8a8ec641dad1eaad4936be490fc63ca13 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_features.html 25ca237d56143dfe751c3bfc12851d08698686402b48b33ee9b3f6d166ae953a 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_id_trans.html 06013b138c37050cfc2aca5300bab544db19a831ca40f82712053d1afceedb1f 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_internal.html 849f63b6f3977bd83fd111e60d0ade319eaa0bda4e89789a4ccd6bd51d13cb94 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_lint.html 4c206fa637ffbb6456bad8124f1d9b6fc061359463ecad18ee2d08855ed6cc37 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_parse.html 957a8345c6a9f2640d70e9eb006e75098c439beb02d59edf1ab4850f6a03ef7f 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_pp.html f75332d662c70f431cce426e528e2e95217e12f3bcd9e7aa3be2e70462a524bf 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_scan.html a52daa288af9349b82b6d6c2899c6771e01b4e2bf36a625e09baad814d0cefb5 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_tar.html c8ae59178b73180eaa0816c0a2e5b6d187b1f4aeeb575b75d24cc8d7a04cc1ab 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/escript.html ed7401f32bdb7a14347a91961c2ffc6da8bb029e4ee92cc0dfcf18d7da303766 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/ets.html 1f4e7c1659d7f30fece889d083c2d09f1d9a0d8befe83a7687285ed9b831ed22 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/file_sorter.html 74e518debb5721d636b0fdc58c8071a69973e4ac30f16a20f2ba6cf9f61c47d6 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/filelib.html b1216d15a85a3336271a430073e59088f9a3a9d065ae5b5a357f04139bfa3c79 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/filename.html 7e26effc5c53bde7bbde3c4886cd27e024aa7a0d81d71e7472497e60f5cd9458 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/gb_sets.html f963d2cd3e2e22bba325171cc91ef6e3f09c2253578a544cef9a2397b942ac3c 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/gb_trees.html 98f0e9bfead986fb1781bce0f14c69cfb65e7d98839135424177220a9aedfbb2 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/gen_event.html ba4a2b604a9684c20e83bf82712a3c30f1d751c3cf4db5ee1273402174ab0ccd 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/gen_fsm.html dd425ef8efa7cd522fa2be625d01ee260ca0d6cdf9aa6fb2bf2d664063659b2c 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/gen_server.html 9a35f71ea14ccae7d597677481e4b88bc360a3dbf8e5dabb378632ac0ffcd98a 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/gen_statem.html a78ebe1be5de30c0d7832625a3882f036071322f26586745f3721a6cb39c3313 2 @@ -4051,42 +4051,42 @@ -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/introduction.html 033581f0dbdff655c95456751e193daf834a8275729452ff0ea769526f57f812 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/io.html a2f0f1296e132db58cad81d51fd1235a5a09d7c9a5847ddeb4474a23d57cdaca 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/io_lib.html 90289eaad07bcbbe7348090ee26a2bafc7f80c978e927acdf58ffe69813c2697 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/io_protocol.html fb109b75102df7f34e208187611e453983a0899d3a455a8d7b39691e039646f9 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/json.html b56de5898791f9948dfcd09f6d71365d1e1dd1b23e8a41e5919943993315df6d 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/lists.html 87ab6d0a4b072e33d01307a8000750f47e4d1b0ff067b863c9a8fc986d542884 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/log_mf_h.html 3d6f753ea960cda8957bacd7f60c0b11a45c2fb483ed436919995b4be3eb0e89 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/maps.html 9f588356027e791634a5db9c519814c7fd617c8a66c62c7c39f0765f9615296f 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/math.html c4fabc460434ef10f41acabd60443d444fc576d178db5a9bfbdcc03197ea655a 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/ms_transform.html cf51dda7ce604f91762996d33e184e211d1805d863792e37dc249f78d78354ae 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/notes.html bed7bf75304cdb6c478f3067424b05cc738019b44511ae6ca6773fbc68c4813d 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/orddict.html 0d0bea64520a9f8fcb483c42d78c161715aaf9a08edca150522464fe779478df 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/ordsets.html bb865a39fcebc70a55a203b4f2e3fcd14543229845bcebbbfb8ba49c3884e609 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/peer.html 8a43cf4fa4b6cad831c22da109100342815e51900847c867fecaec66ecef90e6 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/pool.html fab3b60a471ca68274c32cc76883d335f35916ba94b500c50561a54f41317ccb 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/proc_lib.html 8f09d5ddc8fcedcd9768bfd31c65d38b53d09eff65ef8e491f9a37caffe97ce7 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/proplists.html 0bc3cff843297ac1e5c715caad9c1a49ca26ef9ca30f8934152626e59b38c97d 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/qlc.html 6c4789ffa168e6db0930c7ad7c07f2ac82cadb1c9becd8ab3bcf9eda4448e20f 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/queue.html aa7da380864cdf82bf63e0f590e25e982d26c5039a33de0c290e53e8733bb9c1 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/rand.html 305104f0d27242b1568def7ae0397a2dcb16af89f4d07d39f40dd2f019729cff 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/random.html 05474425da34a73c1eaefa0b6ed44d319b4ee96a34b5afe50953035c84c04892 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/re.html cb3423d04ae1478dd2cd25e1c2ea34ef66cc89a73f67cd2bc59ead2560a9c427 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/search.html a7fc990383a92a5f502c713770cab2663097c75bae3915f1b2828ebd9a534add 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/sets.html 27e48a1cccde124d673475c4b669b1fb7d195ac22e92b0a174728a5259224768 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/shell.html 651e54c54d2d9b2ace1d86a00b674e5fc72591ce742a734934fd89c780fe14b4 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/shell_default.html 43db016396a0b74c0468690eab886f44f84d7716beb89699402ff61262189b3e 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/shell_docs.html 6b98952342667977988141b7254e598a217f9fc48d4d0098f388d3cd022a5b5c 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/slave.html 5c047ca956fa0a7cdbccef77d07e0bbd38b0dfce75060b8bd23b1751dbb479b2 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/sofs.html f7ee2fc307928e5531c4ac8527a2cc24342223b7694b1cbea355f160fc89e720 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub f9f74d68ac9bab03dc3b7ad8ab7df7e6a7927fd450caf391b998c424fb75d141 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib_app.html f7e5d11d03ebda0cd2767e444c27a7115dcbddf43766c49091e384013c63aa9e 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/string.html 6b2f85a013ba9b33e12ba64af17f446a3c4a7d060f7e9cfb5673a5352bc36d23 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/supervisor.html 61649b0758584d29a66c57af09caca5d9a2751e1fe7c789fc7f243d8943c936a 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/supervisor_bridge.html 5e3f8e9915d5a470f492cb1474cdf91b028b235806ab078da0c3213588dd8b73 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/sys.html 37d331f4e74005cc58144e74998b69f887563dc7666ed8a034c2bd4da1979b0f 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/timer.html aae6fedee861bacb4e5fc4f43879789a572d1101d6b731d7b3f4a3ee0a735a1e 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/unicode.html 5f1c406907c6416975ec9df1a06de7ddf57263f1b8d890e159e310ca42911c88 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/unicode_usage.html a6781f7382d96d2299bb0cde345b2167cb0f09c207fc6f288686102feaf90334 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/uri_string.html 64a0f5635b2c8b7d740e5b1ae5e851e6b1038ab16e363052667c1d61a2f98ad8 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/uri_string_usage.html 20fbede654a08d061e45684980822ceff2fed45bcaf6d4cde9a763e1a29d9425 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/win32reg.html fd3f91c1c550e04b56051734bb67f82e24b5d591c72c1246bacaf2e08ade4779 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/zip.html cee224e84e29bd28ac0473fb17b7ed7c7e692ec86b12f5e8a8d28af0655d1d6d 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/introduction.html 8d0947146c5344c7b0ad8a58f5a1eaa84fd4a873d2af9e204bb935b111b233e8 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/io.html 66c7c3a2ca615cadbb0180a235fe44c40d601b03b49d86f98533123f4452e890 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/io_lib.html 64d885d3a706e2d1b551d033b5ccecd68a5f516084d147d34fc9d94040be86fd 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/io_protocol.html 7544fa2afe5fd452ab417557c174d545dfc6edfd17e3c151d872689772671d77 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/json.html c46bcee33dab1e05cea0faff41dea6f9f963b7354e8d8e7a064273812b6c2f35 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/lists.html efbdccc6af2c763456564ff51d2e8682bdd0c202c9c7c19efa92c35ec1efe309 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/log_mf_h.html 32043dd2375478839705f26d8a636f7dff107d633b6cc06ca3dabe9055ff4486 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/maps.html 8b7044ff575e1249202f599fc6501ad7d8a8cd6939957a5985112271cd2859ad 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/math.html 5c5fcf58f86fe0e11e5c7b2f4ba90ac8262b32826a0aae0562294e3974a9a940 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/ms_transform.html be871c88783f4d5a548151c10d0232444ea9486631d34b4c52074f58fc83a6bb 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/notes.html 41cf533ffbfe14eef10eaa5e5d9267ac7f5cf4c7b82b1c96a48ac1a7be844697 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/orddict.html cdf86308e1257dc9d53402b62bf57d83ac2727630624eb4812ba1a0c90c76d5c 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/ordsets.html 9409b9560823fab1f5a515818047ad838bfe68abfa433b6419812da16a40bf93 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/peer.html bcd510c9628213b2b13ddfff987b8ac85b38fe3c46a0a9ff4a037d089d5ea96e 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/pool.html 39419d6d958a5af63490ae2820d52cd2755f7c41a41bc0ec41b13d04df7d5c6a 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/proc_lib.html 48c05c665ef1e170b323352fdddbfabf48d18ef2e497ac50e3625452e0730b25 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/proplists.html f909f1fbb594218de4a4655004e57c45a98422862e657a9afc6c161c07da0250 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/qlc.html dc06d1c75d88bb879672130cd1420d6435fe0cd68f32d0db9d92ef22365081a4 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/queue.html eb15ca2ec065d8b408c04f980c1650f17e2543317fd73d1cc6fce0f39a1038dd 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/rand.html dd8aa48643ef4772bad42efbac23f3eee850c2892e379fd90ccd89b11726ad0b 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/random.html 39edf37e1b9a6631aa027eb5c22ed19d18433da995db14441acaa58ab1da48be 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/re.html 46ce1840c272132ad6339fa859b3ac01e8d46a416fdee96964d0b61db72658ee 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/search.html 72f33acd90ef806dc323f086efd29da0c8c4bafaccda1508751d361d9063fb09 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/sets.html 662e4ba5595fd663fcab74801bc4cb8b6987c0b67a7afc28ed8f41b25ae2e750 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/shell.html ac2fd226b3ceaa99d37604460577ff7fbedfd26578e5671488a9c75d41624ff4 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/shell_default.html 93e997ed1b55f93111e1bd57920418401420e85f95ff380c0d811a687f78a00f 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/shell_docs.html 39387bf3a5dfc0f21ec36b50cb4967aec5b78eb57f8f3d3b196856ab4a5ccdcd 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/slave.html 8e3c1bfab48fb146a66563a4bb7ad70a79a3d96fe9475abbcb65f8a5368d66e3 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/sofs.html 5a7e6fae875a217ba664cc96d7cb3beb1f390907bee3f23715fded916e28b0a3 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub 6687432049386e918529d5810b1c6d28be3a2436ea2031bc6c6547bb746c3708 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib_app.html 7cb888e59aed4491be055f5e853217b7769abbfe204389ba9448e303413e17f9 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/string.html b207c7459a58c8719eedef747c90941e74d59fe972b95833c87278eafe0e72f5 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/supervisor.html 4241ff27fa8ba207938c4b6becdf42279f63479443879151ae98893f54514ff5 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/supervisor_bridge.html fded996e8a96858d36b593cafcfb518b0dd0d93f7860d87fb2de56a04ee23b77 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/sys.html 92fb6232d19dc2ec78471faa41106bcbcd07006e3d38bf32df301265a918ac0d 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/timer.html 0fd2e35caa210ed45dd54874524c9c975ca11ac3b208b5fac46a29bcf6680ad9 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/unicode.html 993dc15792b52af5402b82bfb9fda807d5c64d231bca4c9f0bcfeb4f3552fc44 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/unicode_usage.html dcb8337e4e42184b973e24b6f189f3e6e9b338d5796d8d409e6ccb94ddaa055f 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/uri_string.html 5b6bcc06e48b255134e76779cb82b972d50869ae649e40d4591c0d0c19b0242d 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/uri_string_usage.html d553fe3cf5a97c46a1a4a9d274899103c694a85592fbdd7257a696ab0cc8955f 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/win32reg.html e9114d7e303158bbb9b5f83275136545c57bf0931d0b1cbb187534735a5eeac0 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/zip.html 793c83463c7aa2cf0c8999dfa12b6284f6cb8a0fb3bbe6ac7ecf3f590e8cb8b8 2 @@ -4096,2 +4096,2 @@ -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/404.html 0dcea85ce92799618664e3d3b6a9e07136f0904fe4fd500ad9ceed61261606ac 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/api-reference.html 9c8eb9b3470056bfbc7b83dd66fe6d73f780296b7f526112e4f4d3802c0f9150 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/404.html 150eaa318210e1d7bb79c19034fe672945e71b358b045a66ecc5cea55162011e 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/api-reference.html 6d4c81466e66345848910342908df194f5d31f0f3983865337fe0dbc9f8aa7e5 2 @@ -4101 +4101 @@ -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/chapter.html d394f0211e05bc938cbf5ed4ecb2ec05d46b01dc50898bf3fd9795ae8940895b 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/chapter.html 6c0bfd8d58c4b1d887d41237f5ad091bcf9b9c3f6ec11d5780a948bebb78d082 2 @@ -4122,6 +4122,6 @@ -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/epp_dodger.html 8b30fdc1d1be31224ae390e196b7ea4a3277b0113a6dc0cca6cabc43f251926d 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/erl_comment_scan.html 941ba6015badd34f3ca07172863cd720d0dcbce9141b24f6a97213a2c8e7c559 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/erl_prettypr.html 281d1e5f8b1c23ed58f0b2bb33a104e0c7931de265b03ec946ffac82f75adb3e 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/erl_recomment.html d1ea40cc99f86ccf639d2c612a7b1e438967949a3fe41ac5f02d4c379e166b88 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/erl_syntax.html 0f15f2c56de487588cf2581c36dd35992c4ad1c2917ce4ee275cd658d53ab51f 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/erl_syntax_lib.html 7745eb7e46a2ca9a1e99ab5457f5218a1c9798d9f7b6c5d3721ab2fea38ccfd4 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/epp_dodger.html ff5a497d4f4013ba221a7114fe1d13d8fbb780a5f25774892e5f2effec30e6b6 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/erl_comment_scan.html ad2570bd14b38d2abd1812f1db4778235469e2f4e30d374d129208239e404ca6 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/erl_prettypr.html 07540caf08411f2ee56a967b058964999a5335276b100f09e047e5b8c3742888 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/erl_recomment.html 6db0000dc67f8262d27f28f5bdd4031d5e29fb71deffcdeb23625be2e6cd3d70 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/erl_syntax.html fce2ff9dca50d589e0ccfe46efcd3d02c41aadf3a963f259cdfa0d6efad8d1de 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/erl_syntax_lib.html b2a87f31449b45a2546810cb73426a10bf73f6d701c8b9bbcb543715eed4b488 2 @@ -4129,5 +4129,5 @@ -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/merl.html 4af88ef64631cd701509933fd058d64be7ebbecef8ff4087644efbf1b141c7ad 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/merl_transform.html ebff678611c8edfb64f96224bdd92628205322ec2a53e4e6daec7beeed902e54 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/notes.html aeea06119eced695a326d92959cf29a9c6d801b12a5654f55bc0a5f727bf627d 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/prettypr.html f975ae83bbf78564376d5469446cec035ddf4cdf274769354a966f344b3d8df1 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/search.html 37ff400e5fa60bbe59446ced7c74659c6205f4fff4eb8985a0f58010fbf53789 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/merl.html a5a34b3b5ac01813b993aaaa8f0a614fdfa76acd268df9afc79eb2c1f44037cf 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/merl_transform.html 4b3972c392b9bfd02805f975294cd3ccb2a1ebea5817e1982c19431abe9e5df9 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/notes.html 2f22205465efd4783b5591a5ac4370e83fc0a5bbaf5474474b36b476bdce6a5f 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/prettypr.html 9f10cb81a6f48968a008510f805df2b8a88517179e67f6e08b0228c58e69e984 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/search.html 474d4aa83a20a4ce8c73ae4ae97c0f337ab4eba5fc7217178af8710e842747d7 2 @@ -4137,2 +4137,2 @@ -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/404.html 7c948ead3ba032100cd043ef22b8df5c858f69e455253f09b1775a4bf8456049 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/api-reference.html 930878b6f5c8de753db59d86d5a600524f0350a933615ee589cdfadf8b3a6da5 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/404.html 8be7ac4423658502315585ce54f80876c53dfe648e488bd9d3a0d8938324df9c 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/api-reference.html 5e928d8ff8a7e35d6288c180af19363b0bd4a9f8222b7e2cd4663dbbc25d4577 2 @@ -4161 +4161 @@ -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/getting_started.html 3a8bc734ac0a2066ba95d0d2c621a4e35562a4997be5faced18e66e5ba4295a0 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/getting_started.html c8f2936624348c459e34450e7a78c0cdcf25e6a7a51a6c1cd948ee881302041c 2 @@ -4163,6 +4163,6 @@ -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/introduction.html 08fe0e2bbed69d4e9190f46a783fb5e96e9586d444f5118eb4c67bfa33eb6779 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/notes.html 170d3f8df7c539418518d4d7c49f408855e0499645858ffb8ce5a6dbfad649f1 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/search.html c122e16bf2453bb8041f1c76596d535fa9fff2d2137dc7dca5da324b6a13ad5a 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp.epub a0d9c87d42f525f278832e498d6d7fc9d03646fa080db547e0a0cb0bd9aee69d 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp.html a3d0aec2d8536a704895900e7ed8283a1a7ae8b12595d6a3aecc74d838456fa5 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp_logger.html a8cd92c083a3916b8bfcde9ebce1536e9f6ee29be9f9410de84e7c85e28f48db 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/introduction.html 761d8879a74dbde91eff4d09c39d9183f6a30e7838eb107f8a8001e88ef6be7b 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/notes.html 7cc924bef3416b52444696ccb0a55c0eecf63ab17b901a83b31006ec5c1f9c9d 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/search.html 84c86d3546e8ac48e4778510317ab7d385f16d346113c8a3850a294fab9a833f 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp.epub 4894cef05d75f6e6f21b3c9ffe0d1b0dd6e6e73427a4774a199438aa1249193e 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp.html f11a7c0018c5c58815cc762c98880c8ccd2852c309040e4141c69fc33bc8b43c 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp_logger.html 9a20747a37ba4f0465e1a9ca5c2c56a5d84cd402bbf6cc537c227a3e096ab0de 2 @@ -4172,2 +4172,2 @@ -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/404.html fb4407ba30e35fff3ca9f39d2a25fef60b10424fa16e044f1a38c952fe25f97f 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/api-reference.html be9f1976981b0bc0ca0a06c1ff027fe278c7127260821ca0c0536ccb01ca4198 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/404.html a16d1217cedfa558ed140c6c3773d8e6d42538782281abf9f946faed4053bc8e 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/api-reference.html 9b8d0a13e1bea120f3dbaff306b2295701fec06d4ee89bc2c6d995a7d2caeea9 2 @@ -4178,4 +4178,4 @@ -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cover.html 8981c4c6107dfb64bbef62bb4ce576f8a809e95f3856710865380e1c3742d811 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cover_chapter.html d690ba32aba3343123775fa8c61d82b7db78d04b1012ed473af3a73dcfa88a50 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cprof.html 15c7013a444882f5bd92d4bf9e211679aa8e18f6ed60e8b9568cbbf8a319b525 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cprof_chapter.html 653967e8cc2c16888492578e74dfecc785ea42ebdb341cdbdcca1052ebf6806b 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cover.html 01547ba0a5e520d28a15770f3ecf7ad5b0039a21adf8f21c4c099adb5b2594f8 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cover_chapter.html 984cbf24eb7f5ad7a2d6e762b1b2df30a97316c05ee82c3adb9a3481ecdee35e 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cprof.html 3326fc226fa416628276bba4ca18cee7323e245561787213d0e50271531f44cb 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cprof_chapter.html 5e67857fb43a1cf038ca4dde1677fda00104422c3a1d2eac3033f345c0d32e5c 2 @@ -4202,5 +4202,5 @@ -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/eprof.html e8d04b22798af91d7f19b491f79d053f34b58c7aca5f8924a6164c725d6e1283 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/erlang-el.html fc4e83f768e5fbe62c9cfe90be4913ee2cd71fd1e444659093c49f02d7ef8d0e 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/erlang_mode_chapter.html 47dff220b9073dcf07902adc3898b72cd19784b2c5cc77db241ca8f6ae3804a7 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/fprof.html d53257839ca07433685e7757db89b5cb4a9eb37d8e538b10c84bc93585bafa83 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/fprof_chapter.html d16091cb9b341d51c5ee8ff62f1f589425c4f8a6dc7ed4eeaf83b649cf43508c 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/eprof.html 14ff181bff9a2c45dee7733f733334a65d6c5c3f126ee1e35cde73f811d17ea0 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/erlang-el.html 31bef7d35ab9464a1d5d2876e5a9458b42fe4e3ad740d4c3bd62d1f3c8815fd2 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/erlang_mode_chapter.html 5bcfc661059989588ab59a75ca383c9bd0ef581fdf4bd440dd124c16148d0aa0 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/fprof.html 4556386447b158edd7a1683f5784445c9c47ff544a2063e7fb6df2826b324f28 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/fprof_chapter.html 727adbc389feab350fd1b587efd02a53144e43ff2c98ebea96c8be86cd160894 2 @@ -4208,10 +4208,10 @@ -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/lcnt.html 1df912a3154749d2d38b4af786564f75839efdfc0ad26bc8f8525711526a9ab1 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/lcnt_chapter.html fd495fd713332727ad3f59752b4c246fa8f5d02d71cef7944a74953fb2d83bec 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/make.html e477d2a15681a608c374a6b2b345324a877a20b5bb70a0bf10f3a8cdaa183559 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/notes.html 0f6c0bffb6ddeeb9dc095cea0cf5f327ea81b6a6572528729260fea43088500f 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/search.html dd919d95818d102c7bf767f18b29cfefb560b66f5796db2487a2511a5ec01a97 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tags.html bb944b59426a8aad978c6333ab90ce731a34f6ec443bff06c8b6f955e991a0b0 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub d2aff305a39600e07cce5059031101bd3f80dc592b66a27dc95b1b35bafcea40 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tprof.html 530975943c61e928545672c6eed746b92bb65e974183c37bff237485e843ad17 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/xref.html 7137d2ff9d9d311ea5d3f4a195f381ca22ce65d98298583baa9a4027b46a59da 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/xref_chapter.html 6bab95da77c730755814a892bec375aa78596ccd328c6b5aad233d0c3f77bfc7 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/lcnt.html a7fdf4f141095e398bb41f5ecee4ec4ea999769274422847b5fda26a39287193 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/lcnt_chapter.html 5cb95778ba249435082269f879109668af2872af5ab0a1cd51fba07363cbe8f1 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/make.html fda4749b4c8f9abbbcf0a6f05ee955f161d10d3d4067d6a8003caedc97089a52 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/notes.html 2d12a431f3f7d98c6c647a5938fed29230ac3bbba0030519ba06e0418fe2d1d5 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/search.html 1ffbce8c1d2d82d7f343e480a46d675c3b5610bd1ad6b8ac6026ab1b0a0763e9 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tags.html c2d91ea4df4af4d4e51074f02cbffcf7a2c233989c97a77d5b2c1d7433f3be3a 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub 6b8d833e246f73ed64a5d8795a54cf19137f9a7bb6b6dec2f4a187cf348a54ed 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tprof.html 4647ff7e5daa75a0080a9b101cc3fc7054aad599f77e9e3c1bf80071ff98c505 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/xref.html 6053bc029c07a353b9cbdb97084ddffc3db86c6a88a199a72e9b63965020fd6d 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/xref_chapter.html ca441adc63c701724d96fbf74aa5cdff7316221668d5406f282b1a89042e14db 2 @@ -4221,2 +4221,2 @@ -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/404.html 9f743c0f08208a05c0ea1f60200c8c4c31f68faff48c5469b377046d60b83a24 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/api-reference.html b9251858fc56bf68c460cb8b70505c487cad62e702810f93fac9e11561ae709c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/404.html c95bbb269b2f467fc70ed6ef5a85e6ee5d27af619691f7321308d4a5e9bd3a86 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/api-reference.html 9b660ee8882073ba65bf78827597762e081a86d5fb23bee4beda62656f40897b 2 @@ -4225 +4225 @@ -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/chapter.html f544af8cce4be6c2f1451b99c442628c1b91e069401cbb33d12d7506c3dc496f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/chapter.html 705ddfce3d5624b7b17e5e57f23a0dcf2fdc8cdebd6d0c968936c675dfe3d822 2 @@ -4246,2 +4246,2 @@ -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/gl.html 550a49c2b02658f6968eaac819806f5e0462e08019bb21ed7a2eb8811b0ba5d9 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/glu.html 468c2119b2697e3b03b0833569bcf45ee579316432e4e6fa1d20dc195f00ea14 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/gl.html c19bdb50dd729d636021f65e7803b98fb7d9283ce3abcf691dcc8d4e62375a54 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/glu.html 5ed0e27586f2ea3db95895fb0b505e8e3285dc459ac6088c3e4ffa7dfd924138 2 @@ -4249,239 +4249,239 @@ -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/notes.html 0cb2b0da3190e829aca2d756f139da746321ba5ea7af857df3ee454e4ca40a1c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/search.html 4718b206037e58e88b36a924ec34dd2d753abef1b22f61e7fb964e6ca6553aea 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx.epub f31de5d02b80faff6e5b3d2d96dafdd0a8186d59ecce08f0b39059bb9ea0f4f2 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx.html b2f20166e8540dbe99313dd288004f7575951286c26f10221a572e2ce2e51352 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAcceleratorEntry.html e60856a85b4d1aae7a2738fc9a58041e05999f341045bdb43cee69e995c46f29 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAcceleratorTable.html 73405e6a2fb67cce4b119814fddb1c75c9b1ad812ebc7c89eff05335bbd10611 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxActivateEvent.html 3b754d6cf3d2333465eae9eb4d7b120e0e505dc174d842af26f18e0c766463f3 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxArtProvider.html 730546fe0749c2d676f1534d866f75995edb16be8af06dcd1fa889384c35af04 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiDockArt.html 8f16a136ce858412ee252125fbf53b44e357e6be1666f64119203aa445154df7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiManager.html 1ab8d5fbeafa15c4bde4915e845839faffe0c3585542dc1e274b7c0096929800 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiManagerEvent.html dc7bbf918cc26345a266516650812924084e16d49462e46627e67af82411d94f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiNotebook.html 216a92ee0496ae6fbb639ebc36b433c229a7f7fcdbde364c521d62011751f161 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiNotebookEvent.html b10219c07161c53353b4ad35eed9af0b22ef95050bbbeeb26debbcff00b2f4fd 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiPaneInfo.html a0d7ac94358cc9b4e31f1ca08bf993b7adc92c38b29cb5061eae24b6ef8dd20b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiSimpleTabArt.html 5f01d1ab683c27c2c85457aa135afc158da528c791fdc4804a71ed55565fff74 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiTabArt.html 63f3826e51bf631265e16855733b8ece9f13f83ded6bc90e1fe8773cf877bea7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBitmap.html e6b20927795e92d45a9c15de7957f7b56692a50451862e81bde77c673d3cc08d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBitmapButton.html d6f367d1eff87ec388b4624f483224822bd97fe056c564ef09b0596608a7433f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBitmapDataObject.html 6281883f062e407d7114fd8ce91858e2a4c56495948792fd3e834b9c2c059f54 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBookCtrlBase.html 3e810a767ae97120e2b1f3cdb8d70466bc36f01f284de688be96da995396ba5a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBookCtrlEvent.html 916fa244f60223adb5efce0d34bba6997ebe251e52deff0b90634c82dcd96f99 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBoxSizer.html 0b9cbfcbc79b30bfd5f1fe9404b139e915c0b91bd0f272be15226dc59bd054f8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBrush.html 045b5b2da728239113ee6b4ac1ecf289cf771e831972dc600424d01092987a0a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBufferedDC.html 155d0556ebfaafc5e5d142bdfa8e78d59c6572801c6ea9d6965d4cf8b4ce9923 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBufferedPaintDC.html ae0414e3bc03730baec3b5a4472b8fe545dc179035e94f7a2d3b9fbb1ae1e481 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxButton.html 30ec322f0e1934c68ac736abc079f416f8061d83bd474ee1af9f7baa15d63c89 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCalendarCtrl.html 34787a531ac75b204f71f2fe9246a2d830e167e42cbeab2e372648df40880a7c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCalendarDateAttr.html b514eb0ae58fe8ad7c13eed2c39f9f201b8b9d02a2b3fdf7df17a8912c20d06a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCalendarEvent.html eddd8672d422e2e5a24002b5b651b4027001f8c2642c3e708905e9c746f113c0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCaret.html 1d54edf508845828ffb580e77aea352e49c861633aa1b9950007215bcac89d8d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCheckBox.html 0d979e006c04576e9db2b232dba95765a573bde99952f6ccc025f52f39a5251c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCheckListBox.html ca3be86bdcd186aca8d3e67ebcd025cea241c84172b37253ab95190586b04b02 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxChildFocusEvent.html f1a78ed58ff02e5db13502c8c90208ae59bd5ec78772fb162fe08f640f668a1f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxChoice.html af40e2db5fba057bc4bf698daaa3d452f508a99b8d7d1a38e3090debae346fd0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxChoicebook.html 5e9f298c980883b7522cb3201d90d53bbd3dabe26852ad099ca06685020d19d4 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxClientDC.html 1a57b61d42406c593f7ef5888fdea32e596d8bc0b1c9a156213fae996951ea19 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxClipboard.html ec3f05559376ee27665427f58193140b8fff3173fa513b4336fa84e4ae9754c9 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxClipboardTextEvent.html 4368544914f967100d4d1a44068512aab303f8c9fc8304262f7dd2f03820343c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCloseEvent.html 813bd03559e3a3f9b81df8e0228dabcc61763ea63cead6cc3bd51aa6cef2c354 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourData.html 792549fa1b4bf267d04a95a9780e4ec7a79c807ec181df4f9ba994f883a64d78 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourDialog.html cf3f16c9d82b5391ef36d380959e7740080215f4387673f344cfa2193fa3d11a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourPickerCtrl.html d43f9c736b71aea02878476665d85a818b397b8f2cf6a118dc18ef6d503bb694 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourPickerEvent.html fdb35da46226b5f441f0a87fe41fe584dd1d195ea18c72893c2bdd873f630b36 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxComboBox.html da860e4049f65da54e2724bf43d787622c71d8d136008ec257cb4d7327a96dc6 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCommandEvent.html 3e3057f7bddad6c4e50f6ba98fb6273e416080170e7d94cf7ec1d108e6c100db 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxContextMenuEvent.html 364a042022c6d88bc7feb40efd807295e1162cde4ed539e78549e7dcc29a76b8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxControl.html a09d3c4184f4bf84858d6fd8e074cb177663d7dda05bd40c1919b63dd9d2500e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxControlWithItems.html 13223829eec7786309955cc4c38f073be0313759ea1514498c3c323519f9fced 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCursor.html 90d5ad6d44063499b93a2d5bb44d09e70de84d05311a28bcfc7200983ba784cb 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDC.html 28dbf93a7e7e241911b72ae6b8e8786dceaa282bfb4ce05e26888a2ad3e04985 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDCOverlay.html 5dff595f681fdb186b4d17ec0ca0df5950cd4eb6043c0cce4cad52c582dab628 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDataObject.html 47ad6d67a5f60c842653afe84b2b3eb98d24df6ac1173a835009a2c4cc46fab0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDateEvent.html 5d52621cb4951cdc22d3ee39650aefee706a0fa354db8b5380610f284dac7f38 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDatePickerCtrl.html 1eb944c90ae62af34d006167ad28b983beef4c619e7cbe6df1d14f1d4377e15c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDialog.html b8ca06c0f838a6b3e58558727f508f49cfd4eaa6ad9dc1c0f2bb1497e4c6211a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDirDialog.html 5775f1ee7eff9bcd726a8348c78a0251312332ac362b0f33889e2df49f9d354e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDirPickerCtrl.html f62ec5f5b95ff2dad10f393818c78472840dbb7a70979a32d9f5cf910c1309b3 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDisplay.html 3cc92f32609e22e83c45d4b0925bfac9ce7b528b2976107548c582fc070a16f6 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDisplayChangedEvent.html 64c0a195400e72eda53eae4ca71b7a63eb046efd835b2bcdbb9ed6e5db694a70 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDropFilesEvent.html 4517019c89a1584c28786575ddbe20eb42f9d9d78a1a167be7f95272ea96351c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxEraseEvent.html ec5c15f82be99a391fe35efa3abde5addbdbbec4cc43785fe2f57a768eb9bb5b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxEvent.html 814d8064f7c671251182ceec21c5129d2cac68c7cd3993d745506c5e73a2704a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxEvtHandler.html c8e01bc4a2c932c987ab3ce12db7710a868e96d10e0a8228081451721348ea56 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFileDataObject.html 2c728f9b607ab30d4063d016f21bc089acf76ef526e367c022a61363b59317d2 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFileDialog.html 50d2b78c57a3b0eed7bbf551fed15cf24110b23acbb8f7be9e53f8c1d779c005 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFileDirPickerEvent.html 7b090613c90d1fcf4bf6fb78e6b16943e5851b8d12bf9faed28ff3b5f68d4f9e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFilePickerCtrl.html d8c5b28bc6c3423244cc8173ada64e4832aab7a1a00d435bf046efc05347b506 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFindReplaceData.html f660dc0c1734c276e2609db966e136ee98b25ad4793dacd4fba3767ffaca3db0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFindReplaceDialog.html 638fc71ec44f295b8655e49c262642dfc65a03537f4c182b1457366f61559ca1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFlexGridSizer.html b084d7880ed357f3abf6c59a290573203bf1f83a8208376d45bb8d23bfed54ce 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFocusEvent.html b38a4ba24b65eec3aa5e5d7c21e3298c61a8345ecdbce5e3852abde428ff6ac9 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFont.html 05dd62cdd35f150ac2814a1b01beaff979c3fbc60227d4b77e2494052ae7e9a1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontData.html 34619434bb0ce54fb3b08e331d8fde38e409fb59d9d0d9541a20c86107de7762 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontDialog.html af55f8f5ac429dd29f1d5d8f387d76ccaae98cce028f42f065e8ef66c17f7a1c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontPickerCtrl.html b4ff20f9665ff2cbb49162c10fa92ba4f27eebfc6d46d00c03d12d74d272f456 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontPickerEvent.html ba8e98ccd5de8768e9cfcad221113838fa0ab1a416006f4317395423e494f454 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFrame.html d523dc80d440a5dbe4266cf9a0de1843987b9cbe5e19900919b37ece5d997bd9 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGBSizerItem.html c76c609fe4710b5fa615453f53d2031451d62734d61ab57df76a4d00400feb9c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGCDC.html 091ca82d99dcdb5203d12121f27c19f8ba0de9487b2d72bd2f8c2908a5429140 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGLCanvas.html 8a14cadc477a3269f46213554a518bf54344db939d91e33e0e57a63d819be325 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGLContext.html 72d4902e4530f3dd698c7a7642faadb904242f370865411fd25cb0a2b661384b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGauge.html 7bb193e9040f714802ae02cf045fa52250da424003bfbd076e9deda1cb37bb7a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGenericDirCtrl.html dea6d3cb4aeef4f078b29f0aece4c361e22f715b68a6e8cb13459a6af736d18c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsBrush.html 182008016a98267f62564c0096981fa4695dcc04093e69f2fe4196d2e8f35d1c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsContext.html 4e06aa0cc204f7955efff9ac6e12add3b05ce8e488aa868f6472669dea6a2715 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsFont.html aa75acab9dab183174d694c00b9c035ec6c712d55a0e3fb1bd5119f2e825b08a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsGradientStops.html 5f1814b92f7529be94bceff83901bd86c1a74f704a2ff4cf88263c9199221571 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsMatrix.html 17bb596cd9d7e21d8d5846e16aede8805dadc02c3936294a1744a58db1cbe12e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsObject.html b77176b4f41739be3133846297df71b5741ecebca74f12ec6bbc99fecef89796 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsPath.html a92b955f1b9d51bdc6dab65a0f64f3c58b12c4c0651b127b2ed64262bb02247c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsPen.html e354e36e37243b259a85b9bac0a043d926656cc015d73bcdccce167a20cc2d52 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsRenderer.html a3de17a055a75748d56d2d34cef8b9c0811505931f67c643043c6a4e1d008063 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGrid.html d1e92396f95c776affd04559c7ff3d55940c39ec3011ba34c0a44073d55e10d2 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridBagSizer.html 5e395a0df23eae60f92877029770c1dab26b6874c9cf3a45d37a95d0aef47503 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellAttr.html 4fc3577d3b9433342b1eab108042ad1bc84ac287d0f83070b360c00861401a6b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellBoolEditor.html 35eae3ba76fd5056f7514b35299921bfe0a07d8584fed471dced4df8dee2b02b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellBoolRenderer.html a20de01b4913c2fc1df28fa9e1aafc4b628f0efe3372ea582fa46d5c1914e457 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellChoiceEditor.html 57977028838c86ef0581048cc5fb22fe52b025e25e49130f274a169be8fd819d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellEditor.html 45c8b0d7fbb53291cc5812a2e25463b5274216c19e172c8daf60074c9b45b30a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellFloatEditor.html 7cee00d0bdaf9f53c1dd17b6b8b810c55008a875e2a898e3726c63afb69a028f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellFloatRenderer.html 200dfdc38ab1cd6c54912de38f77e775c87182db6969df836edc7d23473de34c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellNumberEditor.html 8a7efec96e220925023d931d802e8415dafcb996a9b622b51d5a4b3db2a74182 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellNumberRenderer.html 8848683d2e2fc032b238cc7b21a264319e1b412286762b66bbd02be0c620a2b5 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellRenderer.html b5eca56caec817904393142118b08ac190196ef53965cfbd47e1813736077541 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellStringRenderer.html cb145217629fbdc0e040483c846cf47769e7b80f7094db6b509656f20927a30a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellTextEditor.html 938c454c701dc47f51d6cdb987ea2c5ce49b3c8cf6c88636b9a760f88e76e501 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridEvent.html 6fd7689e073bbe8e7e8f0e055948308a66a7962569c7127bb5cc15f2a9365de5 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridSizer.html 24c56423a7d70c2aa93ba83aa205fa9ecb945b25f6f430bae85f877d89d87438 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHelpEvent.html 545ba275d36ec8a2478669439f78a026b08d77966ed23da54863654d9c074e92 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHtmlEasyPrinting.html cd1efbe60c593a48ac480758f8fce293778f19318ae0fb21d14647d3169f547d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHtmlLinkEvent.html 27f672798e09e1e2c5cead9ad3b63085ed940e9f215ab6dd7c7addcdbe3a1724 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHtmlWindow.html 9bd3228eae027efab9f150f1adf5a25e3f9aa38f0151fa65a97441483a819517 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIcon.html 8a001594facca1e3ecdbe7c581b44c191996625db7bfdc2d3b40a83c814ce71b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIconBundle.html f909b8fa6a5d6563b5861ec6432fcac3f72091a62a2bfb321ce576e3215919be 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIconizeEvent.html 43d1e3031c726e73984be364707ab87d6f8b4082f921095e4388a59cf1189431 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIdleEvent.html b4382d8247330a081e413e92d15c7286ab3c601c1b643a2465d9167ccb614e19 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxImage.html e73f272c88d6807bb0c9b4723fceee871e2a881b13f9d38cd75be8c62c8aa19b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxImageList.html b18468cda976ffe4d2c919db2178e9d66ba8bb98c4289b37caf29b96cbc1e65e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxInitDialogEvent.html 39bf2b005c3ffd8420a5764fc19148154dbe11cc1572691551cc5fafd64f5d17 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxJoystickEvent.html 6079a4e9f7bc0eb3abed2b0398276a7dd2e1c51ada03cae9c689cb09e3910d1c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxKeyEvent.html 6b91e5b1af312315dd15a247ddbb26dc50a230f7d1b1ae25367fde6b056f6eb1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxLayoutAlgorithm.html 4e562cf7942559f3ef0f9d640da69f39882d8cf6a8e410b2d7e5bba72540496a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListBox.html e692107867c454c75882159981dc34ec9e26b92504dcd5472875a4d5139d7432 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListCtrl.html babe329f1b564ada92fd044f498fd3078c7d266c8bc32e054868ee344fe1ce36 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListEvent.html f1b44b0d9ca0521bc1f7bbcdd9fc95af585090832b97941c521673d809a9c57a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListItem.html 3a869376ca76a271e3e86d28cc7c617c32fc5df99d801e625d96a17b6daf6062 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListItemAttr.html 1b5c5c8e4fb677a5b4637567496072d367f831fe64d255e62f8e1d33c07e77ac 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListView.html 749cb2bcb449fabc053b09b54e5d98e0b6f7c3decef4594ea8d8a59376dd9d2a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListbook.html 29864d0ead754b2dca3523c61068e8aac9c97b79438cf2c38400ae32efb99195 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxLocale.html 8feb85fc127d2bd9e669f05d91e288e91a9a261d236dc15da2bf915013526ee6 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxLogNull.html 13661faec5fbc59dc43b0104ca29ab6c0c9c081a6733f0f97b7a72ddf3443624 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMDIChildFrame.html 9a453ca3258a5d1cbfddef034c6a9823461bb50d45c3f88481af40d4001a008d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMDIClientWindow.html b936ae1c9d2754e68a03eee137b16fa3754461e6352e7a827e498601d48f4bc4 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMDIParentFrame.html a5188996fba5f96aaa3b6fd7a6852772ce5f7cb648f89ec9a2eb350792f50eb8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMask.html f23c89e370804019fb5af8c1487a6aff23bd810a1bfee50195c88be8bc275a4d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMaximizeEvent.html 0924a2992553f1018272f8e2fbb7f8f1943941bfa144ea975ae90eaa62cef655 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMemoryDC.html 4cf584dcba7d2c06cdbd58421e8f0198a4c6e10aebc3f9b1fb88143c83cb21de 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenu.html 2d944c8121eccdc30bab14f8b22089e3db27e8115650106f4afad8dc7c686120 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenuBar.html 30145c8ea7662ee847b04c88098dca095c8e2b4a2724772e9d82c66e3b265d3a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenuEvent.html bdab6226ca880595bfaba85ec413ccec62d9f1ec9b40fc13bab36e15042d655c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenuItem.html f198d4ee2a113425c226f68110d4407271c8772eb123fbe83fd32cdf04844cb3 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMessageDialog.html d24bdd1e9006c0e9ac1b5dfa0a14f311bd45d88f2cf27a4ddbd81ae11d5e3b8c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMiniFrame.html 49621c56b307ec565f2dc9111ec43e4ba1ef5944e3806431f89637cffb92fba7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMirrorDC.html 41628234ebab892f72018dfede5c1675b269488ebcaa80b4b429c72c566fadfe 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMouseCaptureChangedEvent.html ea362f7b0ee4271f68bf5c54cc03f7013f4791bfc34193c0b62323dd0e966784 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMouseCaptureLostEvent.html 72119dc496d651045fabf3a3671a135233ea32a0ab3a4a837626682f59379e15 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMouseEvent.html 83bb887727dee1bfbd963b4c1163a9dac1c85bc645cde8e76c8039e5cad6f69e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMoveEvent.html 80a5dd03c7b5bebac48109bb8f7a40834edbe1db8d7a34db843643d341ea238a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMultiChoiceDialog.html 6696f36a28d7ad1f86389b16c066ecb44e0a55cb02dc0ebf00235bb3d75dd08b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNavigationKeyEvent.html 66aeb62d8aa806ccd93277a91bfd977c1b26c9d07a3a3ec7177c7d3007a009c0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNotebook.html 68955ccdec951f6a36434671101ded566ac64996a27afaeccebbf24ba0a31797 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNotificationMessage.html c2f0e3889b8bf742584c25688269b381a930ab7d3c9958b1a4bcdf74c641888a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNotifyEvent.html 66d1c3b85fecaaf7a407329855a24c118057b9124caf18b768f6d385fc671202 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxOverlay.html 6168e2823aa0a7406ce5275d8a0c08915fe23db33a1b626fe09fc6ce79ef90e1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPageSetupDialog.html 009adfa02febcc9f74e337114213b338144d172c9df0c9f43290e571d3512099 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPageSetupDialogData.html 5b753c187a47f696704884259c885a1915a38c370497390abe97b61963f7b964 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPaintDC.html 2b48aa9d4a46a63ea75d2cce60df8bcd2181404a5acd1efad12f602d39eca74f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPaintEvent.html da6c89874456ca4ef7aa22b7b5ca58a835d2f1bd26d7c9920076c185c8b0771c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPalette.html f56739bacde9788af201656712e5269d64249e28481e0f2f7c8ed324532e5b46 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPaletteChangedEvent.html 7157e67887c5cdd79b98a40146b9b7a8da76efd5780e3ea2aa4f81711dde3b4e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPanel.html 9b00c3085a9e2bf1181bd90dad7e1c4fa4cc6ab0afddc88d155333908c183490 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPasswordEntryDialog.html 01cc78647190b120c3624f2725dcc237b08c5793d1f1ee1ab82e26469a0e52e9 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPen.html 4e2d3aa685f97cb5a257e30c41429f00905b107b83b8f53fc8c4100bf465af93 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPickerBase.html b35347f31938ac4019cbba80eed8d99ed5296624d78749ff49acc6621805272f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPopupTransientWindow.html 09f4690d4d144fc53fe46c8612387b172acb7196af142a152fdcb2ccc94fe221 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPopupWindow.html 6c9622a907efdf8267ecb4733a1c45036f02687e035aa8879a799a0abd17cfdb 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPostScriptDC.html 2322f56df29a3107425ff0436225545bf41d8f11665c8fd60dd4dd02088a9b4e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPreviewCanvas.html 9d98e2217e9123e0e1c2926407e830ffd5e366bbffb94adf2c73c7976b39bd9f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPreviewControlBar.html 6c8943c71c4c8a7ed0bcf68018f5f21e6e0729cf3124c19b3e8349423e088831 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPreviewFrame.html a4e144c3b3feaffe8731680ee9bd1ab3b749d7346c75c26e083e7c767e5c2b84 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintData.html e6ea07bc0be77bc639b5bb045440810871f71e68998fc5a93c626bf41f2eb298 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintDialog.html c6c169a9de0184a5a5cbf233036eb46453f92f787d130efd9b0fc6751d880c37 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintDialogData.html c9ab1700b70a4bb4eba07c5465e1f57a69d9ce294503f8351df631085184c9fd 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintPreview.html d82f52555b7089a5db8b24ed1a899f6ed90225d205647f62c9eb752f4575a297 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrinter.html 8a0ba262ad8950a4b0f1799b128973b2b147083bf1895e372027905ab16d391d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintout.html 6dcd7f46126e45e9c62ac4e0fe0e65c2995853a4e0c93c58567ea6b0e9d99437 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxProgressDialog.html 85c412ec8ffa35c243c8526eaa02f0e6810650ccd75f7d73ca0f9f5008d1f177 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxQueryNewPaletteEvent.html b84329e15c4045ace5630b9db5b8bdd916f4292890281170ca506ed71807731c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxRadioBox.html f9f75e4631bad108aad420593937d0bea2bccabef0759047c4b5cb3816219b6c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxRadioButton.html 631365dcf80d60744547309c449c8c32056545b3b655a5a27b109c62423b3911 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxRegion.html 587d6b61c97d600551a7cb55d386db24d534428dc8ba4b7d840d20680fcde8ea 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSashEvent.html 1339347a62fdfc781740826ab1da59e80a71edc5a4702ae2a995e277f0b440e0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSashLayoutWindow.html 082f43306c10387feebc0812c4b1e4e8050c6f365574c0400e74bd504676e431 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSashWindow.html 938581b8f8fbcab120d231a2d32ebc228fb83f4112eb0182098c1bb678f0f5a8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScreenDC.html 4f47d165a788c4cd1405db2e0fb9f67f66145c91dd2e2fd5c8e67b3ce65de6ab 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrollBar.html fb03e09d14c3ffbc456ecefc2a49a9ee87ac7a269f700ecc7d1e5e12157dfa7f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrollEvent.html 57b36e1dbf05eb88076a216c0784f976eb20ab75472b9a58af4f4a16646dfbaf 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrollWinEvent.html e737c88018f9f654b1e9cfaa7b9147bf1be2a7a4f21282c2bb523db258f951ab 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrolledWindow.html c04953be68cfc9623ef9ff4aae3bc0b26d27c439df7191d956b4c66dfdd91a36 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSetCursorEvent.html a885ada59e0021b4302684cf03f2637fe08a721fc98d037df01e0edf896dd4a2 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxShowEvent.html 47d54b57cfcc99d3453ccadd52ebe38e7cbf7b4fe44fc1fcadf8d0a2fc89eb51 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSingleChoiceDialog.html 4930caa77ba5e68ef9b7212c87b962ce5bb2f9255d82035d400ed4f1946a16d6 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizeEvent.html 7966b888b92c09038ab51784c852d8c5e382c2a3f7019364ecb4e9b17a6ea737 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizer.html aed842b188decd065c0be90b7e97fe2977dbba1a0c7714a7b3babb9a9c50431b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizerFlags.html c6dfc569cfe75e985f3b74bcb5b6027dd3269d3433911a562fb44713abe7f152 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizerItem.html 4e747da024a92f1faeb120cf703eb4cf252e452dcd4248772e88f410de9de277 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSlider.html d9f0a325f330fff96c2d2d563bd3113f66d8944a7efd465a51967198fbf27537 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSpinButton.html b7e2009fb8cf1e12012026f96b82c01a60193e23c4d519db7f2cfd529606ac32 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSpinCtrl.html 6b41eb29bef7072f1e904c1b8c737df37793fbe17db47421b3cab2bdb5e25259 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSpinEvent.html 9ed668717a78aad7b3f5cb111bfcce84b046e80c90b78edd28413c04a42124aa 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSplashScreen.html 695949262c3ee44213980d457eca27d63ba66fa6eb0816ebeab909ed8b3dbf8d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSplitterEvent.html 5c444a7ffb9406f90f2f6d30bc1cf1a5f9f92d3cfbf067b296400232ff376bfe 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSplitterWindow.html 136ac3474a95a9956a32d99a319d520d51e41bd10296d6397d4711f04db47618 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticBitmap.html 8212d7bbd781c03ada9b5b692171c5ba34f7c0d0c41ceb3e10f3720f888111a6 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticBox.html 64ccc43a5f65dfaf63a17c11bfd1084c8c53636b2093d795936299a29198be6e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticBoxSizer.html 7db651781d749221efdd775bf67487198179a031a350da184b86bd9f96f84e15 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticLine.html a3d5c902c3449f63db6a73507d47916483e39e43a807fec04704c1d3726d88be 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticText.html 09ac32036e8b8868dd53deace542686653602437895922028eaedc60b7c875f7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStatusBar.html bd2bb3fb57a547751a087032f0e021df44a5303cd5adc5fd606dd5551c435bbc 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStdDialogButtonSizer.html cedb9563579e515955da29060d81ec397ae800a974677bd0c8453510b0a56a6b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStyledTextCtrl.html 49902d8e25ad0fce57da4b43a85b23aee220e09e74689382b9c92e88a1bb6e45 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStyledTextEvent.html 92c58fc9549730e71a465dcebd77e6a30fb7b38f5b8543475185c7a30c56aa99 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSysColourChangedEvent.html df739db82c7f643212ff739c17f24d359815cc557495cb5b6f108575fd006178 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSystemOptions.html c750adca9e385d7e338e16ca30d5fb4602929742e272deca22e94b562ec756e5 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSystemSettings.html 92ddc88946204a5c902b3b71d3dfbea0e26f91d78dfef80ba748164182f6fe87 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTaskBarIcon.html 5415d6cba27bc65866d7a495246e5745f32c3a6ed5c79ac372edf101e89a915b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTaskBarIconEvent.html 8126fee9c3bbadeaf20382dc5e759762c8fae96ae2e58ad5036393b0be2ba13b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextAttr.html ffdf892d692cfa86c38c024ec2ebc25e9825b7483474e39862cf8b5708a5a36f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextCtrl.html e8350ebfdb4eb0a21bfb50fe849d8dccb2e4382cd62199d0d5aa23ef7ba7ebfa 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextDataObject.html f6dfe42cfe5980bad2ffb6609aeef96af40fef8b9ab0404c59e8f7717149cdc0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextEntryDialog.html fd7d8bd1a7f8decb1c58c3da67dbffa25780c74befda6e6831251cabc8e1951d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToggleButton.html 794bf1273bb0e0e488a3ef3c25b8dbd748e7b08adeb7e041cb094e092834ccf9 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToolBar.html c1a91de15bda4e535f2372981bfe8b5392f5b3e1a749355def3d80a4e46f993c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToolTip.html cdd3909b88aebdfb6074ce222ce38218eea23fed685f871c1b180036cbde484c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToolbook.html 8d7161fa356c4fc5e8de57a4fb9c17df7fd26183ccede6d1df373ce8cd846d40 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTopLevelWindow.html 01ab4d8d7fe08ac81c4f7ca8b00d6ba0480db9cbc488fe435aaa26bbac1b94c7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTreeCtrl.html b754c3e4abfda5bb2aa3e190fc3750c9a28afa36288f11acbc0c50b37d65477b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTreeEvent.html 894cc0411e3852e6e5b0eea200315428fd5d6184eb53f6224bfc66ae379665a8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTreebook.html 5d11f456dd67766a65fc3dcc182f1fc0c13602998c2ac553c239337416053016 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxUpdateUIEvent.html 9a4e452571fb2f25c94e21c1ad3aa5898c3911aeae6e135f06e5df6248cbb3d7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWebView.html a998a0f1dd2ce247b0ef72bf296de9b51fcd7ac040d4cfe9544d925b4611834b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWebViewEvent.html cf26f79c22670319f34fff7bcb3d721a7759844dc525a70612c54776aab1330b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindow.html 4a1153b493e638c724cb968854c8d1cd26998459eeb6397b1b061a6a1d9f3d38 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindowCreateEvent.html a016c2666c51d41f1e08c3086221018ebabe97bc35fca59883b848e5ed0c88ea 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindowDC.html 14d99fca6b71d4372cd3aad81ab83cd346e6384e585af476dba08c90b14d81b3 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindowDestroyEvent.html 3d8550b71f8de258c2ba7b14815f19cfad6e4039dcd51fbe6d5a856f09638279 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxXmlResource.html a85e3a0f18cf426d3be5a0fc42e5a07fd43d5da693d4ce4eaec38101f3faee17 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx_misc.html c60d30787dfe215863872b9404b267c1d1459f1b2a4c6b50a21b1d1f0fc4e2cb 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx_object.html fe508397c931d024ea876b743dc28de22c3129f4be77a76b2da02cd7f7fb759d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/notes.html a4921865ca153896be7f2a4e36f2762a41299fe26e9591b0bdd68ff3c0eb1cc7 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/search.html 299e0896ad84be9c419c4f0cc7d57cd85d7a674201afcf47aedefcc2b874bf52 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx.epub 4b31bedb66dba5c3f005a1d96470032e39c256450f865466cd9ecc64cdc3e8dd 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx.html a409ee37d398e9a1c018d049ff97569b731bc66d1700f4822fb5dfd200f856bc 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAcceleratorEntry.html 98fc4389f9f4f92e5e78015255b4a5a73c3e6da1f1b6e161d2b0a9d784a6b3ec 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAcceleratorTable.html 23ae0d0ff3b1a45994b0720210870b4ab8d6a9829a5f6203a79b5960860d701b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxActivateEvent.html 0ae4fa116a5cd01c5d18277cfeff239605970e78820564b9b84c4d41dc71f0a9 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxArtProvider.html 220a63f2a692983989ad399f88dd6787ae5ef3aaaa51076c9f3d57d1ae8b5687 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiDockArt.html b4da332bfaff30dc0198f87fa57f716a28e7fa811572933627dc2524532fb16c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiManager.html 572c9defa62dc85afd3ca0f20025b38de5ef57ed21d023c15c08da652f2b2009 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiManagerEvent.html 6170ef77d65f2d4e94a73f74b80708ac56601db74bcf745910a5bf5725e6802f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiNotebook.html 6c6e90c5270a98412126bf9b5d38473789adee92754f0658facfdb2bef03716e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiNotebookEvent.html fb5246b2be52b79078a75ec0d63d88f736aec610689cb5b35d04d5dab645abb4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiPaneInfo.html 67ff2d3e42c9f4535b86be0c3771620f49299acae3af8c3172c8fa110fe96ca1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiSimpleTabArt.html 645197360b1d96fd26db19913f34cc879917ea2c4d45fb4ea51dc843914e8cac 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiTabArt.html 24629ddc060ca69ac2b9c54a0c90045810ec246e8d91a0e37319f0c60832ecbf 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBitmap.html 2187560923bc228a2696972e0737fbff1657b59ede983e58ef49ef9fe247badb 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBitmapButton.html 4fd263d62737a559a2f721646ca37d0f8564c81a707094907ceed3eaf3853368 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBitmapDataObject.html 5fae9f1fcb16bbe7c2219c07a9914b81066f01081ff34b21510e2603c73fcc28 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBookCtrlBase.html ec43fb6e835f49f07dcf74c6ae160bbd584fa507582129035a82f87fdfd0f93f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBookCtrlEvent.html d4554131abf0ad9b2096bf0ffbb1a16467a9eca36777c27d14856938f68dce1a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBoxSizer.html 4f94e2b601af03f26d3635e8295f538ad06492fe402f1d31eb4fe0ddb33d7ab1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBrush.html 769c5b318ddc069fec812be3d6fd1ad1d1a498c19dd07ea70e99ee9ef26ec3ce 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBufferedDC.html 9bd35cb04e84c2926cfcf7dbea30f3652777359722dc930bd0189fac16c19be4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBufferedPaintDC.html 09cc066ab002db35e51e6492abfb89fdcf48ae7977fa03eecccfc0fae807b31d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxButton.html d632f92d4e7c8dde7b7e4febdc47dbed855c0a450981b8925135decec22ff4e8 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCalendarCtrl.html 5095a6650998f143e178e20c361af905535f6441bccd983256b68ba7a882fdf6 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCalendarDateAttr.html 0ef0f0b53bc70f1a26430da774a5b46f0075c40ff68cb05d3c10dda5a88c0c99 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCalendarEvent.html c891eb43681a72efe2d926cbfd188d2e96fc6292ad150be8e7d2f3a6386cd02e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCaret.html a259e0209cf029866886d0b7e15784149451f7d3e3876bcb44651237f981ad50 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCheckBox.html 437094b719b8ec3b0de543ec8e9a6df2e10980b9f7c2f1fcec1aefa92f7f62fa 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCheckListBox.html 3f3eb26229c1e688c3352246739d71ade9e183477c9b8068aeef3afc9314c2ad 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxChildFocusEvent.html e22f450b60103d4fb290063ec281f548c931226d78e1f60583041a598222a6d0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxChoice.html 7f407747322a0dd92f7111ffbf268076fc6485bc158d99dfb5a552bbe9711bca 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxChoicebook.html 97293b964824082e87d947ce18338cd75f3620be0b6a8e2fd24987d0cd7cfd7c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxClientDC.html 7cbb74bdb65c67288be38ad1a0de5674c8671b4df844c4eff758628fff439204 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxClipboard.html 00095c8deb0088e31469326e54f634330354f05596c3ca0dd2f9398ed7d550e3 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxClipboardTextEvent.html e0e08299e8137fc5b003f2855e3a7a65524e36616c6529c8b788364aeec9b07b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCloseEvent.html 3a970d5b57635b2b494ed477eaf6513b837589ecca87e5a30df5201f51e91b41 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourData.html 6558da58eedbaef5df2b78fe24c7d962f48e9b67bf5f6081756fae70d8ab477b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourDialog.html afe97453ab631ce44363edf55b2e07059f789a5b33774d7ba2b92db1c218e4d1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourPickerCtrl.html 847d62f0eb8bc5bb1460bb65c0ad58922c4da23969180066a3ca1de11b2bad0d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourPickerEvent.html 52055f5400a270451a5676aa00bc5f265ab08cd6a4522d5d88c513159e7b22b6 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxComboBox.html 394ce892ce5c74cb5b4bbba8ea0c5314906b801c4bd9470b5524140feba1fdae 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCommandEvent.html 2056f3d371f1b64982629aedc9fac39eb4187567a9f92d0f5eed802b825d1069 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxContextMenuEvent.html adec953cc82597c584b77f6d9b61a54a15090556a3f6da28f2182aabab359116 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxControl.html 41140f9732501bfe8fbc3f6d988f0d2704ede4049056d3dc59bf55703609c837 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxControlWithItems.html 9775f0b937d6534267d0f7ff76bd16bc724031c51e6afe9712e624e9e86e0c04 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCursor.html 3141043c2ff5703b2521c981bed4864ef66a33ca36bf61a6b24e945f31aa1e4d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDC.html 9316980252c6865942dca4515c8fc5c79efded967cc7e69dbe450859a115ae1b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDCOverlay.html 36c51d153cc233e49cb87666046820e550c83d91f406f3d8751823a854382e5b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDataObject.html 9ce617c2d0aa5e700c6941ee255d77d7dad00ea3352ec8248b957576192e608b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDateEvent.html e3a72be6827e68e0c1277b9b71a3c2dae6266baf5d77ce2120a0a46c21087e47 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDatePickerCtrl.html 85333d5ef447a3881e16d4030c6546dc78196e82a0e373223d54487bb6fd5147 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDialog.html 2e18ebdab8c77a1b01a226c75504e2b49714ff37a989587243749b8c4c4cbf88 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDirDialog.html 7496f2ccc5972f5078ca4742a09aa799a6cc4d21a72228db7b9e7ce15cfe317b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDirPickerCtrl.html 3457ed583ddf1e43a3a6bf80959dce2519e2e0a10710447d8b94923992241168 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDisplay.html af2bacd7aa980a1bf9318d0e69b8eb39079ca4092be07b2cf5a6007bf7a67cde 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDisplayChangedEvent.html aa6083ba56e8d553de284a44cf75a94c0225005bfd2e2d54ee482194eb3d53ee 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDropFilesEvent.html acc4b7d458427662c59e26e5f993a857d0141a577e76551bc0a4a7262fe2989d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxEraseEvent.html 513d1ae982a62c406020d7da85853f4e28afba7bca5881081488e095de1cf1a0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxEvent.html c11628ee4823f42f31818597fd4008d6fc7164c6caf43d0e8204067e67b3eb03 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxEvtHandler.html 91770876c7685f7e9216ebddee14a4873fafaa65aec254d649c01f7ac43c2d2d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFileDataObject.html 0e6969cccc4c87d1903094085b38fc2e92831306ee25a660a04b6bf4a7b487a1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFileDialog.html 6020e3f7a1a284a256b98fc42031e887b64d460732e26bcdcaeb8ba77056cb05 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFileDirPickerEvent.html ea507c1bf1da394de0389d6f5fc5a19a29163207282188904557ae7a3fd67630 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFilePickerCtrl.html f5d029b8a0b25803be473aaa0062f941fc3c75573f4bffc67a4a7dbab6f7d032 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFindReplaceData.html 2e18c7b4d8227a39f0cc2dbfa4538362006e0d50b3ef341b42113ecc4c87a7d7 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFindReplaceDialog.html eb8d27efb0b500590e6c571cc3bbb1b5fe0a8e45532e48c018e1531f302d8467 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFlexGridSizer.html 4c33710c08a9d22dfa321034fb38a0542bd6a686cbd864bf60530d38b288acd7 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFocusEvent.html da19f6bb2e2773e0d7e7123819957a11663771ac5bafbd427293030ddbfdf371 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFont.html 0e2347e1197a6411728e5bb99b39d2600c8eb3794c9c2eac59924b206e38b7d4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontData.html 0186234056ee634ad514fdd8d4895d5cab14bc56300e5c86ce3bf8e07ce7cb73 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontDialog.html 65c1f4f4e1d7d8d8269031ad0340ee4552d47299404f9110992e8ba6707e522c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontPickerCtrl.html 523142abc4d513e950dd5220ae8a28da1457317efd5abcb5421a3b6f2e878495 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontPickerEvent.html 403c7b348599ff67c7303d89299e9e3c428646a5fd412b30c07d5c5775e06138 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFrame.html 1fac6ad5c6ecab0f410ef456d707fca9771f51331441f1fbd60c550748d8ded0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGBSizerItem.html d4d00dd8b12e9d48636751b46722c515ea2a2896bc8a01d0ac6a262a89c1a2c4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGCDC.html c5ae370f690a08a8d134bab5ed4e0ff0c71f8870fe4f934fbd140fd09feac62b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGLCanvas.html aeaf4eaee2d8fe4c05e8cd529b0bc3530aecbb508bd3f0f535b88eee870b522c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGLContext.html 92be6a88c48df8b47be58f9c3cb5a6486fcf670f500e15c30524038615f77807 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGauge.html 3f402ec468fe836c0d9ef95c9b36c2e7025b8181fc0f271a909324427acad40e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGenericDirCtrl.html d437450b2a1e99ac5e0045b7a4c74046735d32762303487d133ffa2c008d2f14 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsBrush.html d664b7aab348faac92447fae1a31abb52b39b8d11a880c2922537d7b9bf1a0e6 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsContext.html e822445037cc33f3347e429543223e5e0122cc09475601fe01d58a722539d1a6 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsFont.html cd5082ca9f72838b574f29183c752046784b7f1e14cfff3469cf0cf70206b8e3 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsGradientStops.html 03449430b5373fa252a3031ea64dfe714e480d88b7f7f859b1b45c28983be067 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsMatrix.html e42c187dea829934d9b2daf301ce589f1b141bdd3b5b38032219a752a16416f7 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsObject.html 3b658549f7d62da19ee7e8b76d6293a59f8e76a3c62fa103d28c6eb9af8ee25b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsPath.html 692d8a868215b70aef5e4699c8e95eb98a48a36af6c07669cc7237f100c42c3b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsPen.html 91ca8008cf67730e1d91158ddf845a66dcf1cd416ddd951887b072613add2beb 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsRenderer.html 23ac51cd48fa524e1e345d3ecc57ceda6740b6a75c66a55a9b8936f396979a5d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGrid.html d2ee4720f4c9f5d7f2d14ab10afbeae87f3ddf49a093ed2773c979c7777217d0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridBagSizer.html 2963fd9a0a88424f9c69525dc02c30db9c14bacb577d2d05903b2104dcc332f1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellAttr.html f208d50f938386c42127cb97727434fbbe38e909af0a05b2a721d8cdbed6397c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellBoolEditor.html f45e0084c192dc2296c6cecba7cc87da4c01007c632521e206906938f0acdc74 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellBoolRenderer.html 3d0a0d32905cf628f255ec8fa86e42e3371b078718da04a9b3ea147f8efcbd87 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellChoiceEditor.html 2ff92c2cbb6b27f45cd5f71658ca3226218b4e5eec7da7f6411a740c9ee12b6d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellEditor.html 5d2ab29c5718a40ab0b8f48638858799b63a4ae94062719f5dc108bf729465f8 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellFloatEditor.html cdf85aed13bdad40d088e4a0c6eabd26ad75d308411c24525f4cebb2b5bcc0b2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellFloatRenderer.html e995ab5b382f0681bf58e7160aa91d185a20b7f122658edbb68cd604c7b77c9a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellNumberEditor.html b52ca0e1bb81534e7631d6cd481248317425b30b34c9d067ca4ba5eb9c798522 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellNumberRenderer.html db0c60fa8d22d90c6a449d27702b1d49c8d7ab7bf44886ca048863da15264cd4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellRenderer.html dfba27c9ef7ffb23613c599a12e19d99555c9e6cd16f4bf89519c90d6ae78ff5 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellStringRenderer.html 7327777d21d793aee4b354beebd93196a3b1439d0b26ca58acfa01b0dfff3252 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellTextEditor.html 22f16c86645e2c5f6bca546220a6f2a513446110ab1365fe4160a04fed93d21f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridEvent.html ebc64e97457ac4662dd9d3f72a8cfb53ee1583403b95ba322cca175898e0bbbb 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridSizer.html f9c4d94065006396f19824ea660f37e789fd21241cc75776cc7774490609ca5a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHelpEvent.html f876d985748c26040842493fcb0aeb9f9cfc124266ab670effec196e08082edf 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHtmlEasyPrinting.html a1e2adce495286b5f4d69b82c7789c69d3c4ebf51fcdb578da4f26aa56c0f3d3 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHtmlLinkEvent.html ece70e6ac82712268a3f8d2a753b497fec448f0ca5f047eb28ce1e5fd3df39ab 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHtmlWindow.html 85e62e585e8c3d7ded7bdd1bf921ac18e9e89ad977202fc7e11578793bb71503 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIcon.html 970aef6c15068fc59e5a3cc8050b961e0e4a89360729f3efd589fa050a475a1b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIconBundle.html 6a91f496740c666b7167194013e38050087e30ca1d3d19fd53f55c12e16ac92e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIconizeEvent.html b940132256acb0fb1bac41a89c8720011be1b122943df78620b94509fa32b826 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIdleEvent.html d6639205eef8cb4e365a1d35e48376b6c703992d7081bd6ded5a5afd7cb3999d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxImage.html e2c4f23e7f9cc669217c76ecc1e42a723f42eb125cc49cb8036b9c9cd1d2d70c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxImageList.html fab924723520b28da449c3398074f9376f6fa29f15086a825c332791c7375ce7 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxInitDialogEvent.html 90efc9df85888158d29080db01e1814fa026cee8f73954761710f9da2c0d380c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxJoystickEvent.html 8139b5b948f1d1e1ddf64fa8fc5a36589975becbc02b1fe459e4eb86241278d4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxKeyEvent.html cae43a3a94d4853d22ce5a82ee76b089e3b9d6d05dafa847c34782d4c702c171 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxLayoutAlgorithm.html d51e7f0fc4fdf548523e5e14e4cc84e8897d641946a0f2cc6947f3b146e280d0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListBox.html f81321b6fff2f255e4582b0897ab245171903db5a2e8369330761011c1f1151a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListCtrl.html f48525325f308bf7fc5cd0bbd5feabf1c0e17e594b5a1c405e841fa30ad0f6ef 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListEvent.html 697473c61a5eab8c926f2310247e3c94987369a6ad9c220bd15ade20e9c729c1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListItem.html 0a7fa5581f7dfbe7bf8ae98d1aedb70175db2286441aedde06889f7c488ee908 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListItemAttr.html 70d852bb26f0a3cb0a08f01ab76555088bc61bd2b945d0737fa9cfee56bb0a3e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListView.html fd0418030e2e98eab3c6b19408fa49882d338146bc4191c2f079c87219796a96 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListbook.html 899b7df570c190bf4503033bb2d7628b6720ef469678af279002fbb3b4d35f88 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxLocale.html 90664f79ff2daa1a128a8849027e66a1d60dc6c176736c4b11194ad48ab69fde 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxLogNull.html 5ce2c53034509d18c4e882aadb97eb753c71b01fbf9b01aeb63596de3217ca94 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMDIChildFrame.html b9958edd437ef6410b105d18d72aff35b8b1ae2d9756aa22ab129284d297647a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMDIClientWindow.html 4668438a83b46f95dfad7fa53a9637531ab605b2cb406d633764d549819757aa 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMDIParentFrame.html 5a7a6c6fb3adb555509154d49d7fc985a2f831347b5059199a9d3086702edfc3 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMask.html 6af30dd57c109c74d60bced6052b9bda889248070b0a948474802e56a3d3be21 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMaximizeEvent.html 3c220fe99f02b7beb54c71d5265296e3d74e9846c23a57fbbefa75e85d399770 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMemoryDC.html 59a914be33c979289adfe142c2dda2621f8063ebce1a900fb4852d52638fe7f4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenu.html 5ab9a90ad28148a1e7696681a16af684cd0861443cb499934fed0319c6d17a11 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenuBar.html 27186f995aa7f8aa916ec6e7d89c89d2285455d117338e9e093ad000a4a63831 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenuEvent.html 1c9d481119546e8fc1dd7593f5403f895dcb3cd64548864a45f299b88bb5d279 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenuItem.html 14e7596f84416e2ef9d99272d580539434517cf312bb40a067a37152fc3fa52d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMessageDialog.html 31483b692a64eaf7d126f202ab1b80caea7f7bb654b6ef191d49601f1c06bd5e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMiniFrame.html 1b87f5e9af3528a10652aea596ea266f02049dee128513951b1d62409b3012f5 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMirrorDC.html 47fc2be7d515ddfe79a9918e4ec241dbe07d9389b4195c703a8e0385a88cfa59 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMouseCaptureChangedEvent.html d259c8af3efa2cb80858811a2e4bca740601e0656259137946ba54bfaf629248 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMouseCaptureLostEvent.html 49a6c2bc386ca9377cd0ca4557d1c20189775b2d413a3ee107c880f936251147 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMouseEvent.html 5da2491ad4c6b51c7892bfdb3bc6188ce089d768c06fdc4fb91dcd2305a5d1c3 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMoveEvent.html a3a2b125f0fd61383dce802c23adf9d94e6cd8d98f68781b39c5456fc67c2594 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMultiChoiceDialog.html 2888d121e96060a99109370dee16529ec7a58d8bcd2c4e57d709b8ffb1b9f24c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNavigationKeyEvent.html 8f18ea50d6de0c116984800351019c63500527346fec6c9c27cd5c5de852f5ef 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNotebook.html 08185b3b0c2d40939eb9bb557dee9b9af674bc0505b329f4f77f5fdf4ca72f10 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNotificationMessage.html 946a463f25b4ca6f9a61ee890bf18802ad741ed16bcb036fb807c6d51bd7c628 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNotifyEvent.html 5bae789ea6e6a9dfd20aff778d1fd6974d99704885deac4d73c1eccacfcaf42e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxOverlay.html 52221b9bc19789cc9b47d235c6017a1247da2a4bdf2f56cb91646b29cf245c6b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPageSetupDialog.html 9fca4dded9e8c90e05267f1b8ba8aada5bc1a57749b67a354385b8bd613a23f5 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPageSetupDialogData.html 4abf466daf4bc1d9dff2ca029aadbea8ddfd32f0c494d65383dc6801745b4859 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPaintDC.html 78fb9c02f470e5abb084bcd96f19e94d63889de264ab662fc67a79f7b1019f30 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPaintEvent.html 9220bf9d32ecefe176aafe570310298ebeabff13f91a069a729a3e7c367c2c7d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPalette.html ab509c5eeb9ec67b3b0af0de278aa23611c4380b640758e1f635630cb48fa9aa 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPaletteChangedEvent.html 01871339ec72c938219e01e00e735e93787f69309d624e9bc7cd9ae57aa36f98 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPanel.html acc0509a57c1e237d6f705dc10c04d064c4fd4b0402fafff88a6da061267ad21 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPasswordEntryDialog.html dcfe58ff31cd7c532be5e6bde6d83c038957bd9a71de559bef70714312044d91 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPen.html b44eaf4f249bb9719416fb1bed7e97c5e80a2cc6a12b21b74ac2a3916828260f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPickerBase.html 71fb80e2954b954f90bf3dce2fd398365d1003ca1e8b9c242da34a2213ff9bc2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPopupTransientWindow.html c5a3e0e56ca0cb59d6cd7c7cae67979bb6557832b2655feb85d604191c469942 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPopupWindow.html 117d8ee4624e0ff3de1be6cc5539532350cb35616496d3e3178b183fa8c450ca 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPostScriptDC.html 4bd3d0e42547a3aeeb78c47a24a575632b50793be1a2242c812a218a9c288c81 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPreviewCanvas.html bcdb43998d487ca66d3ddfcaad2e9dfc49710a557d38a6bacbc3520d8a4f8ea3 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPreviewControlBar.html 8c479f1f9396743dc80761951addbdca51575ed27be3f7520920e61277752ec6 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPreviewFrame.html 9df2a107137ff595ceb95dc7613946a927450defbf90928ebbc31ed143e9cf1c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintData.html 7912fc96ed44480e7b050783a6d5b88c66ab2be868ef429e2e97c33857e98084 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintDialog.html 44a596e28e0b27b25a8fa63a92db7034dbb5d374cb826bbcf3829a6ff2b0c315 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintDialogData.html 1111f116d4f7c43c9a3b3f80664422f1c44cc151dff6b068934eee9aaade66a4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintPreview.html ddb49963db2fc096fb509388007f813217bf738756ddac7e7334c9210916d48c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrinter.html a3a159de5b115d9a5e31bb7dfea4c1230aecaff91f4153a6a9721188511e167e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintout.html 3575c6f51a72862d61ff936a5d9a20da2cbdeb7b0dca974ce39efc7ec9381838 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxProgressDialog.html a9eb8a7b36292c563196f731d49e239e88570bd97427f09f1c7a087bb78694f4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxQueryNewPaletteEvent.html 3381d1dd9e9d09dc50c4fb08f66f616047d4885aad71b5f20998507a4a873646 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxRadioBox.html eac725de5cfc2510071081ea196d078dc7b8d0cd72133beb8dfd6b00de94d46b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxRadioButton.html e85f525495c0a5d8c4b5b121c2dbc3a64cab04a436406c4ae1c5e44cd5e6a07c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxRegion.html bcb66afa8d6fe859a601f22d45b02c09fe5a6371914ecef6ee3537950da7985e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSashEvent.html da1c52b6b9ff2ef7ec49935d2a9a1629b740f7a102e73e8953063e76a52d7593 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSashLayoutWindow.html ba1de9efef49abede2f385b8a7b1d416bb763a600cfd7995b5c1899c9111d6bf 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSashWindow.html 5012d99b4a411aa6cbabaeb7c3e79d17f9809b60c86b0ef0fb6d8a363fda0c4d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScreenDC.html eae866ea397898522e223876be4257dc3cc774de3ec87120a45b65a817288a31 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrollBar.html e1e84f047b615f191f82b172e8b53d992a5eadb043800f4d1e7473e54c2c4f5e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrollEvent.html f9604d9094df63bbcabad91f8a22413b6b9427473c2cd7de9174141c8684bf5f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrollWinEvent.html edfa1479a2655e4f8a6e820422b5aa413f45a744bc778bec91c457ad6a9203af 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrolledWindow.html b8554c493f66d89753aa568183964aca33b0bbaede337dafbe2f4a1e4d74d98d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSetCursorEvent.html ebf85632cb1b8bb83968583c1887250eb958bed7fadfedb805a40b80e4c6ac4b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxShowEvent.html 5aa326a99e4a44f3b402b27ccc6cfa1b87295724d695c9cea3cd4ce5bbb3408f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSingleChoiceDialog.html eeb9bda516c683684332467fef4ae29c54e1af5d9ddaaba3858665f7f2001406 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizeEvent.html 1065533da98bd52e72950dc3658b74db4e70f4ffccf80f59381c0d20bf09c4c5 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizer.html 928ea10bb64d94cf4e85d0823251a1c1baaade67e974281df6d75921310f6c31 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizerFlags.html ee003ac4c409e5ca52aa73dc80f6b83c7c5a689735f4a5a3066a58ed0a75ee7d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizerItem.html 8c223435df1f6eb43192e2f2e17d1bae30dbc4bb0a8bc8c38114c931cef4fcf9 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSlider.html 742a5edf42b2a766e84fe20c4bbbb3cc7b4bf9772ff2c24c0484fda41dca3456 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSpinButton.html c4fedc3675b49fde5e54777669c49910eef585c1c5189712f068ce391e66b401 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSpinCtrl.html abe7580fde1ad5d775f3990fd742a7d29f965f14337f55374fdf53a073b04cc4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSpinEvent.html 30592d6f509a5de4f930fc4cc3db278a6d9cc8a6593d8af055ce72701e828d23 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSplashScreen.html 3d848f5fd49b6ef217522768f16c1c8eca34c51c91ca2113a97183b5c9474f1c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSplitterEvent.html 40c979e170aae7fd1cb5bb51209f10d74b6a7474dc809efa22015e85e08b6d1c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSplitterWindow.html 4324d830637ebd9d782001377d4494ee260cd9772f96a856e6304452dd74fb8b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticBitmap.html e94c7d3393a6a8af11f9b233f6c56481b4d19186f718bb185f34b4df68c3a232 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticBox.html 7de56a4e472f0dd6a698d3684006d08eb55064f3805c7d8bb1459f70b059ff6e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticBoxSizer.html 8f199ab77e5138f91ac5beb0567982f015b495b5b55dcfeb7e49fc2a99ea93a6 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticLine.html f231730139d65f8fd8931acf8964d307d44eef9e0f86408cbbf7eb65084453d9 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticText.html d6ca34484e3f33b52f5f467e90d41e1048e735c46f0d58d0506d0979d5811718 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStatusBar.html a7a04b578c3097a22f17d7985cdaaf1cd03d958f02f74fc63b6c29245df75b36 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStdDialogButtonSizer.html d58cd38b9b0ae8639a2c28c80871ee554c07d5f3d59ff6f2c1d78afabec04649 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStyledTextCtrl.html 19240afe3ae60cd43f10ecdf84ed97a64749efb9544849222562afd5454ff706 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStyledTextEvent.html e054e01363ce74856b0fdf22733d5708b38f1686ec241e2a2675f34506fe9d28 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSysColourChangedEvent.html 7109e4d7ab2829bb588b1ff74fcf24e35cada1e6c77ba3dbcb258f83e0518e34 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSystemOptions.html 0f04706948c6b8d4f15444926cab5854a013dfb616474b17ca48337ef794c93c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSystemSettings.html c0fb3e7782e6d1763559cef4cefbbd45b0cced0dfec9487a7f89c60c055291d9 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTaskBarIcon.html c2b7439d618ab1d61ce969bb3360252649bb0d631930fb7365b0ef25df65f76d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTaskBarIconEvent.html 1be1794c04cc839952402ccfab87540c3baf2c191bcb0afc2b1653a9e31eee2c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextAttr.html 65474680a5f6ba3975eba1d5c11c7604e5f2b71950966e9b0aa3ca39409e98f2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextCtrl.html c2e75aff3345c38b94e32795e507f8592013c6b0a525bd6b51a3ded3a43460f4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextDataObject.html 4c2cfc5632871b9a810d68332833acafca9da4a5daf88b6b579bc7973aa2c0a5 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextEntryDialog.html 19826b098e1646bf48e6ee3d212f91cb15837fe1d5b1f58326437af4a6efb327 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToggleButton.html 8656822ddc0522964eb48397fbf3f6052cefb06d25760e6e2f5c567d1c3de331 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToolBar.html 750c5e88a64077913ce41943476aeab55cd58cce0b482eeffe7f2a228e82ccfb 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToolTip.html 80c66b84adf210e4986bbe4d06923b3d32754faebdc90edae0bc13362f60a91d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToolbook.html 6ce140a6babc0144cc15340104008687ba3a6ce57f62cd9c48970dd9cbb4b989 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTopLevelWindow.html 0649c8be3cd84c16bcf44c6983a365145465ac1cb92a6fbb6ee23fa0ea96c0d2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTreeCtrl.html 6c971a451bec67826796e6d646e1d05006e5c72495d092ce3b69c2a428800599 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTreeEvent.html 8a4699548ab673db1ea7fb4d31e8959eab8d4a306bf742ff9eeedf55fa421553 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTreebook.html 571459a340c99310d65650152b0d1d5771cd029d2d191b0aeda46211380ac27c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxUpdateUIEvent.html 273b038ea90602b2e99278005926a67042c3758c90e72971a17d587d06b2744a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWebView.html 0b1c4afca305416ca984d9843a0be0e65b61228a089f603d1610233d909557cd 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWebViewEvent.html 94966425fcdf7f673aca6b5ff435e6f19683351e89f9a2ee89ea62b73e271001 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindow.html 67ddf7affd98c08a8545865c486eeb04e7f26cf5d4a2ac1898de8b5eed94a86d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindowCreateEvent.html 2b0a700a9b319c909c1f736890b2e2ac474edd596cd29738b957afed5b922945 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindowDC.html e66e294bcdebdec7d1253897c25d16b33dc00c49da189f12ac9f10a1e77c147a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindowDestroyEvent.html 961950cadb6952fd1899304e45a9aeb70accab088cd92c6279eacd9912e0319e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxXmlResource.html 1d96dfcf1d39ca726b8d5fe5f3072199ca948f070c8fb34a3dbe79ce072171e7 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx_misc.html 1165a764d7aac8a6dc018f7e241025512077e7b6303a5e8f0dfa0b005aa72b65 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx_object.html 00b70cb470b2af8a4106ba4ac046ab060d5a42b83900a04cf9c3e7f6977071ac 2 @@ -4491,2 +4491,2 @@ -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/404.html 7cd58ca8e8273fe27910fe644169cc572d66ec08db5ed5cfdfd647e740797c24 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/api-reference.html 1fc57da88bc8932671032d6261431d4b1550e78630519858c67698d37237e5c9 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/404.html bea1975aaeae630f51a9ee31567258f9f38110fee746c61392bed011841ea641 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/api-reference.html a5ab64f8495fe60297ad25e4a6686993830a7b14fd06348b1f9b284e0b21eeec 2 @@ -4527,12 +4527,12 @@ -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/notes.html 1c410c6828de3a1b9a5c17604ce02171c01ea6d43fd585d76df7cf5b02d38be1 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/search.html 5b1568714bad09f236537d4be53500f2721e51b022e82762c6f2dc06ae0d7610 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl.html e10b3611495c3e521b8f116416ae39c781525b4262c12d5c90bd5f56afb1773c 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl_eventp.html b806a642bd8579ea38155148e7e2524af1029cd44677623482b6430a52af7aa7 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl_examples.html ddbb24e1158a028d1a13ba4212c2548f52bcda7790bde6fbf7ac32ec9d5bf3d2 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl_sax_parser.html cef2d9d0f45b9e63756248dbb76e6a511edf692425b61f4a730adfa807b8ffca 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl_scan.html 337838848fb4522b2818a457327dca6b03e13b4b2778b85f8ebe16af39c56441 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl_ug.html 229244e6a448fef6993a7e2fabb42c2cf5389aade8d076602df7a6f4c2715c34 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl_xpath.html cf77d73372ff3cb670c1b1a39dee158961952ee5112d7040ce86e9d1b83a23cf 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl_xs.html 4da83e037b12ee5e8f25a3deb603ef95c5ad97f3741b6364a9c97c3217d1890d 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl_xs_examples.html 6e198a62f42abb541550ff23b1b03be899cde69638ddd0befe2a19540eb6c755 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl_xsd.html 61de7e7fc475d8fa542a0a94eda3fb2adce0cdf6a55d7047d24c4c87ff6aced4 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/notes.html f23c3158391c9b897cf0ae8295f180c3da53dc4f5b2c984b237b1bb0a4f6471e 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/search.html 12fefe43b5fc7b164062603f7ec805faee018b5dcaa2ea825de9d91c900d0dd5 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl.html 53ce4e0e0c38755d813a8f48ab426394e3d081122daf6908116fffa1e903998c 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl_eventp.html d19ddfaab9d9e6afe78b6b7fce23b5530b8525c4d0d50609041e316e1d17a7e8 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl_examples.html 7215184c4ecbe132013811ba6b853918f2f3d16cd12d22c94533903da513da3f 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl_sax_parser.html a5d658e50951f19e27c4ffe3ec36e6402f91fa8f4703abcc72b7c1a60cd88fbe 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl_scan.html 0ce7c05d1f6205b7133fa80fa99d579bc91e219e61b542c6328524daa0ee7b22 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl_ug.html 7bc29957de5fe0c8cf67ebbefb67eb0e656d9d498599212dedf16c58915bb413 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl_xpath.html 1e67e88b85778e835a51d2698673ed32b1d23a20db79f46160c787aec0d36098 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl_xs.html 465727dfccd87308374c0c0870e27c19ccc996c6ce4af24b98aec75df5f203b1 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl_xs_examples.html 9c763220b95687cbc7745e02c9172c989bac5e295f9b1bb8b89df3351d33693f 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl_xsd.html 8af7f225af5b0d46b77d62063c4a39c6e35eb614361357f27de99cd823e89dc9 2 comparing rpmtags comparing RELEASE comparing PROVIDES comparing scripts comparing filelist --- old-filelist +++ new-filelist @@ -333,7 +333,7 @@ /usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/dist/lato-latin-ext-400-normal-N27NCBWW.woff2 2 (none) 120777 root root 0 4294967295 ../../../../xmerl-2.1/doc/html/dist/lato-latin-ext-400-normal-N27NCBWW.woff2 /usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 2 (none) 120777 root root 0 4294967295 ../../../../xmerl-2.1/doc/html/dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 /usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/dist/remixicon-NKANDIL5.woff2 2 (none) 120777 root root 0 4294967295 ../../../../xmerl-2.1/doc/html/dist/remixicon-NKANDIL5.woff2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/dist/search_data-60252452.js 2 (none) 100644 root root 0 4294967295 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/dist/search_data-22628C0D.js 2 (none) 100644 root root 0 4294967295 /usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/dist/sidebar_items-8323136B.js 2 (none) 100644 root root 0 4294967295 /usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/index.html 2 (none) 100644 root root 0 4294967295 /usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/notes.html 2 (none) 100644 root root 0 4294967295 @@ -862,7 +862,7 @@ /usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/dist/lato-latin-ext-400-normal-N27NCBWW.woff2 2 (none) 120777 root root 0 4294967295 ../../../../xmerl-2.1/doc/html/dist/lato-latin-ext-400-normal-N27NCBWW.woff2 /usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 2 (none) 120777 root root 0 4294967295 ../../../../xmerl-2.1/doc/html/dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 /usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/dist/remixicon-NKANDIL5.woff2 2 (none) 120777 root root 0 4294967295 ../../../../xmerl-2.1/doc/html/dist/remixicon-NKANDIL5.woff2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/dist/search_data-2851E262.js 2 (none) 100644 root root 0 4294967295 +/usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/dist/search_data-5E285FD6.js 2 (none) 100644 root root 0 4294967295 /usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/dist/sidebar_items-EDF0173B.js 2 (none) 100644 root root 0 4294967295 /usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/http_client.html 2 (none) 100644 root root 0 4294967295 /usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/http_server.html 2 (none) 100644 root root 0 4294967295 @@ -1217,7 +1217,7 @@ /usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/dist/lato-latin-ext-400-normal-N27NCBWW.woff2 2 (none) 120777 root root 0 4294967295 ../../../../xmerl-2.1/doc/html/dist/lato-latin-ext-400-normal-N27NCBWW.woff2 /usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 2 (none) 120777 root root 0 4294967295 ../../../../xmerl-2.1/doc/html/dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 /usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/dist/remixicon-NKANDIL5.woff2 2 (none) 120777 root root 0 4294967295 ../../../../xmerl-2.1/doc/html/dist/remixicon-NKANDIL5.woff2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/dist/search_data-91E2EDED.js 2 (none) 100644 root root 0 4294967295 +/usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/dist/search_data-227F454E.js 2 (none) 100644 root root 0 4294967295 /usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/dist/sidebar_items-6D9D41B7.js 2 (none) 100644 root root 0 4294967295 /usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/etop.html 2 (none) 100644 root root 0 4294967295 /usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/etop_ug.html 2 (none) 100644 root root 0 4294967295 @@ -1434,7 +1434,7 @@ /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dist/lato-latin-ext-400-normal-N27NCBWW.woff2 2 (none) 120777 root root 0 4294967295 ../../../../xmerl-2.1/doc/html/dist/lato-latin-ext-400-normal-N27NCBWW.woff2 /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 2 (none) 120777 root root 0 4294967295 ../../../../xmerl-2.1/doc/html/dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dist/remixicon-NKANDIL5.woff2 2 (none) 120777 root root 0 4294967295 ../../../../xmerl-2.1/doc/html/dist/remixicon-NKANDIL5.woff2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dist/search_data-B508ECAC.js 2 (none) 100644 root root 0 4294967295 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dist/search_data-7F27CE3F.js 2 (none) 100644 root root 0 4294967295 /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dist/sidebar_items-E5CACCF4.js 2 (none) 100644 root root 0 4294967295 /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dtrace.html 2 (none) 100644 root root 0 4294967295 /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dyntrace.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/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/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/doc/html/dist/remixicon-NKANDIL5.woff2 -/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/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/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-02-26 17:28:15.269570020 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/404.html 2025-02-26 17:28:15.269570020 +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-02-26 17:28:15.505572179 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/asn1.html 2025-02-26 17:28:15.505572179 +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-02-26 17:28:15.521572326 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/common_test.html 2025-02-26 17:28:15.521572326 +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-02-26 17:28:15.533572435 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/compiler.html 2025-02-26 17:28:15.533572435 +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-02-26 17:28:15.549572582 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/crypto.html 2025-02-26 17:28:15.549572582 +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-02-26 17:28:15.565572728 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/debugger.html 2025-02-26 17:28:15.565572728 +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-02-26 17:28:15.585572912 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/deprecations.html 2025-02-26 17:28:15.585572912 +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-02-26 17:28:15.601573058 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/design_principles.html 2025-02-26 17:28:15.601573058 +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-02-26 17:28:15.617573204 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/dialyzer.html 2025-02-26 17:28:15.617573204 +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-02-26 17:28:15.633573350 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/diameter.html 2025-02-26 17:28:15.633573350 +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-02-26 17:28:15.649573497 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/edoc.html 2025-02-26 17:28:15.649573497 +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-02-26 17:28:15.661573606 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/efficiency_guide.html 2025-02-26 17:28:15.661573606 +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-02-26 17:28:15.677573753 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/eldap.html 2025-02-26 17:28:15.677573753 +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-02-26 17:28:15.693573899 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/embedded.html 2025-02-26 17:28:15.693573899 +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-02-26 17:28:15.709574046 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/erl_interface.html 2025-02-26 17:28:15.709574046 +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-02-26 17:28:15.721574155 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/erts.html 2025-02-26 17:28:15.725574193 +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-02-26 17:28:15.737574302 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/et.html 2025-02-26 17:28:15.737574302 +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-02-26 17:28:15.753574449 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/eunit.html 2025-02-26 17:28:15.753574449 +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-02-26 17:28:15.769574594 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/ftp.html 2025-02-26 17:28:15.769574594 +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-02-26 17:28:15.785574741 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/getting_started.html 2025-02-26 17:28:15.785574741 +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-02-26 17:28:15.801574887 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/inets.html 2025-02-26 17:28:15.801574887 +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-02-26 17:28:15.813574997 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/installation_guide.html 2025-02-26 17:28:15.813574997 +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-02-26 17:28:15.829575143 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/jinterface.html 2025-02-26 17:28:15.829575143 +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-02-26 17:28:15.845575290 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/kernel.html 2025-02-26 17:28:15.845575290 +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-02-26 17:28:15.909575875 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/man_index.html 2025-02-26 17:28:15.909575875 +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-02-26 17:28:15.929576058 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/megaco.html 2025-02-26 17:28:15.929576058 +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-02-26 17:28:15.941576168 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/mnesia.html 2025-02-26 17:28:15.941576168 +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-02-26 17:28:15.961576351 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/observer.html 2025-02-26 17:28:15.957576314 +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-02-26 17:28:15.973576461 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/odbc.html 2025-02-26 17:28:15.973576461 +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-02-26 17:28:15.989576608 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/os_mon.html 2025-02-26 17:28:15.989576608 +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-02-26 17:28:16.005576753 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/parsetools.html 2025-02-26 17:28:16.005576753 +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-02-26 17:28:16.017576864 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/programming_examples.html 2025-02-26 17:28:16.017576864 +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-02-26 17:28:16.033577009 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/public_key.html 2025-02-26 17:28:16.033577009 +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-02-26 17:28:16.049577156 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/readme.html 2025-02-26 17:28:16.049577156 +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-02-26 17:28:16.065577302 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/reference_manual.html 2025-02-26 17:28:16.065577302 +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-02-26 17:28:16.081577449 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/reltool.html 2025-02-26 17:28:16.081577449 +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-02-26 17:28:16.101577632 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/removed.html 2025-02-26 17:28:16.101577632 +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-02-26 17:28:16.117577778 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/runtime_tools.html 2025-02-26 17:28:16.117577778 +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-02-26 17:28:16.129577888 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/sasl.html 2025-02-26 17:28:16.129577888 +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-02-26 17:28:16.145578034 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/scheduled_for_removal.html 2025-02-26 17:28:16.145578034 +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-02-26 17:28:16.161578180 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/search.html 2025-02-26 17:28:16.161578180 +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-02-26 17:28:16.173578290 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/snmp.html 2025-02-26 17:28:16.173578290 +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-02-26 17:28:16.189578437 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/ssh.html 2025-02-26 17:28:16.189578437 +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-02-26 17:28:16.205578583 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/ssl.html 2025-02-26 17:28:16.205578583 +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-02-26 17:28:16.221578729 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/stdlib.html 2025-02-26 17:28:16.221578729 +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-02-26 17:28:16.233578839 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/syntax_tools.html 2025-02-26 17:28:16.233578839 +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-02-26 17:28:16.249578986 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/404.html 2025-02-26 17:28:16.249578986 +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-02-26 17:28:16.489581182 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/applications.xhtml" 2025-02-26 17:28:16.505581327 +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-02-26 17:28:16.485581144 +0000
+++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/drivers.xhtml"	2025-02-26 17:28:16.501581291 +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-02-26 17:28:16.485581144 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/eff_guide_functions.xhtml" 2025-02-26 17:28:16.501581291 +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-02-26 17:28:16.485581144 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/eff_guide_processes.xhtml" 2025-02-26 17:28:16.501581291 +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-02-26 17:28:16.481581108 +0000
+++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/erl_interface.xhtml"	2025-02-26 17:28:16.501581291 +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-02-26 17:28:16.481581108 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/error_logging.xhtml" 2025-02-26 17:28:16.501581291 +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-02-26 17:28:16.481581108 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/errors.xhtml" 2025-02-26 17:28:16.501581291 +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-02-26 17:28:16.481581108 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/events.xhtml" 2025-02-26 17:28:16.501581291 +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-02-26 17:28:16.481581108 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/example.xhtml" 2025-02-26 17:28:16.501581291 +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-02-26 17:28:16.481581108 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/expressions.xhtml" 2025-02-26 17:28:16.501581291 +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-02-26 17:28:16.481581108 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/funs.xhtml" 2025-02-26 17:28:16.497581254 +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-02-26 17:28:16.481581108 +0000
    +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/gen_server_concepts.xhtml"	2025-02-26 17:28:16.497581254 +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-02-26 17:28:16.481581108 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/included_applications.xhtml" 2025-02-26 17:28:16.497581254 +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-02-26 17:28:16.481581108 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/install-win32.xhtml" 2025-02-26 17:28:16.497581254 +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-02-26 17:28:16.477581071 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/list_comprehensions.xhtml" 2025-02-26 17:28:16.497581254 +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-02-26 17:28:16.477581071 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/listhandling.xhtml" 2025-02-26 17:28:16.497581254 +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-02-26 17:28:16.477581071 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/macros.xhtml" 2025-02-26 17:28:16.497581254 +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-02-26 17:28:16.477581071 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/maps.xhtml" 2025-02-26 17:28:16.497581254 +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-02-26 17:28:16.477581071 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/modules.xhtml" 2025-02-26 17:28:16.497581254 +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-02-26 17:28:16.477581071 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/nif.xhtml" 2025-02-26 17:28:16.497581254 +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-02-26 17:28:16.477581071 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/opaques.xhtml" 2025-02-26 17:28:16.497581254 +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-02-26 17:28:16.477581071 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/otp-patch-apply.xhtml" 2025-02-26 17:28:16.497581254 +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-02-26 17:28:16.477581071 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/patterns.xhtml" 2025-02-26 17:28:16.497581254 +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-02-26 17:28:16.477581071 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/prog_ex_records.xhtml" 2025-02-26 17:28:16.497581254 +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-02-26 17:28:16.477581071 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/records_macros.xhtml" 2025-02-26 17:28:16.493581217 +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-02-26 17:28:16.477581071 +0000
            +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/ref_man_functions.xhtml"	2025-02-26 17:28:16.493581217 +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-02-26 17:28:16.477581071 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/ref_man_processes.xhtml" 2025-02-26 17:28:16.493581217 +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-02-26 17:28:16.477581071 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/ref_man_records.xhtml" 2025-02-26 17:28:16.493581217 +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-02-26 17:28:16.477581071 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/release_handling.xhtml" 2025-02-26 17:28:16.493581217 +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-02-26 17:28:16.477581071 +0000
            +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/release_structure.xhtml"	2025-02-26 17:28:16.493581217 +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-02-26 17:28:16.477581071 +0000
            +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/robustness.xhtml"	2025-02-26 17:28:16.493581217 +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-02-26 17:28:16.477581071 +0000
            +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/seq_prog.xhtml"	2025-02-26 17:28:16.493581217 +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-02-26 17:28:16.473581035 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/spec_proc.xhtml" 2025-02-26 17:28:16.493581217 +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-02-26 17:28:16.473581035 +0000
            +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/statem.xhtml"	2025-02-26 17:28:16.493581217 +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-02-26 17:28:16.473581035 +0000
              +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/sup_princ.xhtml"	2025-02-26 17:28:16.489581182 +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-02-26 17:28:16.473581035 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/tablesdatabases.xhtml" 2025-02-26 17:28:16.489581182 +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-02-26 17:28:16.473581035 +0000
            +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/typespec.xhtml"	2025-02-26 17:28:16.489581182 +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-02-26 17:28:17.041586231 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/applications.html 2025-02-26 17:28:17.041586231 +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-02-26 17:28:17.069586487 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/appup_cookbook.html 2025-02-26 17:28:17.073586523 +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-02-26 17:28:17.089586669 +0000
              +++ new//usr/share/doc/packages/erlang-doc/doc/system/benchmarking.html	2025-02-26 17:28:17.089586669 +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-02-26 17:28:17.109586853 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/binaryhandling.html 2025-02-26 17:28:17.109586853 +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-02-26 17:28:17.129587035 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/bit_syntax.html 2025-02-26 17:28:17.129587035 +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-02-26 17:28:17.153587256 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/c_port.html 2025-02-26 17:28:17.153587256 +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-02-26 17:28:17.177587475 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/c_portdriver.html 2025-02-26 17:28:17.177587475 +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-02-26 17:28:17.193587621 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/character_set.html 2025-02-26 17:28:17.193587621 +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-02-26 17:28:17.209587768 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/cnode.html 2025-02-26 17:28:17.209587768 +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-02-26 17:28:17.225587914 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/code_loading.html 2025-02-26 17:28:17.225587914 +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-02-26 17:28:17.245588097 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/commoncaveats.html 2025-02-26 17:28:17.245588097 +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-02-26 17:28:17.277588390 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/conc_prog.html 2025-02-26 17:28:17.277588390 +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-02-26 17:28:17.313588719 +0000
            +++ new//usr/share/doc/packages/erlang-doc/doc/system/create_target.html	2025-02-26 17:28:17.313588719 +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-02-26 17:28:17.341588975 +0000
            +++ new//usr/share/doc/packages/erlang-doc/doc/system/data_types.html	2025-02-26 17:28:17.341588975 +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-02-26 17:28:17.361589158 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/debugging.html 2025-02-26 17:28:17.361589158 +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-02-26 17:28:17.385589377 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/design_principles.html 2025-02-26 17:28:17.385589377 +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-02-26 17:28:17.405589561 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/distributed.html 2025-02-26 17:28:17.405589561 +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-02-26 17:28:17.425589743 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/distributed_applications.html 2025-02-26 17:28:17.425589743 +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-02-26 17:28:17.445589927 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/documentation.html 2025-02-26 17:28:17.445589927 +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-02-26 17:28:17.701592268 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/features.html 2025-02-26 17:28:17.701592268 +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-02-26 17:28:17.729592524 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/funs.html 2025-02-26 17:28:17.729592524 +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-02-26 17:28:17.753592744 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/gen_server_concepts.html 2025-02-26 17:28:17.753592744 +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-02-26 17:28:17.773592927 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/getting_started.html 2025-02-26 17:28:17.773592927 +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-02-26 17:28:17.789593073 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/included_applications.html 2025-02-26 17:28:17.789593073 +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-02-26 17:28:17.809593256 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/install-cross.html 2025-02-26 17:28:17.809593256 +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-02-26 17:28:17.829593439 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/install-win32.html 2025-02-26 17:28:17.829593439 +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-02-26 17:28:17.857593695 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/install.html 2025-02-26 17:28:17.857593695 +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-02-26 17:28:17.873593842 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/installation_guide.html 2025-02-26 17:28:17.873593842 +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-02-26 17:28:17.893594024 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/list_comprehensions.html 2025-02-26 17:28:17.893594024 +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-02-26 17:28:17.913594207 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/listhandling.html 2025-02-26 17:28:17.913594207 +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-02-26 17:28:17.933594390 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/macros.html 2025-02-26 17:28:17.933594390 +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-02-26 17:28:17.957594610 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/maps.html 2025-02-26 17:28:17.957594610 +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="8388160007-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="9885215818-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-02-26 17:28:17.973594757 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/memory.html 2025-02-26 17:28:17.973594757 +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-02-26 17:28:17.989594902 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/misc.html 2025-02-26 17:28:17.989594902 +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-02-26 17:28:18.009595086 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/modules.html 2025-02-26 17:28:18.009595086 +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-02-26 17:28:18.025595232 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/nif.html 2025-02-26 17:28:18.025595232 +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-02-26 17:28:18.045595415 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/opaques.html 2025-02-26 17:28:18.045595415 +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-02-26 17:28:18.209596916 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/otp-patch-apply.html 2025-02-26 17:28:18.209596916 +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-02-26 17:28:18.229597098 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/overview.html 2025-02-26 17:28:18.229597098 +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-02-26 17:28:18.245597244 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/patterns.html 2025-02-26 17:28:18.245597244 +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-02-26 17:28:18.261597391 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/ports.html 2025-02-26 17:28:18.261597391 +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-02-26 17:28:18.277597538 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/profiling.html 2025-02-26 17:28:18.277597538 +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-02-26 17:28:18.297597720 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/prog_ex_records.html 2025-02-26 17:28:18.297597720 +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-02-26 17:28:18.313597866 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/programming_examples.html 2025-02-26 17:28:18.313597866 +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-02-26 17:28:18.329598013 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/readme.html 2025-02-26 17:28:18.329598013 +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-02-26 17:28:18.349598196 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/records_macros.html 2025-02-26 17:28:18.349598196 +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-02-26 17:28:18.369598379 +0000
          +++ new//usr/share/doc/packages/erlang-doc/doc/system/ref_man_functions.html	2025-02-26 17:28:18.369598379 +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="5013144178-3">).
          +2> atom_to_list(&#href_anchor"p" data-group-id="9803268429-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-02-26 17:28:18.393598598 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/ref_man_processes.html 2025-02-26 17:28:18.393598598 +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-02-26 17:28:18.409598745 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/ref_man_records.html 2025-02-26 17:28:18.413598781 +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-02-26 17:28:18.429598928 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/reference_manual.html 2025-02-26 17:28:18.429598928 +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-02-26 17:28:18.453599147 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/release_handling.html 2025-02-26 17:28:18.453599147 +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-02-26 17:28:18.473599331 +0000
          +++ new//usr/share/doc/packages/erlang-doc/doc/system/release_structure.html	2025-02-26 17:28:18.473599331 +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-02-26 17:28:18.497599550 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/robustness.html 2025-02-26 17:28:18.497599550 +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-02-26 17:28:18.513599697 +0000
          +++ new//usr/share/doc/packages/erlang-doc/doc/system/search.html	2025-02-26 17:28:18.513599697 +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-02-26 17:28:18.569600209 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/seq_prog.html 2025-02-26 17:28:18.569600209 +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-02-26 17:28:18.601600501 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/spec_proc.html 2025-02-26 17:28:18.601600501 +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-02-26 17:28:18.653600977 +0000
          +++ new//usr/share/doc/packages/erlang-doc/doc/system/statem.html	2025-02-26 17:28:18.653600977 +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-02-26 17:28:18.681601234 +0000
            +++ new//usr/share/doc/packages/erlang-doc/doc/system/sup_princ.html	2025-02-26 17:28:18.681601234 +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-02-26 17:28:18.701601416 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/system_limits.html 2025-02-26 17:28:18.701601416 +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-02-26 17:28:18.717601562 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/system_principles.html 2025-02-26 17:28:18.717601562 +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-02-26 17:28:18.737601746 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/tablesdatabases.html 2025-02-26 17:28:18.737601746 +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-02-26 17:28:18.753601891 +0000
          +++ new//usr/share/doc/packages/erlang-doc/doc/system/tutorial.html	2025-02-26 17:28:18.753601891 +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-02-26 17:28:18.777602112 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/typespec.html 2025-02-26 17:28:18.777602112 +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-02-26 17:28:18.793602258 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/upgrade.html 2025-02-26 17:28:18.793602258 +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-02-26 17:28:18.809602404 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/versions.html 2025-02-26 17:28:18.809602404 +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-02-26 17:28:18.825602550 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system_principles.html 2025-02-26 17:28:18.825602550 +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-02-26 17:28:18.837602660 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/tftp.html 2025-02-26 17:28:18.841602697 +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-02-26 17:28:18.853602806 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/tools.html 2025-02-26 17:28:18.853602806 +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-02-26 17:28:18.869602953 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/tutorial.html 2025-02-26 17:28:18.869602953 +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-02-26 17:28:18.885603099 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/upcoming_incompatibilities.html 2025-02-26 17:28:18.885603099 +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-02-26 17:28:18.901603246 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/wx.html 2025-02-26 17:28:18.901603246 +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-02-26 17:28:18.917603392 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/xmerl.html 2025-02-26 17:28:18.917603392 +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.1/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/404.html 2025-02-26 17:28:18.929603502 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/404.html 2025-02-26 17:28:18.929603502 +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.1/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.1/doc/html/absform.html 2025-02-26 17:28:18.949603684 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/absform.html 2025-02-26 17:28:18.949603684 +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.1/doc/html/alt_disco.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/alt_disco.html 2025-02-26 17:28:18.965603831 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/alt_disco.html 2025-02-26 17:28:18.965603831 +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.1/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.1/doc/html/alt_dist.html 2025-02-26 17:28:19.009604233 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/alt_dist.html 2025-02-26 17:28:19.009604233 +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.1/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text)
            --- old//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/api-reference.html	2025-02-26 17:28:19.029604417 +0000
            +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/api-reference.html	2025-02-26 17:28:19.029604417 +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.1/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.1/doc/html/atomics.html 2025-02-26 17:28:19.049604599 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/atomics.html 2025-02-26 17:28:19.049604599 +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.1/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.1/doc/html/automaticyieldingofccode.html 2025-02-26 17:28:19.065604746 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/automaticyieldingofccode.html 2025-02-26 17:28:19.065604746 +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.1/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.1/doc/html/beam_makeops.html 2025-02-26 17:28:19.117605221 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/beam_makeops.html 2025-02-26 17:28:19.117605221 +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.1/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.1/doc/html/beamasm.html	2025-02-26 17:28:19.149605514 +0000
      +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/beamasm.html	2025-02-26 17:28:19.149605514 +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.1/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.1/doc/html/carriermigration.html 2025-02-26 17:28:19.165605661 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/carriermigration.html 2025-02-26 17:28:19.169605697 +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.1/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.1/doc/html/codeloading.html 2025-02-26 17:28:19.185605843 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/codeloading.html 2025-02-26 17:28:19.185605843 +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.1/doc/html/communication.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/communication.html 2025-02-26 17:28:19.201605990 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/communication.html 2025-02-26 17:28:19.201605990 +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.1/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.1/doc/html/counters.html 2025-02-26 17:28:19.217606136 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/counters.html 2025-02-26 17:28:19.217606136 +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.1/doc/html/countinginstructions.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/countinginstructions.html 2025-02-26 17:28:19.233606283 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/countinginstructions.html 2025-02-26 17:28:19.233606283 +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.1/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.1/doc/html/crash_dump.html 2025-02-26 17:28:19.253606465 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/crash_dump.html 2025-02-26 17:28:19.253606465 +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.1/doc/html/delayeddealloc.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/delayeddealloc.html 2025-02-26 17:28:19.269606612 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/delayeddealloc.html 2025-02-26 17:28:19.269606612 +0000 @@ -342,7 +342,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/erts-15.2.1/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.1/doc/html/driver.html 2025-02-26 17:28:19.305606942 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/driver.html 2025-02-26 17:28:19.305606942 +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.1/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.1/doc/html/driver_entry.html	2025-02-26 17:28:19.325607124 +0000
      +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/driver_entry.html	2025-02-26 17:28:19.325607124 +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.1/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.1/doc/html/epmd_cmd.html 2025-02-26 17:28:19.345607308 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/epmd_cmd.html 2025-02-26 17:28:19.345607308 +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.1/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.1/doc/html/erl_cmd.html 2025-02-26 17:28:19.377607600 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erl_cmd.html 2025-02-26 17:28:19.377607600 +0000 @@ -154,18 +154,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.

      @@ -701,7 +701,7 @@ also balances scheduler utilization between schedulers.

    • +sct CpuTopology - Sets a user-defined CPU topology. The user-defined CPU topology overrides any automatically detected CPU topology. The CPU topology is used when -binding schedulers to logical processors.

      <Id> = integer(); when 0 =< <Id> =< 65535
      +binding schedulers to logical processors.

      <Id> = integer(); when 0 =< <Id> =< 65535
       <IdRange> = <Id>-<Id>
       <IdOrIdRange> = <Id> | <IdRange>
       <IdList> = <IdOrIdRange>,<IdOrIdRange> | <IdOrIdRange>
      @@ -734,22 +734,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 @@ -924,10 +924,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 @@ -989,7 +989,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/erts-15.2.1/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.1/doc/html/erl_dist_protocol.html 2025-02-26 17:28:19.405607856 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erl_dist_protocol.html 2025-02-26 17:28:19.405607856 +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.1/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.1/doc/html/erl_driver.html 2025-02-26 17:28:19.445608222 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erl_driver.html 2025-02-26 17:28:19.449608258 +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.1/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.1/doc/html/erl_ext_dist.html 2025-02-26 17:28:19.473608479 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erl_ext_dist.html 2025-02-26 17:28:19.473608479 +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.1/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.1/doc/html/erl_nif.html 2025-02-26 17:28:19.537609064 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erl_nif.html 2025-02-26 17:28:19.537609064 +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.1/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.1/doc/html/erl_prim_loader.html	2025-02-26 17:28:19.561609283 +0000
      +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erl_prim_loader.html	2025-02-26 17:28:19.561609283 +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.1/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.1/doc/html/erl_tracer.html 2025-02-26 17:28:19.593609576 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erl_tracer.html 2025-02-26 17:28:19.593609576 +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.1/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.1/doc/html/erlang.html 2025-02-26 17:28:19.821611661 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erlang.html 2025-02-26 17:28:19.821611661 +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.1/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.1/doc/html/erlc_cmd.html 2025-02-26 17:28:19.857611991 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erlc_cmd.html 2025-02-26 17:28:19.857611991 +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.1/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.1/doc/html/erlsrv_cmd.html 2025-02-26 17:28:19.877612173 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erlsrv_cmd.html 2025-02-26 17:28:19.877612173 +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.1/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.1/doc/html/erts_alloc.html 2025-02-26 17:28:19.897612357 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/erts_alloc.html 2025-02-26 17:28:19.897612357 +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.1/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.1/doc/html/escript_cmd.html 2025-02-26 17:28:19.917612540 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/escript_cmd.html 2025-02-26 17:28:19.917612540 +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.1/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.1/doc/html/garbagecollection.html 2025-02-26 17:28:19.933612686 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/garbagecollection.html 2025-02-26 17:28:19.933612686 +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.1/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.1/doc/html/inet_cfg.html 2025-02-26 17:28:19.957612906 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/inet_cfg.html 2025-02-26 17:28:19.957612906 +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.1/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.1/doc/html/init.html 2025-02-26 17:28:19.977613088 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/init.html 2025-02-26 17:28:19.981613125 +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.1/doc/html/introduction.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/introduction.html 2025-02-26 17:28:19.993613235 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/introduction.html 2025-02-26 17:28:19.993613235 +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.1/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.1/doc/html/match_spec.html 2025-02-26 17:28:20.017613454 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/match_spec.html 2025-02-26 17:28:20.017613454 +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.1/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.1/doc/html/notes.html 2025-02-26 17:28:20.181614955 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/notes.html 2025-02-26 17:28:20.181614955 +0000 @@ -156,7 +156,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

    @@ -204,8 +204,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

    @@ -242,17 +242,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, @@ -3138,9 +3138,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 @@ -10851,12 +10851,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:
      @@ -11410,7 +11410,7 @@
                 Erlang programming language
       
             

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/erts-15.2.1/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.1/doc/html/persistent_term.html 2025-02-26 17:28:20.221615321 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/persistent_term.html 2025-02-26 17:28:20.221615321 +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.1/doc/html/portsignals.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/portsignals.html 2025-02-26 17:28:20.237615467 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/portsignals.html 2025-02-26 17:28:20.237615467 +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.1/doc/html/processmanagementoptimizations.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/processmanagementoptimizations.html 2025-02-26 17:28:20.253615613 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/processmanagementoptimizations.html 2025-02-26 17:28:20.253615613 +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.1/doc/html/ptables.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/ptables.html 2025-02-26 17:28:20.273615796 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/ptables.html 2025-02-26 17:28:20.273615796 +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.1/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.1/doc/html/run_erl_cmd.html 2025-02-26 17:28:20.289615943 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/run_erl_cmd.html 2025-02-26 17:28:20.289615943 +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.1/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/search.html 2025-02-26 17:28:20.305616090 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/search.html 2025-02-26 17:28:20.305616090 +0000 @@ -141,7 +141,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-15.2.1/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.1/doc/html/start_cmd.html 2025-02-26 17:28:20.321616235 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/start_cmd.html 2025-02-26 17:28:20.321616235 +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.1/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.1/doc/html/start_erl_cmd.html 2025-02-26 17:28:20.337616382 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/start_erl_cmd.html 2025-02-26 17:28:20.337616382 +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.1/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.1/doc/html/supercarrier.html 2025-02-26 17:28:20.353616528 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/supercarrier.html 2025-02-26 17:28:20.353616528 +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.1/doc/html/threadprogress.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/threadprogress.html 2025-02-26 17:28:20.373616712 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/threadprogress.html 2025-02-26 17:28:20.373616712 +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.1/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.1/doc/html/time_correction.html 2025-02-26 17:28:20.393616894 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/time_correction.html 2025-02-26 17:28:20.393616894 +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.1/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.1/doc/html/tracing.html 2025-02-26 17:28:20.413617077 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/tracing.html 2025-02-26 17:28:20.413617077 +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.1/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.1/doc/html/tty.html 2025-02-26 17:28:20.429617224 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/tty.html 2025-02-26 17:28:20.429617224 +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.1/doc/html/werl_cmd.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/werl_cmd.html 2025-02-26 17:28:20.445617370 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/werl_cmd.html 2025-02-26 17:28:20.445617370 +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.1/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.1/doc/html/zlib.html 2025-02-26 17:28:20.477617662 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-15.2.1/doc/html/zlib.html 2025-02-26 17:28:20.477617662 +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.1/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/404.html 2025-02-26 17:28:20.493617809 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/404.html 2025-02-26 17:28:20.493617809 +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.1/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/api-reference.html 2025-02-26 17:28:20.505617918 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/api-reference.html 2025-02-26 17:28:20.509617955 +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.1/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.1/doc/html/asn1.epub/OEBPS/asn1_getting_started.xhtml 2025-02-26 17:28:20.529618138 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/asn1.epub/OEBPS/asn1_getting_started.xhtml 2025-02-26 17:28:20.533618175 +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}}

      @@ -166,16 +166,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

      @@ -186,7 +186,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),

      @@ -203,11 +203,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,
    @@ -254,7 +254,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 @@ -282,7 +282,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 @@ -303,11 +303,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 @@ -316,26 +316,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 = "Мой маленький Гном".
    -[1052,1086,1081,32,1084,1072,1083,1077,1085,1100,1082,1080,
    - 1081,32,1043,1085,1086,1084]
    -2> Gbin = unicode:characters_to_binary(Gs).
    +[1052,1086,1081,32,1084,1072,1083,1077,1085,1100,1082,1080,
    + 1081,32,1043,1085,1086,1084]
    +2> Gbin = unicode:characters_to_binary(Gs).
     <<208,156,208,190,208,185,32,208,188,208,176,208,187,208,
       181,208,189,209,140,208,186,208,184,208,185,32,208,147,
       208,...>>
    @@ -343,22 +343,22 @@
     <<208,156,208,190,208,185,32,208,188,208,176,208,187,208,
       181,208,189,209,140,208,186,208,184,208,185,32,208,147,
       208,...>>
    -4> Gs = unicode:characters_to_list(Gbin).
    -[1052,1086,1081,32,1084,1072,1083,1077,1085,1100,1082,1080,
    - 1081,32,1043,1085,1086,1084]

    For details, see the unicode module in STDLIB.

    In the following example, this ASN.1 specification is used:

    UTF DEFINITIONS AUTOMATIC TAGS ::=
    +4> Gs = unicode:characters_to_list(Gbin).
    +[1052,1086,1081,32,1084,1072,1083,1077,1085,1100,1082,1080,
    + 1081,32,1043,1085,1086,1084]

    For details, see the unicode module in STDLIB.

    In the following example, this ASN.1 specification is used:

    UTF DEFINITIONS AUTOMATIC TAGS ::=
     BEGIN
        UTF ::= UTF8String
    -END

    Encoding and decoding a string with Unicode characters:

    5> asn1ct:compile('UTF', [ber]).
    +END

    Encoding and decoding a string with Unicode characters:

    5> asn1ct:compile('UTF', [ber]).
     ok
    -6> {ok,Bytes1} = 'UTF':encode('UTF', <<"Гном"/utf8>>).
    -{ok,<<12,8,208,147,208,189,208,190,208,188>>}
    /usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/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.1/doc/html/asn1.epub/OEBPS/asn1_spec.xhtml	2025-02-26 17:28:20.529618138 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/asn1.epub/OEBPS/asn1_spec.xhtml	2025-02-26 17:28:20.533618175 +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.1/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.1/doc/html/asn1.epub/OEBPS/asn1ct.xhtml	2025-02-26 17:28:20.529618138 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/asn1.epub/OEBPS/asn1ct.xhtml	2025-02-26 17:28:20.533618175 +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.1/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.1/doc/html/asn1.epub/OEBPS/content.opf 2025-02-26 17:28:20.529618138 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/asn1.epub/OEBPS/content.opf 2025-02-26 17:28:20.529618138 +0000 @@ -4,10 +4,10 @@ version="3.0"> asn1 - 5.3.1 - urn:uuid:2667e8b4-5095-a20d-0748-334b2a2fec3c + urn:uuid:92966d81-c456-1e94-2912-7dd38406335f en - 2025-02-26T17:21:54Z + 2041-03-31T06:41:21Z /usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/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.1/doc/html/asn1_getting_started.html 2025-02-26 17:28:20.609618870 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/asn1_getting_started.html 2025-02-26 17:28:20.609618870 +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}}

    @@ -271,16 +271,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

    @@ -291,7 +291,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),

    @@ -308,11 +308,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,
    @@ -359,7 +359,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 @@ -387,7 +387,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 @@ -408,11 +408,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 @@ -421,26 +421,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 = "Мой маленький Гном".
    -[1052,1086,1081,32,1084,1072,1083,1077,1085,1100,1082,1080,
    - 1081,32,1043,1085,1086,1084]
    -2> Gbin = unicode:characters_to_binary(Gs).
    +[1052,1086,1081,32,1084,1072,1083,1077,1085,1100,1082,1080,
    + 1081,32,1043,1085,1086,1084]
    +2> Gbin = unicode:characters_to_binary(Gs).
     <<208,156,208,190,208,185,32,208,188,208,176,208,187,208,
       181,208,189,209,140,208,186,208,184,208,185,32,208,147,
       208,...>>
    @@ -448,22 +448,22 @@
     <<208,156,208,190,208,185,32,208,188,208,176,208,187,208,
       181,208,189,209,140,208,186,208,184,208,185,32,208,147,
       208,...>>
    -4> Gs = unicode:characters_to_list(Gbin).
    -[1052,1086,1081,32,1084,1072,1083,1077,1085,1100,1082,1080,
    - 1081,32,1043,1085,1086,1084]

    For details, see the unicode module in STDLIB.

    In the following example, this ASN.1 specification is used:

    UTF DEFINITIONS AUTOMATIC TAGS ::=
    +4> Gs = unicode:characters_to_list(Gbin).
    +[1052,1086,1081,32,1084,1072,1083,1077,1085,1100,1082,1080,
    + 1081,32,1043,1085,1086,1084]

    For details, see the unicode module in STDLIB.

    In the following example, this ASN.1 specification is used:

    UTF DEFINITIONS AUTOMATIC TAGS ::=
     BEGIN
        UTF ::= UTF8String
    -END

    Encoding and decoding a string with Unicode characters:

    5> asn1ct:compile(&#href_anchor"p">, [ber]).
    +END

    Encoding and decoding a string with Unicode characters:

    5> asn1ct:compile(&#href_anchor"p">, [ber]).
     ok
    -6> {ok,Bytes1} = 'UTF':encode('UTF', <<"Гном"/utf8>>).
    -{ok,<<12,8,208,147,208,189,208,190,208,188>>}
    /usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/asn1_introduction.html differs (HTML document, UTF-8 Unicode text)
    --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/asn1_introduction.html	2025-02-26 17:28:20.629619053 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/asn1_introduction.html	2025-02-26 17:28:20.629619053 +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.1/doc/html/asn1_overview.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/asn1_overview.html 2025-02-26 17:28:20.645619199 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/asn1_overview.html 2025-02-26 17:28:20.645619199 +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.1/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.1/doc/html/asn1_spec.html 2025-02-26 17:28:20.669619419 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/asn1_spec.html 2025-02-26 17:28:20.669619419 +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.1/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.1/doc/html/asn1ct.html	2025-02-26 17:28:20.693619639 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/asn1ct.html	2025-02-26 17:28:20.693619639 +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

    Missing in old package: /usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/dist/search_data-22628C0D.js Missing in old package: /usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/dist/search_data-22628C0D.js /usr/share/doc/packages/erlang-doc/lib/asn1-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/asn1-5.3.1/doc/html/notes.html 2025-02-26 17:28:20.725619931 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/notes.html 2025-02-26 17:28:20.725619931 +0000 @@ -1557,7 +1557,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/search.html 2025-02-26 17:28:20.741620077 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.3.1/doc/html/search.html 2025-02-26 17:28:20.741620077 +0000 @@ -122,7 +122,7 @@
    - + /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/404.html 2025-02-26 17:28:20.753620187 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/404.html 2025-02-26 17:28:20.753620187 +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.6/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/api-reference.html 2025-02-26 17:28:20.769620333 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/api-reference.html 2025-02-26 17:28:20.773620370 +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.6/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.6/doc/html/basics_chapter.html 2025-02-26 17:28:20.789620517 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/basics_chapter.html 2025-02-26 17:28:20.789620517 +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.6/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.6/doc/html/common_test.epub/OEBPS/basics_chapter.xhtml 2025-02-26 17:28:20.817620773 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/common_test.epub/OEBPS/basics_chapter.xhtml 2025-02-26 17:28:20.825620846 +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.6/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.6/doc/html/common_test.epub/OEBPS/config_file_chapter.xhtml 2025-02-26 17:28:20.817620773 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/common_test.epub/OEBPS/config_file_chapter.xhtml 2025-02-26 17:28:20.825620846 +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.6/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.6/doc/html/common_test.epub/OEBPS/content.opf	2025-02-26 17:28:20.817620773 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/common_test.epub/OEBPS/content.opf	2025-02-26 17:28:20.825620846 +0000
    @@ -4,10 +4,10 @@
              version="3.0">
       
         common_test - 1.27.6
    -    urn:uuid:03f86a14-4dd5-2bf4-1f84-17df2adb9989
    +    urn:uuid:da47d3a2-6bac-4ce3-5335-3ff75f46b8e9
         en
     
    -    2025-02-26T17:21:30Z
    +    2041-03-31T06:40:58Z
     
       
       
    /usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/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.6/doc/html/common_test.epub/OEBPS/cover_chapter.xhtml	2025-02-26 17:28:20.817620773 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/common_test.epub/OEBPS/cover_chapter.xhtml	2025-02-26 17:28:20.825620846 +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.6/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.6/doc/html/common_test.epub/OEBPS/ct.xhtml 2025-02-26 17:28:20.817620773 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/common_test.epub/OEBPS/ct.xhtml 2025-02-26 17:28:20.825620846 +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.6/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.6/doc/html/common_test.epub/OEBPS/ct_ftp.xhtml 2025-02-26 17:28:20.813620736 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/common_test.epub/OEBPS/ct_ftp.xhtml 2025-02-26 17:28:20.825620846 +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.6/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.6/doc/html/common_test.epub/OEBPS/ct_hooks_chapter.xhtml 2025-02-26 17:28:20.813620736 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/common_test.epub/OEBPS/ct_hooks_chapter.xhtml 2025-02-26 17:28:20.825620846 +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.6/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.6/doc/html/common_test.epub/OEBPS/ct_master.xhtml 2025-02-26 17:28:20.813620736 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/common_test.epub/OEBPS/ct_master.xhtml 2025-02-26 17:28:20.825620846 +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.6/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.6/doc/html/common_test.epub/OEBPS/ct_master_chapter.xhtml 2025-02-26 17:28:20.813620736 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/common_test.epub/OEBPS/ct_master_chapter.xhtml 2025-02-26 17:28:20.825620846 +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.6/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.6/doc/html/common_test.epub/OEBPS/ct_netconfc.xhtml 2025-02-26 17:28:20.813620736 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/common_test.epub/OEBPS/ct_netconfc.xhtml 2025-02-26 17:28:20.825620846 +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.6/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.6/doc/html/common_test.epub/OEBPS/ct_property_test.xhtml 2025-02-26 17:28:20.813620736 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/common_test.epub/OEBPS/ct_property_test.xhtml 2025-02-26 17:28:20.821620809 +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.6/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.6/doc/html/common_test.epub/OEBPS/ct_property_test_chapter.xhtml 2025-02-26 17:28:20.813620736 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/common_test.epub/OEBPS/ct_property_test_chapter.xhtml 2025-02-26 17:28:20.821620809 +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.6/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.6/doc/html/common_test.epub/OEBPS/ct_run_cmd.xhtml	2025-02-26 17:28:20.813620736 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/common_test.epub/OEBPS/ct_run_cmd.xhtml	2025-02-26 17:28:20.821620809 +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.6/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.6/doc/html/common_test.epub/OEBPS/ct_snmp.xhtml 2025-02-26 17:28:20.813620736 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/common_test.epub/OEBPS/ct_snmp.xhtml 2025-02-26 17:28:20.821620809 +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.6/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.6/doc/html/common_test.epub/OEBPS/ct_ssh.xhtml 2025-02-26 17:28:20.813620736 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/common_test.epub/OEBPS/ct_ssh.xhtml 2025-02-26 17:28:20.821620809 +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.6/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.6/doc/html/common_test.epub/OEBPS/ct_telnet.xhtml 2025-02-26 17:28:20.813620736 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/common_test.epub/OEBPS/ct_telnet.xhtml 2025-02-26 17:28:20.821620809 +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.6/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.6/doc/html/common_test.epub/OEBPS/dependencies_chapter.xhtml 2025-02-26 17:28:20.809620699 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/common_test.epub/OEBPS/dependencies_chapter.xhtml 2025-02-26 17:28:20.821620809 +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.6/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.6/doc/html/common_test.epub/OEBPS/event_handler_chapter.xhtml 2025-02-26 17:28:20.809620699 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/common_test.epub/OEBPS/event_handler_chapter.xhtml 2025-02-26 17:28:20.821620809 +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.6/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.6/doc/html/common_test.epub/OEBPS/example_chapter.xhtml 2025-02-26 17:28:20.809620699 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/common_test.epub/OEBPS/example_chapter.xhtml 2025-02-26 17:28:20.821620809 +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.6/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.6/doc/html/common_test.epub/OEBPS/getting_started_chapter.xhtml 2025-02-26 17:28:20.809620699 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/common_test.epub/OEBPS/getting_started_chapter.xhtml 2025-02-26 17:28:20.821620809 +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.6/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.6/doc/html/common_test.epub/OEBPS/run_test_chapter.xhtml 2025-02-26 17:28:20.809620699 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/common_test.epub/OEBPS/run_test_chapter.xhtml 2025-02-26 17:28:20.817620773 +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.6/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.6/doc/html/common_test.epub/OEBPS/unix_telnet.xhtml	2025-02-26 17:28:20.809620699 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/common_test.epub/OEBPS/unix_telnet.xhtml	2025-02-26 17:28:20.817620773 +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.6/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.6/doc/html/common_test.epub/OEBPS/write_test_chapter.xhtml 2025-02-26 17:28:20.809620699 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/common_test.epub/OEBPS/write_test_chapter.xhtml 2025-02-26 17:28:20.817620773 +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.6/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.6/doc/html/common_test_app.html 2025-02-26 17:28:21.069623079 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/common_test_app.html 2025-02-26 17:28:21.069623079 +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.6/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.6/doc/html/config_file_chapter.html 2025-02-26 17:28:21.093623298 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/config_file_chapter.html 2025-02-26 17:28:21.093623298 +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.6/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.6/doc/html/cover_chapter.html	2025-02-26 17:28:21.109623444 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/cover_chapter.html	2025-02-26 17:28:21.113623480 +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.6/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.6/doc/html/ct.html 2025-02-26 17:28:21.161623920 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct.html 2025-02-26 17:28:21.161623920 +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.6/doc/html/ct_cover.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_cover.html 2025-02-26 17:28:21.181624102 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_cover.html 2025-02-26 17:28:21.181624102 +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.6/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.6/doc/html/ct_ftp.html 2025-02-26 17:28:21.205624323 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_ftp.html 2025-02-26 17:28:21.205624323 +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.6/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.6/doc/html/ct_hooks.html 2025-02-26 17:28:21.233624579 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_hooks.html 2025-02-26 17:28:21.233624579 +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.6/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.6/doc/html/ct_hooks_chapter.html 2025-02-26 17:28:21.257624798 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_hooks_chapter.html 2025-02-26 17:28:21.257624798 +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.6/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.6/doc/html/ct_master.html 2025-02-26 17:28:21.277624981 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_master.html 2025-02-26 17:28:21.277624981 +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.6/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.6/doc/html/ct_master_chapter.html 2025-02-26 17:28:21.297625164 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_master_chapter.html 2025-02-26 17:28:21.297625164 +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.6/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.6/doc/html/ct_netconfc.html 2025-02-26 17:28:21.341625566 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_netconfc.html 2025-02-26 17:28:21.345625603 +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.6/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.6/doc/html/ct_property_test.html 2025-02-26 17:28:21.369625822 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_property_test.html 2025-02-26 17:28:21.369625822 +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.6/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.6/doc/html/ct_property_test_chapter.html 2025-02-26 17:28:21.389626006 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_property_test_chapter.html 2025-02-26 17:28:21.389626006 +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.6/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.6/doc/html/ct_rpc.html 2025-02-26 17:28:21.409626188 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_rpc.html 2025-02-26 17:28:21.409626188 +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.6/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.6/doc/html/ct_run_cmd.html 2025-02-26 17:28:21.425626335 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_run_cmd.html 2025-02-26 17:28:21.425626335 +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.6/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.6/doc/html/ct_slave.html 2025-02-26 17:28:21.445626517 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_slave.html 2025-02-26 17:28:21.445626517 +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.6/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.6/doc/html/ct_snmp.html 2025-02-26 17:28:21.477626810 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_snmp.html 2025-02-26 17:28:21.477626810 +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.6/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.6/doc/html/ct_ssh.html 2025-02-26 17:28:21.533627322 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_ssh.html 2025-02-26 17:28:21.533627322 +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.6/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.6/doc/html/ct_suite.html 2025-02-26 17:28:21.565627615 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_suite.html 2025-02-26 17:28:21.565627615 +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.6/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.6/doc/html/ct_telnet.html 2025-02-26 17:28:21.593627871 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_telnet.html 2025-02-26 17:28:21.593627871 +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.6/doc/html/ct_testspec.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_testspec.html 2025-02-26 17:28:21.613628054 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/ct_testspec.html 2025-02-26 17:28:21.613628054 +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.6/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.6/doc/html/dependencies_chapter.html 2025-02-26 17:28:21.633628237 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/dependencies_chapter.html 2025-02-26 17:28:21.633628237 +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.6/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.6/doc/html/event_handler_chapter.html 2025-02-26 17:28:21.653628420 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/event_handler_chapter.html 2025-02-26 17:28:21.653628420 +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.6/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.6/doc/html/example_chapter.html 2025-02-26 17:28:21.673628603 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/example_chapter.html 2025-02-26 17:28:21.673628603 +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.6/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.6/doc/html/getting_started_chapter.html 2025-02-26 17:28:21.693628787 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/getting_started_chapter.html 2025-02-26 17:28:21.693628787 +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.6/doc/html/install_chapter.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/install_chapter.html 2025-02-26 17:28:21.709628932 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/install_chapter.html 2025-02-26 17:28:21.709628932 +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.6/doc/html/introduction.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/introduction.html 2025-02-26 17:28:21.729629115 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/introduction.html 2025-02-26 17:28:21.729629115 +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.6/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.6/doc/html/notes.html 2025-02-26 17:28:21.769629481 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/notes.html 2025-02-26 17:28:21.769629481 +0000 @@ -2798,7 +2798,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.6/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.6/doc/html/run_test_chapter.html 2025-02-26 17:28:21.809629847 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/run_test_chapter.html 2025-02-26 17:28:21.809629847 +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.6/doc/html/search.html differs (HTML document, UTF-8 Unicode text)
    --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/search.html	2025-02-26 17:28:21.829630030 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/search.html	2025-02-26 17:28:21.829630030 +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.6/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.6/doc/html/test_structure_chapter.html 2025-02-26 17:28:21.845630177 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/test_structure_chapter.html 2025-02-26 17:28:21.845630177 +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.6/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.6/doc/html/unix_telnet.html 2025-02-26 17:28:21.861630324 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/unix_telnet.html 2025-02-26 17:28:21.861630324 +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.6/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.6/doc/html/why_test_chapter.html 2025-02-26 17:28:21.877630469 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/why_test_chapter.html 2025-02-26 17:28:21.877630469 +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.6/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.6/doc/html/write_test_chapter.html 2025-02-26 17:28:21.909630762 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.27.6/doc/html/write_test_chapter.html 2025-02-26 17:28:21.909630762 +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.5.4/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/404.html 2025-02-26 17:28:21.925630909 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/404.html 2025-02-26 17:28:21.925630909 +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.5.4/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/api-reference.html 2025-02-26 17:28:21.937631018 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/api-reference.html 2025-02-26 17:28:21.941631055 +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.5.4/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.5.4/doc/html/beam_ssa.html 2025-02-26 17:28:21.957631202 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/beam_ssa.html 2025-02-26 17:28:21.957631202 +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.5.4/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.5.4/doc/html/cerl.html 2025-02-26 17:28:22.073632262 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/cerl.html 2025-02-26 17:28:22.073632262 +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.5.4/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.5.4/doc/html/cerl_clauses.html 2025-02-26 17:28:22.101632518 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/cerl_clauses.html 2025-02-26 17:28:22.101632518 +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.5.4/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.5.4/doc/html/cerl_trees.html 2025-02-26 17:28:22.125632738 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/cerl_trees.html 2025-02-26 17:28:22.125632738 +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.5.4/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.5.4/doc/html/compile.html 2025-02-26 17:28:22.153632994 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/compile.html 2025-02-26 17:28:22.153632994 +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.5.4/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.5.4/doc/html/compiler.epub/OEBPS/beam_ssa.xhtml 2025-02-26 17:28:22.181633250 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/compiler.epub/OEBPS/beam_ssa.xhtml 2025-02-26 17:28:22.185633287 +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.5.4/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.5.4/doc/html/compiler.epub/OEBPS/compile.xhtml 2025-02-26 17:28:22.177633214 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/compiler.epub/OEBPS/compile.xhtml 2025-02-26 17:28:22.181633250 +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.5.4/doc/html/compiler.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/compiler.epub/OEBPS/content.opf 2025-02-26 17:28:22.177633214 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/compiler.epub/OEBPS/content.opf 2025-02-26 17:28:22.181633250 +0000 @@ -4,10 +4,10 @@ version="3.0"> compiler - 8.5.4 - urn:uuid:fa2383a7-e396-5c8b-0930-9d55f2f7542d + urn:uuid:a33e3966-08cb-39e8-af76-ad55d0e11d03 en - 2025-02-26T17:21:24Z + 2041-03-31T06:40:51Z /usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/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.5.4/doc/html/compiler.epub/OEBPS/notes.xhtml 2025-02-26 17:28:22.177633214 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/compiler.epub/OEBPS/notes.xhtml 2025-02-26 17:28:22.181633250 +0000 @@ -34,8 +34,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

    @@ -83,13 +83,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

      @@ -97,39 +97,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.5.4/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.5.4/doc/html/compiler.epub/OEBPS/ssa_checks.xhtml 2025-02-26 17:28:22.177633214 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/compiler.epub/OEBPS/ssa_checks.xhtml 2025-02-26 17:28:22.181633250 +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.5.4/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.5.4/doc/html/notes.html 2025-02-26 17:28:22.297634311 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/notes.html 2025-02-26 17:28:22.297634311 +0000 @@ -139,8 +139,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

    @@ -188,13 +188,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

      @@ -202,39 +202,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

  • @@ -3159,7 +3159,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/search.html 2025-02-26 17:28:22.317634495 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/search.html 2025-02-26 17:28:22.321634531 +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.5.4/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.5.4/doc/html/ssa_checks.html 2025-02-26 17:28:22.337634677 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-8.5.4/doc/html/ssa_checks.html 2025-02-26 17:28:22.337634677 +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.2/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/404.html 2025-02-26 17:28:22.353634824 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/404.html 2025-02-26 17:28:22.353634824 +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.2/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.2/doc/html/algorithm_details.html 2025-02-26 17:28:22.373635007 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/algorithm_details.html 2025-02-26 17:28:22.373635007 +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.2/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/api-reference.html 2025-02-26 17:28:22.389635153 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/api-reference.html 2025-02-26 17:28:22.389635153 +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.2/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.2/doc/html/crypto.epub/OEBPS/content.opf 2025-02-26 17:28:22.413635373 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/crypto.epub/OEBPS/content.opf 2025-02-26 17:28:22.417635409 +0000 @@ -4,10 +4,10 @@ version="3.0"> crypto - 5.5.2 - urn:uuid:83b71a14-e8c0-4222-4af9-64ae927a5a45 + urn:uuid:7fe73545-43f7-a0c0-e947-1feda65e7069 en - 2025-02-26T17:22:26Z + 2041-03-31T06:41:49Z /usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/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.2/doc/html/crypto.epub/OEBPS/crypto.xhtml 2025-02-26 17:28:22.413635373 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/crypto.epub/OEBPS/crypto.xhtml 2025-02-26 17:28:22.417635409 +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.2/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.2/doc/html/crypto.epub/OEBPS/engine_keys.xhtml 2025-02-26 17:28:22.413635373 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/crypto.epub/OEBPS/engine_keys.xhtml 2025-02-26 17:28:22.417635409 +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.2/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.2/doc/html/crypto.epub/OEBPS/engine_load.xhtml	2025-02-26 17:28:22.413635373 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/crypto.epub/OEBPS/engine_load.xhtml	2025-02-26 17:28:22.417635409 +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.2/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.2/doc/html/crypto.epub/OEBPS/new_api.xhtml 2025-02-26 17:28:22.413635373 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/crypto.epub/OEBPS/new_api.xhtml 2025-02-26 17:28:22.417635409 +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.2/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.2/doc/html/crypto.html 2025-02-26 17:28:22.561636726 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/crypto.html 2025-02-26 17:28:22.565636763 +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.2/doc/html/crypto_app.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/crypto_app.html 2025-02-26 17:28:22.589636983 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/crypto_app.html 2025-02-26 17:28:22.589636983 +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.2/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.2/doc/html/engine_keys.html 2025-02-26 17:28:22.605637129 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/engine_keys.html 2025-02-26 17:28:22.605637129 +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.2/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.2/doc/html/engine_load.html 2025-02-26 17:28:22.625637312 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/engine_load.html 2025-02-26 17:28:22.625637312 +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.2/doc/html/fips.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/fips.html 2025-02-26 17:28:22.641637458 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/fips.html 2025-02-26 17:28:22.641637458 +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.2/doc/html/licenses.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/licenses.html 2025-02-26 17:28:22.657637605 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/licenses.html 2025-02-26 17:28:22.657637605 +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.2/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.2/doc/html/new_api.html 2025-02-26 17:28:22.681637824 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/new_api.html 2025-02-26 17:28:22.681637824 +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.2/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.2/doc/html/notes.html 2025-02-26 17:28:22.717638154 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/notes.html 2025-02-26 17:28:22.717638154 +0000 @@ -2221,7 +2221,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/search.html 2025-02-26 17:28:22.737638336 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.5.2/doc/html/search.html 2025-02-26 17:28:22.737638336 +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-02-26 17:28:22.749638447 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/404.html 2025-02-26 17:28:22.749638447 +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-02-26 17:28:22.765638592 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/api-reference.html 2025-02-26 17:28:22.765638592 +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-02-26 17:28:22.789638813 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.epub/OEBPS/content.opf 2025-02-26 17:28:22.793638849 +0000 @@ -4,10 +4,10 @@ version="3.0"> debugger - 5.5 - urn:uuid:1c305032-3d8c-1ce7-db0a-063cc466632e + urn:uuid:2074fff8-15b5-9709-296b-59dccd2b6ab4 en - 2025-02-26T17:22:21Z + 2041-03-31T06:41:44Z /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-02-26 17:28:22.789638813 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.epub/OEBPS/debugger_chapter.xhtml 2025-02-26 17:28:22.793638849 +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-02-26 17:28:22.789638813 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.epub/OEBPS/i.xhtml 2025-02-26 17:28:22.793638849 +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-02-26 17:28:22.789638813 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.epub/OEBPS/int.xhtml 2025-02-26 17:28:22.793638849 +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-02-26 17:28:22.789638813 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.epub/OEBPS/notes.xhtml 2025-02-26 17:28:22.793638849 +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-02-26 17:28:22.869639544 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger.html 2025-02-26 17:28:22.869639544 +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-02-26 17:28:22.893639763 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/debugger_chapter.html 2025-02-26 17:28:22.893639763 +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-02-26 17:28:22.917639983 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/i.html 2025-02-26 17:28:22.917639983 +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-02-26 17:28:22.945640239 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/int.html 2025-02-26 17:28:22.945640239 +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-02-26 17:28:22.965640422 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/introduction.html 2025-02-26 17:28:22.965640422 +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-02-26 17:28:22.989640642 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/notes.html 2025-02-26 17:28:22.989640642 +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-02-26 17:28:23.005640788 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-5.5/doc/html/search.html 2025-02-26 17:28:23.005640788 +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-02-26 17:28:23.017640898 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/404.html 2025-02-26 17:28:23.017640898 +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-02-26 17:28:23.033641044 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/api-reference.html 2025-02-26 17:28:23.033641044 +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-02-26 17:28:23.053641228 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer.epub/OEBPS/content.opf 2025-02-26 17:28:23.057641264 +0000 @@ -4,10 +4,10 @@ version="3.0"> dialyzer - 5.3.1 - urn:uuid:71d1d349-fdb4-56d5-40ec-09034dd84dd6 + urn:uuid:6671f645-8d23-2452-ce2b-9074d56db973 en - 2025-02-26T17:22:47Z + 2041-03-31T06:42:08Z /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-02-26 17:28:23.053641228 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer.epub/OEBPS/dialyzer.xhtml 2025-02-26 17:28:23.057641264 +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-02-26 17:28:23.053641228 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer.epub/OEBPS/dialyzer_chapter.xhtml 2025-02-26 17:28:23.057641264 +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-02-26 17:28:23.113641776 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer.html	2025-02-26 17:28:23.113641776 +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-02-26 17:28:23.133641959 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/dialyzer_chapter.html 2025-02-26 17:28:23.133641959 +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-02-26 17:28:23.169642288 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/notes.html 2025-02-26 17:28:23.169642288 +0000 @@ -1879,7 +1879,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-02-26 17:28:23.185642435 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/search.html 2025-02-26 17:28:23.185642435 +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-02-26 17:28:23.201642581 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.3.1/doc/html/typer_cmd.html 2025-02-26 17:28:23.201642581 +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-02-26 17:28:23.217642728 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/404.html 2025-02-26 17:28:23.217642728 +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-02-26 17:28:23.233642874 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/api-reference.html 2025-02-26 17:28:23.233642874 +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-02-26 17:28:23.257643093 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.epub/OEBPS/content.opf 2025-02-26 17:28:23.261643130 +0000 @@ -4,10 +4,10 @@ version="3.0"> diameter - 2.4.1 - urn:uuid:bd98d9fd-fcc6-828a-372b-b1c33c323190 + urn:uuid:1e750836-824c-e817-f6ea-be3d3322bade en - 2025-02-26T17:22:38Z + 2041-03-31T06:42:00Z /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-02-26 17:28:23.257643093 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.epub/OEBPS/diameter.xhtml 2025-02-26 17:28:23.261643130 +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-02-26 17:28:23.257643093 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.epub/OEBPS/diameter_app.xhtml 2025-02-26 17:28:23.261643130 +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-02-26 17:28:23.257643093 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.epub/OEBPS/diameter_codec.xhtml 2025-02-26 17:28:23.261643130 +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-02-26 17:28:23.257643093 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.epub/OEBPS/diameter_dict.xhtml 2025-02-26 17:28:23.261643130 +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-02-26 17:28:23.253643057 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.epub/OEBPS/diameterc_cmd.xhtml 2025-02-26 17:28:23.261643130 +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-02-26 17:28:23.401644411 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter.html 2025-02-26 17:28:23.401644411 +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-02-26 17:28:23.433644703 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_app.html 2025-02-26 17:28:23.433644703 +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-02-26 17:28:23.457644924 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_codec.html 2025-02-26 17:28:23.457644924 +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-02-26 17:28:23.481645143 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_dict.html 2025-02-26 17:28:23.481645143 +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-02-26 17:28:23.497645289 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_examples.html 2025-02-26 17:28:23.497645289 +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-02-26 17:28:23.513645436 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_intro.html 2025-02-26 17:28:23.513645436 +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-02-26 17:28:23.533645618 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_make.html 2025-02-26 17:28:23.537645655 +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-02-26 17:28:23.553645802 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_sctp.html 2025-02-26 17:28:23.553645802 +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-02-26 17:28:23.573645984 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_service.html 2025-02-26 17:28:23.573645984 +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-02-26 17:28:23.601646240 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_soc.html 2025-02-26 17:28:23.601646240 +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-02-26 17:28:23.629646496 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_tcp.html 2025-02-26 17:28:23.629646496 +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-02-26 17:28:23.645646643 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_transport.html 2025-02-26 17:28:23.645646643 +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-02-26 17:28:23.665646826 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameter_using.html 2025-02-26 17:28:23.665646826 +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-02-26 17:28:23.681646972 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/diameterc_cmd.html 2025-02-26 17:28:23.681646972 +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-02-26 17:28:23.705647192 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/notes.html 2025-02-26 17:28:23.709647228 +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-02-26 17:28:23.725647374 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.4.1/doc/html/search.html 2025-02-26 17:28:23.725647374 +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-02-26 17:28:23.737647484 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/404.html 2025-02-26 17:28:23.737647484 +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-02-26 17:28:23.753647631 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/api-reference.html 2025-02-26 17:28:23.757647667 +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-02-26 17:28:23.785647923 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/chapter.html 2025-02-26 17:28:23.785647923 +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-02-26 17:28:23.801648070 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/doc_storage.html 2025-02-26 17:28:23.801648070 +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-02-26 17:28:23.829648326 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc.html 2025-02-26 17:28:23.829648326 +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-02-26 17:28:23.849648509 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_cmd.html 2025-02-26 17:28:23.849648509 +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-02-26 17:28:23.865648655 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_doclet.html 2025-02-26 17:28:23.865648655 +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-02-26 17:28:23.881648802 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_doclet_chunks.html 2025-02-26 17:28:23.881648802 +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-02-26 17:28:23.901648985 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_doclet_markdown.html 2025-02-26 17:28:23.901648985 +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-02-26 17:28:23.921649167 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_extract.html 2025-02-26 17:28:23.921649167 +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-02-26 17:28:23.937649314 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_html_to_markdown.html 2025-02-26 17:28:23.937649314 +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-02-26 17:28:23.957649497 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_layout.html 2025-02-26 17:28:23.957649497 +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-02-26 17:28:23.977649680 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_layout_chunks.html 2025-02-26 17:28:23.977649680 +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-02-26 17:28:23.997649863 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_lib.html 2025-02-26 17:28:23.997649863 +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-02-26 17:28:24.013650010 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/edoc_run.html 2025-02-26 17:28:24.013650010 +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-02-26 17:28:24.037650229 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/notes.html 2025-02-26 17:28:24.037650229 +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-02-26 17:28:24.053650376 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.3.2/doc/html/search.html 2025-02-26 17:28:24.053650376 +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-02-26 17:28:24.069650521 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/404.html 2025-02-26 17:28:24.069650521 +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-02-26 17:28:24.085650668 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/api-reference.html 2025-02-26 17:28:24.085650668 +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-02-26 17:28:24.105650851 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/eldap.epub/OEBPS/content.opf 2025-02-26 17:28:24.105650851 +0000 @@ -4,10 +4,10 @@ version="3.0"> eldap - 1.2.14 - urn:uuid:cb7ba7a7-3365-f778-41e9-d3d19a1672e4 + urn:uuid:aeaa46af-9df3-2fc6-49fb-ae6d644ec1e6 en - 2025-02-26T17:22:46Z + 2041-03-31T06:42:07Z /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-02-26 17:28:24.101650814 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/eldap.epub/OEBPS/eldap.xhtml 2025-02-26 17:28:24.105650851 +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-02-26 17:28:24.161651363 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/eldap.html 2025-02-26 17:28:24.161651363 +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-02-26 17:28:24.181651546 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/notes.html 2025-02-26 17:28:24.181651546 +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-02-26 17:28:24.197651692 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.14/doc/html/search.html 2025-02-26 17:28:24.197651692 +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-02-26 17:28:24.209651802 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/404.html 2025-02-26 17:28:24.209651802 +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-02-26 17:28:24.241652095 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei.html 2025-02-26 17:28:24.241652095 +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-02-26 17:28:24.277652425 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei_connect.html 2025-02-26 17:28:24.277652425 +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-02-26 17:28:24.297652607 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei_global.html 2025-02-26 17:28:24.297652607 +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-02-26 17:28:24.317652791 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/ei_users_guide.html 2025-02-26 17:28:24.317652791 +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-02-26 17:28:24.341653010 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/erl_call_cmd.html 2025-02-26 17:28:24.341653010 +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-02-26 17:28:24.361653192 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/erl_interface.epub/OEBPS/content.opf 2025-02-26 17:28:24.365653229 +0000 @@ -4,10 +4,10 @@ version="3.0"> erl_interface - 5.5.2 - urn:uuid:ea09fbbc-2434-c6bc-8c97-44ff9ef90a9f + urn:uuid:ba0e451b-6259-5cdd-60a6-9d0637456276 en - 2025-02-26T17:21:53Z + 2041-03-31T06:41:20Z /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-02-26 17:28:24.361653192 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/erl_interface.epub/OEBPS/ei.xhtml 2025-02-26 17:28:24.365653229 +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-02-26 17:28:24.361653192 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/erl_interface.epub/OEBPS/ei_connect.xhtml 2025-02-26 17:28:24.365653229 +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.

          • 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.

            @@ -217,14 +217,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

            @@ -248,7 +248,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 @@ -264,12 +264,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

            @@ -293,11 +293,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 @@ -320,20 +320,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

              @@ -357,7 +357,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

              @@ -371,7 +371,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

              @@ -385,7 +385,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 @@ -400,7 +400,7 @@ ei_make_pid() /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/erl_interface.epub/OEBPS/ei_global.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_global.xhtml 2025-02-26 17:28:24.361653192 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/erl_interface.epub/OEBPS/ei_global.xhtml 2025-02-26 17:28:24.365653229 +0000 @@ -37,7 +37,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 @@ -49,20 +49,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 /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/erl_interface.epub/OEBPS/ei_users_guide.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_users_guide.xhtml 2025-02-26 17:28:24.361653192 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/erl_interface.epub/OEBPS/ei_users_guide.xhtml 2025-02-26 17:28:24.365653229 +0000 @@ -85,11 +85,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.

                    @@ -98,18 +98,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.

                    @@ -125,18 +125,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");

                    @@ -151,7 +151,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 @@ -174,13 +174,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.

                    @@ -194,24 +194,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, @@ -229,19 +229,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.

                    @@ -258,32 +258,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_interface.epub/OEBPS/erl_call_cmd.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/erl_call_cmd.xhtml 2025-02-26 17:28:24.361653192 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/erl_interface.epub/OEBPS/erl_call_cmd.xhtml 2025-02-26 17:28:24.365653229 +0000 @@ -156,8 +156,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
                    /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/notes.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/notes.html 2025-02-26 17:28:24.453654034 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/notes.html 2025-02-26 17:28:24.457654071 +0000 @@ -1807,7 +1807,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/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/search.html 2025-02-26 17:28:24.473654217 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.5.2/doc/html/search.html 2025-02-26 17:28:24.473654217 +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/et-1.7.1/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/404.html 2025-02-26 17:28:24.489654363 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/404.html 2025-02-26 17:28:24.489654363 +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/et-1.7.1/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/api-reference.html 2025-02-26 17:28:24.505654510 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/api-reference.html 2025-02-26 17:28:24.505654510 +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/et-1.7.1/doc/html/et.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et.epub/OEBPS/content.opf 2025-02-26 17:28:24.525654693 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et.epub/OEBPS/content.opf 2025-02-26 17:28:24.529654729 +0000 @@ -4,10 +4,10 @@ version="3.0"> et - 1.7.1 - urn:uuid:cc6b36a9-886b-d1a6-0894-bf02949f329f + urn:uuid:d2b45f14-242d-17e1-dbfe-4e61d985b5a1 en - 2025-02-26T17:22:39Z + 2041-03-31T06:42:01Z /usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et.epub/OEBPS/et_desc.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et.epub/OEBPS/et_desc.xhtml 2025-02-26 17:28:24.525654693 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et.epub/OEBPS/et_desc.xhtml 2025-02-26 17:28:24.529654729 +0000 @@ -33,33 +33,33 @@ enable other types of Viewers. However in the following text we will focus on usage of the et_viewer.

                    The main start function is et_viewer:start/1. By default it will start both an et_collector and an et_viewer:

                    % erl -pa et/examples
                    -Erlang R13B03 (erts-5.7.4) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
                    +Erlang R13B03 (erts-5.7.4) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
                     
                    -Eshell V5.7.4  (abort with ^G)
                    -1> {ok, Viewer} = et_viewer:start([]).
                    -{ok,<0.40.0>}

                    A Viewer gets trace Events from its Collector by polling it regularly for +Eshell V5.7.4 (abort with ^G) +1> {ok, Viewer} = et_viewer:start([]). +{ok,<0.40.0>}

                    A Viewer gets trace Events from its Collector by polling it regularly for more Events to display. Events are for example reported to the Collector -with et_collector:report_event/6:

                    2> Collector = et_viewer:get_collector_pid(Viewer).
                    +with et_collector:report_event/6:

                    2> Collector = et_viewer:get_collector_pid(Viewer).
                     <0.39.0>
                    -3> et_collector:report_event(Collector, 60, my_shell, mnesia_tm, start_outer,
                    -3>                           "Start outer transaction"),
                    -3> et_collector:report_event(Collector, 40, mnesia_tm, my_shell, new_tid,
                    -3>                           "New transaction id is 4711"),
                    -3> et_collector:report_event(Collector, 20, my_shell, mnesia_locker, try_write_lock,
                    -3>                           "Acquire write lock for {my_tab, key}"),
                    -3> et_collector:report_event(Collector, 10, mnesia_locker, my_shell, granted,
                    -3>                           "You got the write lock for {my_tab, key}"),
                    -3> et_collector:report_event(Collector, 60, my_shell, do_commit,
                    -3>                           "Perform  transaction commit"),
                    -3> et_collector:report_event(Collector, 40, my_shell, mnesia_locker, release_tid,
                    -3>                           "Release all locks for transaction 4711"),
                    -3> et_collector:report_event(Collector, 60, my_shell, mnesia_tm, delete_transaction,
                    -3>                           "End of outer transaction"),
                    -3> et_collector:report_event(Collector, 20, my_shell, end_outer,
                    -3>                           "Transaction returned {atomic, ok}").
                    -{ok,{table_handle,<0.39.0>,16402,trace_ts,
                    -     #Fun<et_collector.0.62831470>}}

                    This actually is a simulation of the process Events caused by a Mnesia -transaction that writes a record in a local table:

                    mnesia:transaction(fun() -> mnesia:write({my_tab, key, val}) end).

                    At this stage when we have a couple of Events, it is time to show how it looks +3> et_collector:report_event(Collector, 60, my_shell, mnesia_tm, start_outer, +3> "Start outer transaction"), +3> et_collector:report_event(Collector, 40, mnesia_tm, my_shell, new_tid, +3> "New transaction id is 4711"), +3> et_collector:report_event(Collector, 20, my_shell, mnesia_locker, try_write_lock, +3> "Acquire write lock for {my_tab, key}"), +3> et_collector:report_event(Collector, 10, mnesia_locker, my_shell, granted, +3> "You got the write lock for {my_tab, key}"), +3> et_collector:report_event(Collector, 60, my_shell, do_commit, +3> "Perform transaction commit"), +3> et_collector:report_event(Collector, 40, my_shell, mnesia_locker, release_tid, +3> "Release all locks for transaction 4711"), +3> et_collector:report_event(Collector, 60, my_shell, mnesia_tm, delete_transaction, +3> "End of outer transaction"), +3> et_collector:report_event(Collector, 20, my_shell, end_outer, +3> "Transaction returned {atomic, ok}"). +{ok,{table_handle,<0.39.0>,16402,trace_ts, + #Fun<et_collector.0.62831470>}}

                    This actually is a simulation of the process Events caused by a Mnesia +transaction that writes a record in a local table:

                    mnesia:transaction(fun() -> mnesia:write({my_tab, key, val}) end).

                    At this stage when we have a couple of Events, it is time to show how it looks like in the graphical interface of et_viewer:

                    A simulated Mnesia transaction which writes one record

                    In the sequence chart, the actors (which symbolically has performed the Event) are shown as named vertical bars. The order of the actors may be altered by dragging (hold mouse button 1 pressed during the operation) the name tag of an @@ -76,11 +76,11 @@

                    The Event Tracer (ET) uses named filters in various contexts. An Event Trace filter is an Erlang fun that takes some trace data as input and returns a -possibly modified version of it:

                    filter(TraceData) -> false | true | {true, NewEvent}
                    +possibly modified version of it:

                    filter(TraceData) -> false | true | {true, NewEvent}
                     
                    -TraceData = Event | erlang_trace_data()
                    -Event = #event{}
                    -NewEvent = #event{}

                    The interface of the filter function is the same as the the filter functions for +TraceData = Event | erlang_trace_data() +Event = #event{} +NewEvent = #event{}

                    The interface of the filter function is the same as the the filter functions for the good old lists:filtermap/2. If the filter returns false it means that the trace data should silently be dropped. true means that the trace data data already is an Event Record and that it should be kept as it is. true means @@ -107,21 +107,21 @@ in the viewer. The following filter in et/examples/et_demo.erl replaces the actor names mnesia_tm and mnesia_locker and leaves everything else in the record as it was:

                    
                    -mgr_actors(E) when is_record(E, event) ->
                    -    Actor = fun(A) ->
                    +mgr_actors(E) when is_record(E, event) ->
                    +    Actor = fun(A) ->
                                    case A of
                                        mnesia_tm     -> trans_mgr;
                                        mnesia_locker -> lock_mgr;
                                        _             -> A
                                    end
                                 end,
                    -    {true, E#event{from = Actor(E#event.from),
                    -                   to = Actor(E#event.to),
                    -                   contents = [{orig_from, E#event.from},
                    -                               {orig_to,   E#event.to},
                    -                               {orig_contents, E#event.contents}]}}.

                    If we now add the filter to the running Collector:

                    4> Fun = fun(E) -> et_demo:mgr_actors(E) end.
                    +    {true, E#event{from = Actor(E#event.from),
                    +                   to = Actor(E#event.to),
                    +                   contents = [{orig_from, E#event.from},
                    +                               {orig_to,   E#event.to},
                    +                               {orig_contents, E#event.contents}]}}.

                    If we now add the filter to the running Collector:

                    4> Fun = fun(E) -> et_demo:mgr_actors(E) end.
                     #Fun<erl_eval.6.13229925>
                    -5> et_collector:dict_insert(Collector, {filter, mgr_actors}, Fun).
                    +5> et_collector:dict_insert(Collector, {filter, mgr_actors}, Fun).
                     ok

                    you will see that the Filter menu in all viewers have got a new entry called mgr_actors. Select it, and a new Viewer window will pop up:

                    The same trace data in a different view

                    In order to see the nitty gritty details of an Event you may click on the Event in order to start a Contents Viewer for that Event. In the /usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et.epub/OEBPS/et_examples.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et.epub/OEBPS/et_examples.xhtml 2025-02-26 17:28:24.525654693 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et.epub/OEBPS/et_examples.xhtml 2025-02-26 17:28:24.529654729 +0000 @@ -28,52 +28,52 @@

                    The Erlang code for running the simulated Mnesia transaction example in the previous chapter is included in the et/examples/et_demo.erl file:

                    
                    -sim_trans() ->
                    -    sim_trans([]).
                    +sim_trans() ->
                    +    sim_trans([]).
                     
                    -sim_trans(ExtraOptions) ->
                    -    Options = [{dict_insert, {filter, mgr_actors}, fun mgr_actors/1}],
                    -    {ok, Viewer} = et_viewer:start_link(Options ++ ExtraOptions),
                    -    Collector = et_viewer:get_collector_pid(Viewer),
                    -    et_collector:report_event(Collector, 60, my_shell, mnesia_tm, start_outer,
                    -                              "Start outer transaction"),
                    -    et_collector:report_event(Collector, 40, mnesia_tm, my_shell, new_tid,
                    -                              "New transaction id is 4711"),
                    -    et_collector:report_event(Collector, 20, my_shell, mnesia_locker, try_write_lock,
                    -                              "Acquire write lock for {my_tab, key}"),
                    -    et_collector:report_event(Collector, 10, mnesia_locker, my_shell, granted,
                    -                              "You got the write lock for {my_tab, key}"),
                    -    et_collector:report_event(Collector, 60, my_shell, do_commit,
                    -                              "Perform  transaction commit"),
                    -    et_collector:report_event(Collector, 40, my_shell, mnesia_locker, release_tid,
                    -                              "Release all locks for transaction 4711"),
                    -    et_collector:report_event(Collector, 60, my_shell, mnesia_tm, delete_transaction,
                    -                              "End of outer transaction"),
                    -    et_collector:report_event(Collector, 20, my_shell, end_outer,
                    -                              "Transaction returned {atomic, ok}"),
                    -    {collector, Collector}.
                    
                    -mgr_actors(E) when is_record(E, event) ->
                    -    Actor = fun(A) ->
                    +sim_trans(ExtraOptions) ->
                    +    Options = [{dict_insert, {filter, mgr_actors}, fun mgr_actors/1}],
                    +    {ok, Viewer} = et_viewer:start_link(Options ++ ExtraOptions),
                    +    Collector = et_viewer:get_collector_pid(Viewer),
                    +    et_collector:report_event(Collector, 60, my_shell, mnesia_tm, start_outer,
                    +                              "Start outer transaction"),
                    +    et_collector:report_event(Collector, 40, mnesia_tm, my_shell, new_tid,
                    +                              "New transaction id is 4711"),
                    +    et_collector:report_event(Collector, 20, my_shell, mnesia_locker, try_write_lock,
                    +                              "Acquire write lock for {my_tab, key}"),
                    +    et_collector:report_event(Collector, 10, mnesia_locker, my_shell, granted,
                    +                              "You got the write lock for {my_tab, key}"),
                    +    et_collector:report_event(Collector, 60, my_shell, do_commit,
                    +                              "Perform  transaction commit"),
                    +    et_collector:report_event(Collector, 40, my_shell, mnesia_locker, release_tid,
                    +                              "Release all locks for transaction 4711"),
                    +    et_collector:report_event(Collector, 60, my_shell, mnesia_tm, delete_transaction,
                    +                              "End of outer transaction"),
                    +    et_collector:report_event(Collector, 20, my_shell, end_outer,
                    +                              "Transaction returned {atomic, ok}"),
                    +    {collector, Collector}.
                    
                    +mgr_actors(E) when is_record(E, event) ->
                    +    Actor = fun(A) ->
                                    case A of
                                        mnesia_tm     -> trans_mgr;
                                        mnesia_locker -> lock_mgr;
                                        _             -> A
                                    end
                                 end,
                    -    {true, E#event{from = Actor(E#event.from),
                    -                   to = Actor(E#event.to),
                    -                   contents = [{orig_from, E#event.from},
                    -                               {orig_to,   E#event.to},
                    -                               {orig_contents, E#event.contents}]}}.

                    If you invoke the et_demo:sim_trans() function, a Viewer window will pop up + {true, E#event{from = Actor(E#event.from), + to = Actor(E#event.to), + contents = [{orig_from, E#event.from}, + {orig_to, E#event.to}, + {orig_contents, E#event.contents}]}}.

                    If you invoke the et_demo:sim_trans() function, a Viewer window will pop up and the sequence trace will be almost the same as if the following Mnesia -transaction would have been run:

                    mnesia:transaction(fun() -> mnesia:write({my_tab, key, val}) end).

                    And the viewer window will look like:

                    Erlang R13B03 (erts-5.7.4) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
                    +transaction would have been run:

                    mnesia:transaction(fun() -> mnesia:write({my_tab, key, val}) end).

                    And the viewer window will look like:

                    Erlang R13B03 (erts-5.7.4) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
                     
                    -Eshell V5.7.4  (abort with ^G)
                    -1> {ok, Viewer} = et_viewer:start([]).
                    -{ok,<0.40.0>;}
                    -2> et_demo:sim_trans().
                    -{ok,{table_handle,<0.45.0>,24596,trace_ts,
                    -     #Fun<et_collector.0.62831470>}}

                    A simulated Mnesia transaction which writes one record

                    +Eshell V5.7.4 (abort with ^G) +1> {ok, Viewer} = et_viewer:start([]). +{ok,<0.40.0>;} +2> et_demo:sim_trans(). +{ok,{table_handle,<0.45.0>,24596,trace_ts, + #Fun<et_collector.0.62831470>}}

                    A simulated Mnesia transaction which writes one record

                    @@ -85,20 +85,20 @@ caller to the callee. The [{message, {caller}}, {return_trace}] options to dbg:tpl/2 function will imply the necessary information in the Erlang traces. Here follows the module_as_actor filter:

                    
                    -module_as_actor(E) when is_record(E, event) ->
                    -    case lists:keysearch(mfa, 1, E#event.contents) of
                    -        {value, {mfa, {M, F, _A}}} ->
                    -            case lists:keysearch(pam_result, 1, E#event.contents) of
                    -                {value, {pam_result, {M2, _F2, _A2}}} ->
                    -                    {true, E#event{label = F, from = M2, to = M}};
                    +module_as_actor(E) when is_record(E, event) ->
                    +    case lists:keysearch(mfa, 1, E#event.contents) of
                    +        {value, {mfa, {M, F, _A}}} ->
                    +            case lists:keysearch(pam_result, 1, E#event.contents) of
                    +                {value, {pam_result, {M2, _F2, _A2}}} ->
                    +                    {true, E#event{label = F, from = M2, to = M}};
                                     _ ->
                    -                    {true, E#event{label = F, from = M, to = M}}
                    +                    {true, E#event{label = F, from = M, to = M}}
                                 end;
                             _ ->
                                 false
                         end.

                    The plain_process_info filter does not alter the Event Records. It merely ensures that the event not related to processes are skipped:

                    
                    -plain_process_info(E) when is_record(E, event) ->
                    +plain_process_info(E) when is_record(E, event) ->
                         case E#event.label of
                             send                          -> true;
                             send_to_non_existing_process  -> true;
                    @@ -108,50 +108,50 @@
                             link                          -> true;
                             unlink                        -> true;
                             getting_linked                -> true;
                    -        {seq_send, _Label}            -> true;
                    -        {seq_receive, _Label}         -> true;
                    -        {seq_print, _Label}           -> true;
                    -        {drop, _N}                    -> true;
                    +        {seq_send, _Label}            -> true;
                    +        {seq_receive, _Label}         -> true;
                    +        {seq_print, _Label}           -> true;
                    +        {drop, _N}                    -> true;
                             _                             -> false
                         end.

                    The plain_process_info_nolink filter does not alter the Event Records. It do makes use of the plain_process_info , but do also ensure that the process info related to linking and unlinking is skipped:

                    
                    -plain_process_info_nolink(E) when is_record(E, event) ->
                    -    (E#event.label /= link) and
                    -    (E#event.label /= unlink) and
                    -    (E#event.label /= getting_linked) and
                    -    plain_process_info(E).

                    In order to simplify the startup of an et_viewer process with the filters +plain_process_info_nolink(E) when is_record(E, event) -> + (E#event.label /= link) and + (E#event.label /= unlink) and + (E#event.label /= getting_linked) and + plain_process_info(E).

                    In order to simplify the startup of an et_viewer process with the filters mentioned above, plus some others (that also are found in et/examples/et_demo.erl src/et_collector.erl the et_demo:start/0,1 functions can be used:

                    
                    -start() ->
                    -    start([]).
                    +start() ->
                    +    start([]).
                     
                    -start(ExtraOptions) ->
                    -    Options = [{trace_global, true},
                    -               {parent_pid, undefined},
                    -               {max_actors, infinity},
                    -               {max_events, 1000},
                    -               {active_filter, module_as_actor}],
                    -    et_viewer:start_link(filters() ++ Options ++ ExtraOptions).

                    A simple one-liner starts the tool:

                              erl -pa ../examples -s et_demo

                    The filters are included by the following parameters:

                    
                    -filters() ->
                    -    [{dict_insert, {filter, module_as_actor},
                    -                   fun module_as_actor/1},
                    -     {dict_insert, {filter, plain_process_info},
                    -                   fun plain_process_info/1},
                    -     {dict_insert, {filter, plain_process_info_nolink},
                    -                   fun plain_process_info_nolink/1},
                    -     {dict_insert, {filter, named_process_info},
                    -                   fun named_process_info/1},
                    -     {dict_insert, {filter, named_process_info_nolink},
                    -                   fun named_process_info_nolink/1},
                    -     {dict_insert, {filter, node_process_info},
                    -                   fun node_process_info/1},
                    -     {dict_insert, {filter, node_process_info_nolink},
                    -                   fun node_process_info_nolink/1},
                    -     {dict_insert, {filter, application_as_actor},
                    -                   fun application_as_actor/1}
                    -    ].

                    +start(ExtraOptions) -> + Options = [{trace_global, true}, + {parent_pid, undefined}, + {max_actors, infinity}, + {max_events, 1000}, + {active_filter, module_as_actor}], + et_viewer:start_link(filters() ++ Options ++ ExtraOptions).

                    A simple one-liner starts the tool:

                              erl -pa ../examples -s et_demo

                    The filters are included by the following parameters:

                    
                    +filters() ->
                    +    [{dict_insert, {filter, module_as_actor},
                    +                   fun module_as_actor/1},
                    +     {dict_insert, {filter, plain_process_info},
                    +                   fun plain_process_info/1},
                    +     {dict_insert, {filter, plain_process_info_nolink},
                    +                   fun plain_process_info_nolink/1},
                    +     {dict_insert, {filter, named_process_info},
                    +                   fun named_process_info/1},
                    +     {dict_insert, {filter, named_process_info_nolink},
                    +                   fun named_process_info_nolink/1},
                    +     {dict_insert, {filter, node_process_info},
                    +                   fun node_process_info/1},
                    /usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et.epub/OEBPS/et_tutorial.xhtml differs (HTML document, ASCII text, with very long lines)
                    --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et.epub/OEBPS/et_tutorial.xhtml	2025-02-26 17:28:24.525654693 +0000
                    +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et.epub/OEBPS/et_tutorial.xhtml	2025-02-26 17:28:24.529654729 +0000
                    @@ -28,8 +28,8 @@
                     

                    The easiest way of using ET, is to just use it as a graphical tool for displaying message sequence charts. In order to do that you need to first start -a Viewer (which by default starts a Collector):

                          {ok, ViewerPid} = et_viewer:start([{title,"Coffee Order"}]),
                    -      CollectorPid = et_viewer:get_collector_pid(ViewerPid).

                    Then you send events to the Collector with the function +a Viewer (which by default starts a Collector):

                          {ok, ViewerPid} = et_viewer:start([{title,"Coffee Order"}]),
                    +      CollectorPid = et_viewer:get_collector_pid(ViewerPid).

                    Then you send events to the Collector with the function et_collector:report_event/6 like this:

                          et_collector:report_event(CollectorPid,85,from,to,message,extra_stuff).

                    The Viewer will automatically pull events from the Collector and display them on the screen.

                    The number (in this case 85) is an integer from 1 to 100 that specifies the "detail level" of the message. The higher the number, the more important it is. @@ -39,30 +39,30 @@ displayed next to the lifeline as an "action". The extra_stuffvalue is simply data that you can attach that will be displayed when someone actually clicks on the action or message in the Viewer window.

                    The module et/examples/et_display_demo.erl illustrates how it can be used:

                    
                    --module(et_display_demo).
                    +-module(et_display_demo).
                     
                    --export([test/0]).
                    +-export([test/0]).
                     
                    -test() ->
                    -    {ok, Viewer} = et_viewer:start([{title,"Coffee Order"}, {max_actors,10}]),
                    -    Drink = {drink,iced_chai_latte},
                    -    Size = {size,grande},
                    -    Milk = {milk,whole},
                    -    Flavor = {flavor,vanilla},
                    -    C = et_viewer:get_collector_pid(Viewer),
                    -    et_collector:report_event(C,99,customer,barrista1,place_order,[Drink,Size,Milk,Flavor]),
                    -    et_collector:report_event(C,80,barrista1,register,enter_order,[Drink,Size,Flavor]),
                    -    et_collector:report_event(C,80,register,barrista1,give_total,"$5"),
                    -    et_collector:report_event(C,80,barrista1,barrista1,get_cup,[Drink,Size]),
                    -    et_collector:report_event(C,80,barrista1,barrista2,give_cup,[]),
                    -    et_collector:report_event(C,90,barrista1,customer,request_money,"$5"),
                    -    et_collector:report_event(C,90,customer,barrista1,pay_money,"$5"),
                    -    et_collector:report_event(C,80,barrista2,barrista2,get_chai_mix,[]),
                    -    et_collector:report_event(C,80,barrista2,barrista2,add_flavor,[Flavor]),
                    -    et_collector:report_event(C,80,barrista2,barrista2,add_milk,[Milk]),
                    -    et_collector:report_event(C,80,barrista2,barrista2,add_ice,[]),
                    -    et_collector:report_event(C,80,barrista2,barrista2,swirl,[]),
                    -    et_collector:report_event(C,80,barrista2,customer,give_tasty_beverage,[Drink,Size]),
                    +test() ->
                    +    {ok, Viewer} = et_viewer:start([{title,"Coffee Order"}, {max_actors,10}]),
                    +    Drink = {drink,iced_chai_latte},
                    +    Size = {size,grande},
                    +    Milk = {milk,whole},
                    +    Flavor = {flavor,vanilla},
                    +    C = et_viewer:get_collector_pid(Viewer),
                    +    et_collector:report_event(C,99,customer,barrista1,place_order,[Drink,Size,Milk,Flavor]),
                    +    et_collector:report_event(C,80,barrista1,register,enter_order,[Drink,Size,Flavor]),
                    +    et_collector:report_event(C,80,register,barrista1,give_total,"$5"),
                    +    et_collector:report_event(C,80,barrista1,barrista1,get_cup,[Drink,Size]),
                    +    et_collector:report_event(C,80,barrista1,barrista2,give_cup,[]),
                    +    et_collector:report_event(C,90,barrista1,customer,request_money,"$5"),
                    +    et_collector:report_event(C,90,customer,barrista1,pay_money,"$5"),
                    +    et_collector:report_event(C,80,barrista2,barrista2,get_chai_mix,[]),
                    +    et_collector:report_event(C,80,barrista2,barrista2,add_flavor,[Flavor]),
                    +    et_collector:report_event(C,80,barrista2,barrista2,add_milk,[Milk]),
                    +    et_collector:report_event(C,80,barrista2,barrista2,add_ice,[]),
                    +    et_collector:report_event(C,80,barrista2,barrista2,swirl,[]),
                    +    et_collector:report_event(C,80,barrista2,customer,give_tasty_beverage,[Drink,Size]),
                         ok.

                    When you run the et_display_demo:test(). function in the example above, the Viewer window will look like this:

                    Screenshot of the Viewer window

                    @@ -94,7 +94,7 @@ calls. The idea is that you should instrument your code with calls to et:trace_me/5 in strategic places where you have interesting information available in your program. Then you just start the Collector with global -tracing enabled:

                          et_viewer:start([{trace_global, true}, {trace_pattern, {et,max}}]).

                    This will start a Collector, a Viewer and also start the tracing of +tracing enabled:

                          et_viewer:start([{trace_global, true}, {trace_pattern, {et,max}}]).

                    This will start a Collector, a Viewer and also start the tracing of et:trace_me/5 function calls. The Raw Trace Data is collected by the Collector and a view of it is displayed on the screen by the Viewer. You can define your own "views" of the data by implementing your own Filter functions @@ -150,36 +150,36 @@ all you have to do is enable them.

                    For those people who want to do general tracing, consult the dbg module on how to trace whatever you're interested in and let it work its magic. If you just want et:trace_me/5 to work, do the following:

                    1. Create a Collector
                    2. Create a Viewer (this can do step #1 for you)
                    3. Turn on and pare down debugging

                    The module et/examples/et_trace_demo.erl achieves this.

                    
                    --module(et_trace_demo).
                    +-module(et_trace_demo).
                     
                    --export([test/0]).
                    +-export([test/0]).
                     
                    -test() ->
                    -    et_viewer:start([
                    -        {title,"Coffee Order"},
                    -        {trace_global,true},
                    -        {trace_pattern,{et,max}},
                    -        {max_actors,10}
                    -      ]),
                    +test() ->
                    +    et_viewer:start([
                    +        {title,"Coffee Order"},
                    +        {trace_global,true},
                    +        {trace_pattern,{et,max}},
                    +        {max_actors,10}
                    +      ]),
                           %% dbg:p(all,call),
                           %% dbg:tpl(et, trace_me, 5, []),
                    -      Drink = {drink,iced_chai_latte},
                    -      Size = {size,grande},
                    -      Milk = {milk,whole},
                    -      Flavor = {flavor,vanilla},
                    -      et:trace_me(99,customer,barrista1,place_order,[Drink,Size,Milk,Flavor]),
                    -      et:trace_me(80,barrista1,register,enter_order,[Drink,Size,Flavor]),
                    -      et:trace_me(80,register,barrista1,give_total,"$5"),
                    -      et:trace_me(80,barrista1,barrista1,get_cup,[Drink,Size]),
                    -      et:trace_me(80,barrista1,barrista2,give_cup,[]),
                    -      et:trace_me(90,barrista1,customer,request_money,"$5"),
                    -      et:trace_me(90,customer,barrista1,pay_money,"$5"),
                    -      et:trace_me(80,barrista2,barrista2,get_chai_mix,[]),
                    -      et:trace_me(80,barrista2,barrista2,add_flavor,[Flavor]),
                    -      et:trace_me(80,barrista2,barrista2,add_milk,[Milk]),
                    -      et:trace_me(80,barrista2,barrista2,add_ice,[]),
                    -      et:trace_me(80,barrista2,barrista2,swirl,[]),
                    -      et:trace_me(80,barrista2,customer,give_tasty_beverage,[Drink,Size]),
                    +      Drink = {drink,iced_chai_latte},
                    +      Size = {size,grande},
                    +      Milk = {milk,whole},
                    +      Flavor = {flavor,vanilla},
                    +      et:trace_me(99,customer,barrista1,place_order,[Drink,Size,Milk,Flavor]),
                    +      et:trace_me(80,barrista1,register,enter_order,[Drink,Size,Flavor]),
                    +      et:trace_me(80,register,barrista1,give_total,"$5"),
                    +      et:trace_me(80,barrista1,barrista1,get_cup,[Drink,Size]),
                    +      et:trace_me(80,barrista1,barrista2,give_cup,[]),
                    +      et:trace_me(90,barrista1,customer,request_money,"$5"),
                    +      et:trace_me(90,customer,barrista1,pay_money,"$5"),
                    +      et:trace_me(80,barrista2,barrista2,get_chai_mix,[]),
                    +      et:trace_me(80,barrista2,barrista2,add_flavor,[Flavor]),
                    +      et:trace_me(80,barrista2,barrista2,add_milk,[Milk]),
                    +      et:trace_me(80,barrista2,barrista2,add_ice,[]),
                    +      et:trace_me(80,barrista2,barrista2,swirl,[]),
                    +      et:trace_me(80,barrista2,customer,give_tasty_beverage,[Drink,Size]),
                           ok.

                    Running through the above, the most important points are:

                    • Turn on global tracing
                    • Set a Trace Pattern
                    • Tell dbg to trace function Calls
                    • Tell it specifically to trace the et:trace_me/5 function

                    When you run the et_trace_demo:test() function above, the Viewer window will look like this screenshot:

                    Screenshot of the Viewer window

                    /usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et.html 2025-02-26 17:28:24.609655462 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et.html 2025-02-26 17:28:24.609655462 +0000 @@ -556,7 +556,7 @@ Erlang programming language

                    -

                    Copyright © 1996-2025 Ericsson AB

                    +

                    Copyright © 1996-2041 Ericsson AB

                    /usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_collector.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_collector.html 2025-02-26 17:28:24.641655754 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_collector.html 2025-02-26 17:28:24.641655754 +0000 @@ -1541,7 +1541,7 @@ Erlang programming language

                    -

                    Copyright © 1996-2025 Ericsson AB

                    +

                    Copyright © 1996-2041 Ericsson AB

                    /usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_desc.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_desc.html 2025-02-26 17:28:24.661655937 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_desc.html 2025-02-26 17:28:24.661655937 +0000 @@ -138,33 +138,33 @@ enable other types of Viewers. However in the following text we will focus on usage of the et_viewer.

                    The main start function is et_viewer:start/1. By default it will start both an et_collector and an et_viewer:

                    % erl -pa et/examples
                    -Erlang R13B03 (erts-5.7.4) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
                    +Erlang R13B03 (erts-5.7.4) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
                     
                    -Eshell V5.7.4  (abort with ^G)
                    -1> {ok, Viewer} = et_viewer:start([]).
                    -{ok,<0.40.0>}

                    A Viewer gets trace Events from its Collector by polling it regularly for +Eshell V5.7.4 (abort with ^G) +1> {ok, Viewer} = et_viewer:start([]). +{ok,<0.40.0>}

                    A Viewer gets trace Events from its Collector by polling it regularly for more Events to display. Events are for example reported to the Collector -with et_collector:report_event/6:

                    2> Collector = et_viewer:get_collector_pid(Viewer).
                    +with et_collector:report_event/6:

                    2> Collector = et_viewer:get_collector_pid(Viewer).
                     <0.39.0>
                    -3> et_collector:report_event(Collector, 60, my_shell, mnesia_tm, start_outer,
                    -3>                           "Start outer transaction"),
                    -3> et_collector:report_event(Collector, 40, mnesia_tm, my_shell, new_tid,
                    -3>                           "New transaction id is 4711"),
                    -3> et_collector:report_event(Collector, 20, my_shell, mnesia_locker, try_write_lock,
                    -3>                           "Acquire write lock for {my_tab, key}"),
                    -3> et_collector:report_event(Collector, 10, mnesia_locker, my_shell, granted,
                    -3>                           "You got the write lock for {my_tab, key}"),
                    -3> et_collector:report_event(Collector, 60, my_shell, do_commit,
                    -3>                           "Perform  transaction commit"),
                    -3> et_collector:report_event(Collector, 40, my_shell, mnesia_locker, release_tid,
                    -3>                           "Release all locks for transaction 4711"),
                    -3> et_collector:report_event(Collector, 60, my_shell, mnesia_tm, delete_transaction,
                    -3>                           "End of outer transaction"),
                    -3> et_collector:report_event(Collector, 20, my_shell, end_outer,
                    -3>                           "Transaction returned {atomic, ok}").
                    -{ok,{table_handle,<0.39.0>,16402,trace_ts,
                    -     #Fun<et_collector.0.62831470>}}

                    This actually is a simulation of the process Events caused by a Mnesia -transaction that writes a record in a local table:

                    mnesia:transaction(fun() -> mnesia:write({my_tab, key, val}) end).

                    At this stage when we have a couple of Events, it is time to show how it looks +3> et_collector:report_event(Collector, 60, my_shell, mnesia_tm, start_outer, +3> "Start outer transaction"), +3> et_collector:report_event(Collector, 40, mnesia_tm, my_shell, new_tid, +3> "New transaction id is 4711"), +3> et_collector:report_event(Collector, 20, my_shell, mnesia_locker, try_write_lock, +3> "Acquire write lock for {my_tab, key}"), +3> et_collector:report_event(Collector, 10, mnesia_locker, my_shell, granted, +3> "You got the write lock for {my_tab, key}"), +3> et_collector:report_event(Collector, 60, my_shell, do_commit, +3> "Perform transaction commit"), +3> et_collector:report_event(Collector, 40, my_shell, mnesia_locker, release_tid, +3> "Release all locks for transaction 4711"), +3> et_collector:report_event(Collector, 60, my_shell, mnesia_tm, delete_transaction, +3> "End of outer transaction"), +3> et_collector:report_event(Collector, 20, my_shell, end_outer, +3> "Transaction returned {atomic, ok}"). +{ok,{table_handle,<0.39.0>,16402,trace_ts, + #Fun<et_collector.0.62831470>}}

                    This actually is a simulation of the process Events caused by a Mnesia +transaction that writes a record in a local table:

                    mnesia:transaction(fun() -> mnesia:write({my_tab, key, val}) end).

                    At this stage when we have a couple of Events, it is time to show how it looks like in the graphical interface of et_viewer:

                    A simulated Mnesia transaction which writes one record

                    In the sequence chart, the actors (which symbolically has performed the Event) are shown as named vertical bars. The order of the actors may be altered by dragging (hold mouse button 1 pressed during the operation) the name tag of an @@ -181,11 +181,11 @@

                    The Event Tracer (ET) uses named filters in various contexts. An Event Trace filter is an Erlang fun that takes some trace data as input and returns a -possibly modified version of it:

                    filter(TraceData) -> false | true | {true, NewEvent}
                    +possibly modified version of it:

                    filter(TraceData) -> false | true | {true, NewEvent}
                     
                    -TraceData = Event | erlang_trace_data()
                    -Event = #event{}
                    -NewEvent = #event{}

                    The interface of the filter function is the same as the the filter functions for +TraceData = Event | erlang_trace_data() +Event = #event{} +NewEvent = #event{}

                    The interface of the filter function is the same as the the filter functions for the good old lists:filtermap/2. If the filter returns false it means that the trace data should silently be dropped. true means that the trace data data already is an Event Record and that it should be kept as it is. true means @@ -212,21 +212,21 @@ in the viewer. The following filter in et/examples/et_demo.erl replaces the actor names mnesia_tm and mnesia_locker and leaves everything else in the record as it was:

                    
                    -mgr_actors(E) when is_record(E, event) ->
                    -    Actor = fun(A) ->
                    +mgr_actors(E) when is_record(E, event) ->
                    +    Actor = fun(A) ->
                                    case A of
                                        mnesia_tm     -> trans_mgr;
                                        mnesia_locker -> lock_mgr;
                                        _             -> A
                                    end
                                 end,
                    -    {true, E#event{from = Actor(E#event.from),
                    -                   to = Actor(E#event.to),
                    -                   contents = [{orig_from, E#event.from},
                    -                               {orig_to,   E#event.to},
                    -                               {orig_contents, E#event.contents}]}}.

                    If we now add the filter to the running Collector:

                    4> Fun = fun(E) -> et_demo:mgr_actors(E) end.
                    +    {true, E#event{from = Actor(E#event.from),
                    +                   to = Actor(E#event.to),
                    +                   contents = [{orig_from, E#event.from},
                    +                               {orig_to,   E#event.to},
                    +                               {orig_contents, E#event.contents}]}}.

                    If we now add the filter to the running Collector:

                    4> Fun = fun(E) -> et_demo:mgr_actors(E) end.
                     #Fun<erl_eval.6.13229925>
                    -5> et_collector:dict_insert(Collector, {filter, mgr_actors}, Fun).
                    +5> et_collector:dict_insert(Collector, {filter, mgr_actors}, Fun).
                     ok

                    you will see that the Filter menu in all viewers have got a new entry called mgr_actors. Select it, and a new Viewer window will pop up:

                    The same trace data in a different view

                    In order to see the nitty gritty details of an Event you may click on the Event in order to start a Contents Viewer for that Event. In the @@ -423,7 +423,7 @@ Erlang programming language

                    -

                    Copyright © 1996-2025 Ericsson AB

                    +

                    Copyright © 1996-2041 Ericsson AB

                    /usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_examples.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_examples.html 2025-02-26 17:28:24.689656193 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_examples.html 2025-02-26 17:28:24.689656193 +0000 @@ -133,52 +133,52 @@

                    The Erlang code for running the simulated Mnesia transaction example in the previous chapter is included in the et/examples/et_demo.erl file:

                    
                    -sim_trans() ->
                    -    sim_trans([]).
                    +sim_trans() ->
                    +    sim_trans([]).
                     
                    -sim_trans(ExtraOptions) ->
                    -    Options = [{dict_insert, {filter, mgr_actors}, fun mgr_actors/1}],
                    -    {ok, Viewer} = et_viewer:start_link(Options ++ ExtraOptions),
                    -    Collector = et_viewer:get_collector_pid(Viewer),
                    -    et_collector:report_event(Collector, 60, my_shell, mnesia_tm, start_outer,
                    -                              "Start outer transaction"),
                    -    et_collector:report_event(Collector, 40, mnesia_tm, my_shell, new_tid,
                    -                              "New transaction id is 4711"),
                    -    et_collector:report_event(Collector, 20, my_shell, mnesia_locker, try_write_lock,
                    -                              "Acquire write lock for {my_tab, key}"),
                    -    et_collector:report_event(Collector, 10, mnesia_locker, my_shell, granted,
                    -                              "You got the write lock for {my_tab, key}"),
                    -    et_collector:report_event(Collector, 60, my_shell, do_commit,
                    -                              "Perform  transaction commit"),
                    -    et_collector:report_event(Collector, 40, my_shell, mnesia_locker, release_tid,
                    -                              "Release all locks for transaction 4711"),
                    -    et_collector:report_event(Collector, 60, my_shell, mnesia_tm, delete_transaction,
                    -                              "End of outer transaction"),
                    -    et_collector:report_event(Collector, 20, my_shell, end_outer,
                    -                              "Transaction returned {atomic, ok}"),
                    -    {collector, Collector}.
                    
                    -mgr_actors(E) when is_record(E, event) ->
                    -    Actor = fun(A) ->
                    +sim_trans(ExtraOptions) ->
                    +    Options = [{dict_insert, {filter, mgr_actors}, fun mgr_actors/1}],
                    +    {ok, Viewer} = et_viewer:start_link(Options ++ ExtraOptions),
                    +    Collector = et_viewer:get_collector_pid(Viewer),
                    +    et_collector:report_event(Collector, 60, my_shell, mnesia_tm, start_outer,
                    +                              "Start outer transaction"),
                    +    et_collector:report_event(Collector, 40, mnesia_tm, my_shell, new_tid,
                    +                              "New transaction id is 4711"),
                    +    et_collector:report_event(Collector, 20, my_shell, mnesia_locker, try_write_lock,
                    +                              "Acquire write lock for {my_tab, key}"),
                    +    et_collector:report_event(Collector, 10, mnesia_locker, my_shell, granted,
                    +                              "You got the write lock for {my_tab, key}"),
                    +    et_collector:report_event(Collector, 60, my_shell, do_commit,
                    +                              "Perform  transaction commit"),
                    +    et_collector:report_event(Collector, 40, my_shell, mnesia_locker, release_tid,
                    +                              "Release all locks for transaction 4711"),
                    +    et_collector:report_event(Collector, 60, my_shell, mnesia_tm, delete_transaction,
                    +                              "End of outer transaction"),
                    +    et_collector:report_event(Collector, 20, my_shell, end_outer,
                    +                              "Transaction returned {atomic, ok}"),
                    +    {collector, Collector}.
                    
                    +mgr_actors(E) when is_record(E, event) ->
                    +    Actor = fun(A) ->
                                    case A of
                                        mnesia_tm     -> trans_mgr;
                                        mnesia_locker -> lock_mgr;
                                        _             -> A
                                    end
                                 end,
                    -    {true, E#event{from = Actor(E#event.from),
                    -                   to = Actor(E#event.to),
                    -                   contents = [{orig_from, E#event.from},
                    -                               {orig_to,   E#event.to},
                    -                               {orig_contents, E#event.contents}]}}.

                    If you invoke the et_demo:sim_trans() function, a Viewer window will pop up + {true, E#event{from = Actor(E#event.from), + to = Actor(E#event.to), + contents = [{orig_from, E#event.from}, + {orig_to, E#event.to}, + {orig_contents, E#event.contents}]}}.

                    If you invoke the et_demo:sim_trans() function, a Viewer window will pop up and the sequence trace will be almost the same as if the following Mnesia -transaction would have been run:

                    mnesia:transaction(fun() -> mnesia:write({my_tab, key, val}) end).

                    And the viewer window will look like:

                    Erlang R13B03 (erts-5.7.4) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
                    +transaction would have been run:

                    mnesia:transaction(fun() -> mnesia:write({my_tab, key, val}) end).

                    And the viewer window will look like:

                    Erlang R13B03 (erts-5.7.4) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
                     
                    -Eshell V5.7.4  (abort with ^G)
                    -1> {ok, Viewer} = et_viewer:start([]).
                    -{ok,<0.40.0>;}
                    -2> et_demo:sim_trans().
                    -{ok,{table_handle,<0.45.0>,24596,trace_ts,
                    -     #Fun<et_collector.0.62831470>}}

                    A simulated Mnesia transaction which writes one record

                    +Eshell V5.7.4 (abort with ^G) +1> {ok, Viewer} = et_viewer:start([]). +{ok,<0.40.0>;} +2> et_demo:sim_trans(). +{ok,{table_handle,<0.45.0>,24596,trace_ts, + #Fun<et_collector.0.62831470>}}

                    A simulated Mnesia transaction which writes one record

                    @@ -190,20 +190,20 @@ caller to the callee. The [{message, {caller}}, {return_trace}] options to dbg:tpl/2 function will imply the necessary information in the Erlang traces. Here follows the module_as_actor filter:

                    
                    -module_as_actor(E) when is_record(E, event) ->
                    -    case lists:keysearch(mfa, 1, E#event.contents) of
                    -        {value, {mfa, {M, F, _A}}} ->
                    -            case lists:keysearch(pam_result, 1, E#event.contents) of
                    -                {value, {pam_result, {M2, _F2, _A2}}} ->
                    -                    {true, E#event{label = F, from = M2, to = M}};
                    +module_as_actor(E) when is_record(E, event) ->
                    +    case lists:keysearch(mfa, 1, E#event.contents) of
                    +        {value, {mfa, {M, F, _A}}} ->
                    +            case lists:keysearch(pam_result, 1, E#event.contents) of
                    +                {value, {pam_result, {M2, _F2, _A2}}} ->
                    +                    {true, E#event{label = F, from = M2, to = M}};
                                     _ ->
                    -                    {true, E#event{label = F, from = M, to = M}}
                    +                    {true, E#event{label = F, from = M, to = M}}
                                 end;
                             _ ->
                                 false
                         end.

                    The plain_process_info filter does not alter the Event Records. It merely ensures that the event not related to processes are skipped:

                    
                    -plain_process_info(E) when is_record(E, event) ->
                    +plain_process_info(E) when is_record(E, event) ->
                         case E#event.label of
                             send                          -> true;
                             send_to_non_existing_process  -> true;
                    @@ -213,50 +213,50 @@
                             link                          -> true;
                             unlink                        -> true;
                             getting_linked                -> true;
                    -        {seq_send, _Label}            -> true;
                    -        {seq_receive, _Label}         -> true;
                    -        {seq_print, _Label}           -> true;
                    -        {drop, _N}                    -> true;
                    +        {seq_send, _Label}            -> true;
                    +        {seq_receive, _Label}         -> true;
                    +        {seq_print, _Label}           -> true;
                    +        {drop, _N}                    -> true;
                             _                             -> false
                         end.

                    The plain_process_info_nolink filter does not alter the Event Records. It do makes use of the plain_process_info , but do also ensure that the process info related to linking and unlinking is skipped:

                    
                    -plain_process_info_nolink(E) when is_record(E, event) ->
                    -    (E#event.label /= link) and
                    -    (E#event.label /= unlink) and
                    -    (E#event.label /= getting_linked) and
                    -    plain_process_info(E).

                    In order to simplify the startup of an et_viewer process with the filters +plain_process_info_nolink(E) when is_record(E, event) -> + (E#event.label /= link) and + (E#event.label /= unlink) and + (E#event.label /= getting_linked) and + plain_process_info(E).

                    In order to simplify the startup of an et_viewer process with the filters mentioned above, plus some others (that also are found in et/examples/et_demo.erl src/et_collector.erl the et_demo:start/0,1 functions can be used:

                    
                    -start() ->
                    -    start([]).
                    +start() ->
                    +    start([]).
                     
                    -start(ExtraOptions) ->
                    -    Options = [{trace_global, true},
                    -               {parent_pid, undefined},
                    -               {max_actors, infinity},
                    -               {max_events, 1000},
                    -               {active_filter, module_as_actor}],
                    -    et_viewer:start_link(filters() ++ Options ++ ExtraOptions).

                    A simple one-liner starts the tool:

                              erl -pa ../examples -s et_demo

                    The filters are included by the following parameters:

                    
                    -filters() ->
                    -    [{dict_insert, {filter, module_as_actor},
                    -                   fun module_as_actor/1},
                    -     {dict_insert, {filter, plain_process_info},
                    -                   fun plain_process_info/1},
                    -     {dict_insert, {filter, plain_process_info_nolink},
                    -                   fun plain_process_info_nolink/1},
                    -     {dict_insert, {filter, named_process_info},
                    -                   fun named_process_info/1},
                    -     {dict_insert, {filter, named_process_info_nolink},
                    -                   fun named_process_info_nolink/1},
                    -     {dict_insert, {filter, node_process_info},
                    -                   fun node_process_info/1},
                    -     {dict_insert, {filter, node_process_info_nolink},
                    -                   fun node_process_info_nolink/1},
                    -     {dict_insert, {filter, application_as_actor},
                    -                   fun application_as_actor/1}
                    -    ].

                    +start(ExtraOptions) -> + Options = [{trace_global, true}, + {parent_pid, undefined}, + {max_actors, infinity}, + {max_events, 1000}, + {active_filter, module_as_actor}], + et_viewer:start_link(filters() ++ Options ++ ExtraOptions).

                    A simple one-liner starts the tool:

                              erl -pa ../examples -s et_demo

                    The filters are included by the following parameters:

                    
                    +filters() ->
                    +    [{dict_insert, {filter, module_as_actor},
                    +                   fun module_as_actor/1},
                    +     {dict_insert, {filter, plain_process_info},
                    +                   fun plain_process_info/1},
                    +     {dict_insert, {filter, plain_process_info_nolink},
                    +                   fun plain_process_info_nolink/1},
                    +     {dict_insert, {filter, named_process_info},
                    +                   fun named_process_info/1},
                    +     {dict_insert, {filter, named_process_info_nolink},
                    +                   fun named_process_info_nolink/1},
                    +     {dict_insert, {filter, node_process_info},
                    +                   fun node_process_info/1},
                    /usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_intro.html differs (HTML document, UTF-8 Unicode text, with very long lines)
                    --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_intro.html	2025-02-26 17:28:24.709656376 +0000
                    +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_intro.html	2025-02-26 17:28:24.709656376 +0000
                    @@ -215,7 +215,7 @@
                               Erlang programming language
                     
                           

                    -

                    Copyright © 1996-2025 Ericsson AB

                    +

                    Copyright © 1996-2041 Ericsson AB

                    /usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_selector.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_selector.html 2025-02-26 17:28:24.725656522 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_selector.html 2025-02-26 17:28:24.725656522 +0000 @@ -429,7 +429,7 @@ Erlang programming language

                    -

                    Copyright © 1996-2025 Ericsson AB

                    +

                    Copyright © 1996-2041 Ericsson AB

                    /usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_tutorial.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_tutorial.html 2025-02-26 17:28:24.749656743 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_tutorial.html 2025-02-26 17:28:24.749656743 +0000 @@ -133,8 +133,8 @@

                    The easiest way of using ET, is to just use it as a graphical tool for displaying message sequence charts. In order to do that you need to first start -a Viewer (which by default starts a Collector):

                          {ok, ViewerPid} = et_viewer:start([{title,"Coffee Order"}]),
                    -      CollectorPid = et_viewer:get_collector_pid(ViewerPid).

                    Then you send events to the Collector with the function +a Viewer (which by default starts a Collector):

                          {ok, ViewerPid} = et_viewer:start([{title,"Coffee Order"}]),
                    +      CollectorPid = et_viewer:get_collector_pid(ViewerPid).

                    Then you send events to the Collector with the function et_collector:report_event/6 like this:

                          et_collector:report_event(CollectorPid,85,from,to,message,extra_stuff).

                    The Viewer will automatically pull events from the Collector and display them on the screen.

                    The number (in this case 85) is an integer from 1 to 100 that specifies the "detail level" of the message. The higher the number, the more important it is. @@ -144,30 +144,30 @@ displayed next to the lifeline as an "action". The extra_stuffvalue is simply data that you can attach that will be displayed when someone actually clicks on the action or message in the Viewer window.

                    The module et/examples/et_display_demo.erl illustrates how it can be used:

                    
                    --module(et_display_demo).
                    +-module(et_display_demo).
                     
                    --export([test/0]).
                    +-export([test/0]).
                     
                    -test() ->
                    -    {ok, Viewer} = et_viewer:start([{title,"Coffee Order"}, {max_actors,10}]),
                    -    Drink = {drink,iced_chai_latte},
                    -    Size = {size,grande},
                    -    Milk = {milk,whole},
                    -    Flavor = {flavor,vanilla},
                    -    C = et_viewer:get_collector_pid(Viewer),
                    -    et_collector:report_event(C,99,customer,barrista1,place_order,[Drink,Size,Milk,Flavor]),
                    -    et_collector:report_event(C,80,barrista1,register,enter_order,[Drink,Size,Flavor]),
                    -    et_collector:report_event(C,80,register,barrista1,give_total,"$5"),
                    -    et_collector:report_event(C,80,barrista1,barrista1,get_cup,[Drink,Size]),
                    -    et_collector:report_event(C,80,barrista1,barrista2,give_cup,[]),
                    -    et_collector:report_event(C,90,barrista1,customer,request_money,"$5"),
                    -    et_collector:report_event(C,90,customer,barrista1,pay_money,"$5"),
                    -    et_collector:report_event(C,80,barrista2,barrista2,get_chai_mix,[]),
                    -    et_collector:report_event(C,80,barrista2,barrista2,add_flavor,[Flavor]),
                    -    et_collector:report_event(C,80,barrista2,barrista2,add_milk,[Milk]),
                    -    et_collector:report_event(C,80,barrista2,barrista2,add_ice,[]),
                    -    et_collector:report_event(C,80,barrista2,barrista2,swirl,[]),
                    -    et_collector:report_event(C,80,barrista2,customer,give_tasty_beverage,[Drink,Size]),
                    +test() ->
                    +    {ok, Viewer} = et_viewer:start([{title,"Coffee Order"}, {max_actors,10}]),
                    +    Drink = {drink,iced_chai_latte},
                    +    Size = {size,grande},
                    +    Milk = {milk,whole},
                    +    Flavor = {flavor,vanilla},
                    +    C = et_viewer:get_collector_pid(Viewer),
                    +    et_collector:report_event(C,99,customer,barrista1,place_order,[Drink,Size,Milk,Flavor]),
                    +    et_collector:report_event(C,80,barrista1,register,enter_order,[Drink,Size,Flavor]),
                    +    et_collector:report_event(C,80,register,barrista1,give_total,"$5"),
                    +    et_collector:report_event(C,80,barrista1,barrista1,get_cup,[Drink,Size]),
                    +    et_collector:report_event(C,80,barrista1,barrista2,give_cup,[]),
                    +    et_collector:report_event(C,90,barrista1,customer,request_money,"$5"),
                    +    et_collector:report_event(C,90,customer,barrista1,pay_money,"$5"),
                    +    et_collector:report_event(C,80,barrista2,barrista2,get_chai_mix,[]),
                    +    et_collector:report_event(C,80,barrista2,barrista2,add_flavor,[Flavor]),
                    +    et_collector:report_event(C,80,barrista2,barrista2,add_milk,[Milk]),
                    +    et_collector:report_event(C,80,barrista2,barrista2,add_ice,[]),
                    +    et_collector:report_event(C,80,barrista2,barrista2,swirl,[]),
                    +    et_collector:report_event(C,80,barrista2,customer,give_tasty_beverage,[Drink,Size]),
                         ok.

                    When you run the et_display_demo:test(). function in the example above, the Viewer window will look like this:

                    Screenshot of the Viewer window

                    @@ -199,7 +199,7 @@ calls. The idea is that you should instrument your code with calls to et:trace_me/5 in strategic places where you have interesting information available in your program. Then you just start the Collector with global -tracing enabled:

                          et_viewer:start([{trace_global, true}, {trace_pattern, {et,max}}]).

                    This will start a Collector, a Viewer and also start the tracing of +tracing enabled:

                          et_viewer:start([{trace_global, true}, {trace_pattern, {et,max}}]).

                    This will start a Collector, a Viewer and also start the tracing of et:trace_me/5 function calls. The Raw Trace Data is collected by the Collector and a view of it is displayed on the screen by the Viewer. You can define your own "views" of the data by implementing your own Filter functions @@ -255,36 +255,36 @@ all you have to do is enable them.

                    For those people who want to do general tracing, consult the dbg module on how to trace whatever you're interested in and let it work its magic. If you just want et:trace_me/5 to work, do the following:

                    1. Create a Collector
                    2. Create a Viewer (this can do step #1 for you)
                    3. Turn on and pare down debugging

                    The module et/examples/et_trace_demo.erl achieves this.

                    
                    --module(et_trace_demo).
                    +-module(et_trace_demo).
                     
                    --export([test/0]).
                    +-export([test/0]).
                     
                    -test() ->
                    -    et_viewer:start([
                    -        {title,"Coffee Order"},
                    -        {trace_global,true},
                    -        {trace_pattern,{et,max}},
                    -        {max_actors,10}
                    -      ]),
                    +test() ->
                    +    et_viewer:start([
                    +        {title,"Coffee Order"},
                    +        {trace_global,true},
                    +        {trace_pattern,{et,max}},
                    +        {max_actors,10}
                    +      ]),
                           %% dbg:p(all,call),
                           %% dbg:tpl(et, trace_me, 5, []),
                    -      Drink = {drink,iced_chai_latte},
                    -      Size = {size,grande},
                    -      Milk = {milk,whole},
                    -      Flavor = {flavor,vanilla},
                    -      et:trace_me(99,customer,barrista1,place_order,[Drink,Size,Milk,Flavor]),
                    -      et:trace_me(80,barrista1,register,enter_order,[Drink,Size,Flavor]),
                    -      et:trace_me(80,register,barrista1,give_total,"$5"),
                    -      et:trace_me(80,barrista1,barrista1,get_cup,[Drink,Size]),
                    -      et:trace_me(80,barrista1,barrista2,give_cup,[]),
                    -      et:trace_me(90,barrista1,customer,request_money,"$5"),
                    -      et:trace_me(90,customer,barrista1,pay_money,"$5"),
                    -      et:trace_me(80,barrista2,barrista2,get_chai_mix,[]),
                    -      et:trace_me(80,barrista2,barrista2,add_flavor,[Flavor]),
                    -      et:trace_me(80,barrista2,barrista2,add_milk,[Milk]),
                    -      et:trace_me(80,barrista2,barrista2,add_ice,[]),
                    -      et:trace_me(80,barrista2,barrista2,swirl,[]),
                    -      et:trace_me(80,barrista2,customer,give_tasty_beverage,[Drink,Size]),
                    +      Drink = {drink,iced_chai_latte},
                    +      Size = {size,grande},
                    +      Milk = {milk,whole},
                    +      Flavor = {flavor,vanilla},
                    +      et:trace_me(99,customer,barrista1,place_order,[Drink,Size,Milk,Flavor]),
                    +      et:trace_me(80,barrista1,register,enter_order,[Drink,Size,Flavor]),
                    +      et:trace_me(80,register,barrista1,give_total,"$5"),
                    +      et:trace_me(80,barrista1,barrista1,get_cup,[Drink,Size]),
                    +      et:trace_me(80,barrista1,barrista2,give_cup,[]),
                    +      et:trace_me(90,barrista1,customer,request_money,"$5"),
                    +      et:trace_me(90,customer,barrista1,pay_money,"$5"),
                    +      et:trace_me(80,barrista2,barrista2,get_chai_mix,[]),
                    +      et:trace_me(80,barrista2,barrista2,add_flavor,[Flavor]),
                    +      et:trace_me(80,barrista2,barrista2,add_milk,[Milk]),
                    +      et:trace_me(80,barrista2,barrista2,add_ice,[]),
                    +      et:trace_me(80,barrista2,barrista2,swirl,[]),
                    +      et:trace_me(80,barrista2,customer,give_tasty_beverage,[Drink,Size]),
                           ok.

                    Running through the above, the most important points are:

                    • Turn on global tracing
                    • Set a Trace Pattern
                    • Tell dbg to trace function Calls
                    • Tell it specifically to trace the et:trace_me/5 function

                    When you run the et_trace_demo:test() function above, the Viewer window will look like this screenshot:

                    Screenshot of the Viewer window

                    @@ -337,7 +337,7 @@ Erlang programming language

                    -

                    Copyright © 1996-2025 Ericsson AB

                    +

                    Copyright © 1996-2041 Ericsson AB

                    /usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_viewer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_viewer.html 2025-02-26 17:28:24.769656925 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/et_viewer.html 2025-02-26 17:28:24.769656925 +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/et-1.7.1/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/notes.html 2025-02-26 17:28:24.789657108 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/notes.html 2025-02-26 17:28:24.789657108 +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/et-1.7.1/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/search.html 2025-02-26 17:28:24.805657254 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.1/doc/html/search.html 2025-02-26 17:28:24.805657254 +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/eunit-2.9.1/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/404.html 2025-02-26 17:28:24.817657365 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/404.html 2025-02-26 17:28:24.817657365 +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/eunit-2.9.1/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/api-reference.html 2025-02-26 17:28:24.833657510 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/api-reference.html 2025-02-26 17:28:24.833657510 +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/eunit-2.9.1/doc/html/chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/chapter.html 2025-02-26 17:28:24.857657730 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/chapter.html 2025-02-26 17:28:24.857657730 +0000 @@ -794,7 +794,7 @@ Erlang programming language

                    -

                    Copyright © 1996-2025 Ericsson AB

                    +

                    Copyright © 1996-2041 Ericsson AB

                    /usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/eunit.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/eunit.epub/OEBPS/content.opf 2025-02-26 17:28:24.877657913 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/eunit.epub/OEBPS/content.opf 2025-02-26 17:28:24.881657949 +0000 @@ -4,10 +4,10 @@ version="3.0"> eunit - 2.9.1 - urn:uuid:a0f91419-143e-496a-3a0c-8447aaf54a9d + urn:uuid:354c9e73-618a-6b2e-770c-1dcec0f01467 en - 2025-02-26T17:22:42Z + 2041-03-31T06:42:03Z /usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/eunit.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/eunit.html 2025-02-26 17:28:24.913658243 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/eunit.html 2025-02-26 17:28:24.913658243 +0000 @@ -350,7 +350,7 @@ Erlang programming language

                    -

                    Copyright © 1996-2025 Ericsson AB

                    +

                    Copyright © 1996-2041 Ericsson AB

                    /usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/eunit_surefire.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/eunit_surefire.html 2025-02-26 17:28:24.929658389 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/eunit_surefire.html 2025-02-26 17:28:24.929658389 +0000 @@ -158,7 +158,7 @@ Erlang programming language

                    -

                    Copyright © 1996-2025 Ericsson AB

                    +

                    Copyright © 1996-2041 Ericsson AB

                    /usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/notes.html 2025-02-26 17:28:24.953658608 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/notes.html 2025-02-26 17:28:24.953658608 +0000 @@ -773,7 +773,7 @@ Erlang programming language

                    -

                    Copyright © 1996-2025 Ericsson AB

                    +

                    Copyright © 1996-2041 Ericsson AB

                    /usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/search.html 2025-02-26 17:28:24.965658718 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eunit-2.9.1/doc/html/search.html 2025-02-26 17:28:24.965658718 +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/ftp-1.2.3/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/404.html 2025-02-26 17:28:24.981658864 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/404.html 2025-02-26 17:28:24.981658864 +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/ftp-1.2.3/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/api-reference.html 2025-02-26 17:28:24.997659011 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/api-reference.html 2025-02-26 17:28:24.997659011 +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/ftp-1.2.3/doc/html/ftp.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/ftp.epub/OEBPS/content.opf 2025-02-26 17:28:25.017659193 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/ftp.epub/OEBPS/content.opf 2025-02-26 17:28:25.017659193 +0000 @@ -4,10 +4,10 @@ version="3.0"> ftp - 1.2.3 - urn:uuid:3de559ae-3748-0474-4b8f-0fca498ce097 + urn:uuid:cc670885-2a03-ce47-2cd6-4a45b1f09fc3 en - 2025-02-26T17:22:48Z + 2041-03-31T06:42:09Z /usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/ftp.epub/OEBPS/ftp_client.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/ftp.epub/OEBPS/ftp_client.xhtml 2025-02-26 17:28:25.017659193 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/ftp.epub/OEBPS/ftp_client.xhtml 2025-02-26 17:28:25.017659193 +0000 @@ -21,25 +21,25 @@ Examples

                    The following is a simple example of an FTP session, where the user guest with -password password logs on to the remote host erlang.org:

                          1> ftp:start().
                    +password password logs on to the remote host erlang.org:

                          1> ftp:start().
                           ok
                    -      2> {ok, Pid} = ftp:open([{host, "erlang.org"}]).
                    -      {ok,<0.22.0>}
                    -      3> ftp:user(Pid, "guest", "password").
                    +      2> {ok, Pid} = ftp:open([{host, "erlang.org"}]).
                    +      {ok,<0.22.0>}
                    +      3> ftp:user(Pid, "guest", "password").
                           ok
                    -      4> ftp:pwd(Pid).
                    -      {ok, "/home/guest"}
                    -      5> ftp:cd(Pid, "appl/examples").
                    +      4> ftp:pwd(Pid).
                    +      {ok, "/home/guest"}
                    +      5> ftp:cd(Pid, "appl/examples").
                           ok
                    -      6> ftp:lpwd(Pid).
                    -      {ok, "/home/fred"}.
                    -      7> ftp:lcd(Pid, "/home/eproj/examples").
                    +      6> ftp:lpwd(Pid).
                    +      {ok, "/home/fred"}.
                    +      7> ftp:lcd(Pid, "/home/eproj/examples").
                           ok
                    -      8> ftp:recv(Pid, "appl.erl").
                    +      8> ftp:recv(Pid, "appl.erl").
                           ok
                    -      9> ftp:close(Pid).
                    +      9> ftp:close(Pid).
                           ok
                    -      10> ftp:stop().
                    +      10> ftp:stop().
                           ok

                    The file appl.erl is transferred from the remote to the local host. When the session is opened, the current directory at the remote host is /home/guest, and /home/fred at the local host. Before transferring the file, the current /usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/ftp.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/ftp.html 2025-02-26 17:28:25.073659706 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/ftp.html 2025-02-26 17:28:25.073659706 +0000 @@ -1922,7 +1922,7 @@ Erlang programming language

                    -

                    Copyright © 1996-2025 Ericsson AB

                    +

                    Copyright © 1996-2041 Ericsson AB

                    /usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/ftp_client.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/ftp_client.html 2025-02-26 17:28:25.093659889 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/ftp_client.html 2025-02-26 17:28:25.093659889 +0000 @@ -126,25 +126,25 @@

                    The following is a simple example of an FTP session, where the user guest with -password password logs on to the remote host erlang.org:

                          1> ftp:start().
                    +password password logs on to the remote host erlang.org:

                          1> ftp:start().
                           ok
                    -      2> {ok, Pid} = ftp:open([{host, "erlang.org"}]).
                    -      {ok,<0.22.0>}
                    -      3> ftp:user(Pid, "guest", "password").
                    +      2> {ok, Pid} = ftp:open([{host, "erlang.org"}]).
                    +      {ok,<0.22.0>}
                    +      3> ftp:user(Pid, "guest", "password").
                           ok
                    -      4> ftp:pwd(Pid).
                    -      {ok, "/home/guest"}
                    -      5> ftp:cd(Pid, "appl/examples").
                    +      4> ftp:pwd(Pid).
                    +      {ok, "/home/guest"}
                    +      5> ftp:cd(Pid, "appl/examples").
                           ok
                    -      6> ftp:lpwd(Pid).
                    -      {ok, "/home/fred"}.
                    -      7> ftp:lcd(Pid, "/home/eproj/examples").
                    +      6> ftp:lpwd(Pid).
                    +      {ok, "/home/fred"}.
                    +      7> ftp:lcd(Pid, "/home/eproj/examples").
                           ok
                    -      8> ftp:recv(Pid, "appl.erl").
                    +      8> ftp:recv(Pid, "appl.erl").
                           ok
                    -      9> ftp:close(Pid).
                    +      9> ftp:close(Pid).
                           ok
                    -      10> ftp:stop().
                    +      10> ftp:stop().
                           ok

                    The file appl.erl is transferred from the remote to the local host. When the session is opened, the current directory at the remote host is /home/guest, and /home/fred at the local host. Before transferring the file, the current @@ -191,7 +191,7 @@ Erlang programming language

                    -

                    Copyright © 1996-2025 Ericsson AB

                    +

                    Copyright © 1996-2041 Ericsson AB

                    /usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/introduction.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/introduction.html 2025-02-26 17:28:25.105659999 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/introduction.html 2025-02-26 17:28:25.105659999 +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/ftp-1.2.3/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/notes.html 2025-02-26 17:28:25.125660181 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/notes.html 2025-02-26 17:28:25.125660181 +0000 @@ -456,7 +456,7 @@ Erlang programming language

                    -

                    Copyright © 1996-2025 Ericsson AB

                    +

                    Copyright © 1996-2041 Ericsson AB

                    /usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/search.html 2025-02-26 17:28:25.141660328 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.3/doc/html/search.html 2025-02-26 17:28:25.141660328 +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/inets-9.3.1/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/404.html 2025-02-26 17:28:25.153660437 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/404.html 2025-02-26 17:28:25.153660437 +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/inets-9.3.1/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/api-reference.html 2025-02-26 17:28:25.173660621 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/api-reference.html 2025-02-26 17:28:25.173660621 +0000 @@ -277,7 +277,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/inets-9.3.1/doc/html/dist/search_data-5E285FD6.js Missing in old package: /usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/dist/search_data-5E285FD6.js /usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/http_client.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/http_client.html 2025-02-26 17:28:25.193660804 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/http_client.html 2025-02-26 17:28:25.193660804 +0000 @@ -138,32 +138,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
                    @@ -215,7 +215,7 @@ Erlang programming language

                    -

                    Copyright © 1996-2025 Ericsson AB

                    +

                    Copyright © 1996-2041 Ericsson AB

                    /usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/http_server.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/http_server.html 2025-02-26 17:28:25.221661060 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/http_server.html 2025-02-26 17:28:25.221661060 +0000 @@ -141,20 +141,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.

                @@ -1615,7 +1615,7 @@ Erlang programming language

                -

                Copyright © 1996-2025 Ericsson AB

                +

                Copyright © 1996-2041 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/httpd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/httpd.html 2025-02-26 17:28:25.317661938 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/httpd.html 2025-02-26 17:28:25.317661938 +0000 @@ -236,36 +236,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 @@ -275,7 +275,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.

          @@ -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.1/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.1/doc/html/httpd_custom_api.html 2025-02-26 17:28:25.337662121 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/httpd_custom_api.html 2025-02-26 17:28:25.337662121 +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.1/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.1/doc/html/httpd_socket.html 2025-02-26 17:28:25.357662304 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/httpd_socket.html 2025-02-26 17:28:25.357662304 +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.1/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.1/doc/html/httpd_util.html 2025-02-26 17:28:25.381662523 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/httpd_util.html 2025-02-26 17:28:25.381662523 +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.1/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.1/doc/html/inets.epub/OEBPS/content.opf 2025-02-26 17:28:25.405662743 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/inets.epub/OEBPS/content.opf 2025-02-26 17:28:25.409662779 +0000 @@ -4,10 +4,10 @@ version="3.0"> inets - 9.3.1 - urn:uuid:43f01987-c9ef-0cee-1926-6f5178d48785 + urn:uuid:1af4c675-c943-d334-3245-b62a2fba0838 en - 2025-02-26T17:21:35Z + 2041-03-31T06:41:02Z /usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/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.1/doc/html/inets.epub/OEBPS/http_client.xhtml 2025-02-26 17:28:25.405662743 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/inets.epub/OEBPS/http_client.xhtml 2025-02-26 17:28:25.409662779 +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.1/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.1/doc/html/inets.epub/OEBPS/http_server.xhtml 2025-02-26 17:28:25.405662743 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/inets.epub/OEBPS/http_server.xhtml 2025-02-26 17:28:25.409662779 +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.1/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.1/doc/html/inets.epub/OEBPS/httpd.xhtml 2025-02-26 17:28:25.405662743 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.3.1/doc/html/inets.epub/OEBPS/httpd.xhtml 2025-02-26 17:28:25.409662779 +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 @@

  • {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.1/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.1/doc/html/kernel.epub/OEBPS/gen_tcp.xhtml	2025-02-26 17:28:26.549673208 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/kernel.epub/OEBPS/gen_tcp.xhtml	2025-02-26 17:28:26.569673391 +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.1/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.1/doc/html/kernel.epub/OEBPS/gen_udp.xhtml 2025-02-26 17:28:26.549673208 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/kernel.epub/OEBPS/gen_udp.xhtml 2025-02-26 17:28:26.569673391 +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.1/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.1/doc/html/kernel.epub/OEBPS/global_group.xhtml 2025-02-26 17:28:26.549673208 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/kernel.epub/OEBPS/global_group.xhtml 2025-02-26 17:28:26.569673391 +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.1/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.1/doc/html/kernel.epub/OEBPS/inet.xhtml 2025-02-26 17:28:26.549673208 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/kernel.epub/OEBPS/inet.xhtml 2025-02-26 17:28:26.569673391 +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.1/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.1/doc/html/kernel.epub/OEBPS/inet_res.xhtml 2025-02-26 17:28:26.549673208 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/kernel.epub/OEBPS/inet_res.xhtml 2025-02-26 17:28:26.569673391 +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.1/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.1/doc/html/kernel.epub/OEBPS/logger.xhtml 2025-02-26 17:28:26.549673208 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/kernel.epub/OEBPS/logger.xhtml 2025-02-26 17:28:26.565673355 +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.1/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.1/doc/html/kernel.epub/OEBPS/logger_chapter.xhtml 2025-02-26 17:28:26.545673171 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/kernel.epub/OEBPS/logger_chapter.xhtml 2025-02-26 17:28:26.565673355 +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.1/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.1/doc/html/kernel.epub/OEBPS/logger_cookbook.xhtml	2025-02-26 17:28:26.545673171 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/kernel.epub/OEBPS/logger_cookbook.xhtml	2025-02-26 17:28:26.565673355 +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-02-26 17:28:30.629710531 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/msacc.html 2025-02-26 17:28:30.629710531 +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-02-26 17:28:30.661710824 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/notes.html 2025-02-26 17:28:30.661710824 +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-02-26 17:28:30.685711043 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub/OEBPS/content.opf 2025-02-26 17:28:30.689711080 +0000 @@ -4,10 +4,10 @@ version="3.0"> runtime_tools - 2.1.1 - urn:uuid:e41b65b0-0ae6-f9f0-c12e-7b4f4841f637 + urn:uuid:ea1e817d-30ab-df1d-b723-f58fbc0889ef en - 2025-02-26T17:21:32Z + 2041-03-31T06:40:59Z /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-02-26 17:28:30.685711043 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub/OEBPS/dbg.xhtml 2025-02-26 17:28:30.689711080 +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-02-26 17:28:30.681711007 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub/OEBPS/dyntrace.xhtml	2025-02-26 17:28:30.685711043 +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-02-26 17:28:30.681711007 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub/OEBPS/instrument.xhtml 2025-02-26 17:28:30.685711043 +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-02-26 17:28:30.681711007 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub/OEBPS/lttng.xhtml 2025-02-26 17:28:30.685711043 +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-02-26 17:28:30.681711007 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub/OEBPS/msacc.xhtml	2025-02-26 17:28:30.685711043 +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-02-26 17:28:30.681711007 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools.epub/OEBPS/scheduler.xhtml 2025-02-26 17:28:30.685711043 +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-02-26 17:28:30.785711958 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/runtime_tools_app.html 2025-02-26 17:28:30.785711958 +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-02-26 17:28:30.805712142 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/scheduler.html 2025-02-26 17:28:30.805712142 +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-02-26 17:28:30.821712287 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/search.html 2025-02-26 17:28:30.821712287 +0000 @@ -122,7 +122,7 @@
      - + /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-02-26 17:28:30.837712434 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/system_information.html 2025-02-26 17:28:30.837712434 +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-02-26 17:28:30.853712580 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/systemtap.html 2025-02-26 17:28:30.853712580 +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-02-26 17:28:30.869712727 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/404.html 2025-02-26 17:28:30.869712727 +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-02-26 17:28:30.885712874 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/alarm_handler.html 2025-02-26 17:28:30.885712874 +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-02-26 17:28:30.901713020 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/api-reference.html 2025-02-26 17:28:30.901713020 +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-02-26 17:28:30.925713239 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/appup.html 2025-02-26 17:28:30.925713239 +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-D2253CE5.js Missing in old package: /usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/dist/search_data-D2253CE5.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-02-26 17:28:30.949713459 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/error_logging.html 2025-02-26 17:28:30.949713459 +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-02-26 17:28:30.973713678 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/notes.html 2025-02-26 17:28:30.973713678 +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-02-26 17:28:30.997713898 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/rb.html 2025-02-26 17:28:30.997713898 +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-02-26 17:28:31.017714081 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/rel.html 2025-02-26 17:28:31.017714081 +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-02-26 17:28:31.045714337 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/release_handler.html 2025-02-26 17:28:31.045714337 +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-02-26 17:28:31.061714483 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/relup.html 2025-02-26 17:28:31.061714483 +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-02-26 17:28:31.085714702 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub/OEBPS/appup.xhtml 2025-02-26 17:28:31.089714739 +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-02-26 17:28:31.085714702 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub/OEBPS/content.opf 2025-02-26 17:28:31.085714702 +0000 @@ -4,10 +4,10 @@ version="3.0"> sasl - 4.2.2 - urn:uuid:54bc870e-91ab-f86f-75d7-ce9d51c93916 + urn:uuid:84148d77-bf3a-2faa-081f-19cb28df35e8 en - 2025-02-26T17:21:12Z + 2041-03-31T06:40:37Z /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-02-26 17:28:31.085714702 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub/OEBPS/error_logging.xhtml 2025-02-26 17:28:31.085714702 +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-02-26 17:28:31.081714667 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub/OEBPS/rel.xhtml	2025-02-26 17:28:31.085714702 +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-02-26 17:28:31.081714667 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub/OEBPS/release_handler.xhtml 2025-02-26 17:28:31.085714702 +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-02-26 17:28:31.081714667 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub/OEBPS/relup.xhtml 2025-02-26 17:28:31.085714702 +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-02-26 17:28:31.081714667 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl.epub/OEBPS/script.xhtml 2025-02-26 17:28:31.085714702 +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-02-26 17:28:31.181715581 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl_app.html 2025-02-26 17:28:31.181715581 +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-02-26 17:28:31.197715727 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/sasl_intro.html 2025-02-26 17:28:31.197715727 +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-02-26 17:28:31.213715874 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/script.html 2025-02-26 17:28:31.213715874 +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-02-26 17:28:31.229716020 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/search.html 2025-02-26 17:28:31.229716020 +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-02-26 17:28:31.249716204 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.2.2/doc/html/systools.html 2025-02-26 17:28:31.249716204 +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/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/404.html 2025-02-26 17:28:31.265716349 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/404.html 2025-02-26 17:28:31.265716349 +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/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/api-reference.html 2025-02-26 17:28:31.285716532 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/api-reference.html 2025-02-26 17:28:31.285716532 +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/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/doc/html/notes.html 2025-02-26 17:28:31.309716752 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/notes.html 2025-02-26 17:28:31.309716752 +0000 @@ -1106,7 +1106,7 @@ Erlang programming language

              -

              Copyright © 1996-2025 Ericsson AB

              +

              Copyright © 1996-2041 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/search.html 2025-02-26 17:28:31.325716898 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/search.html 2025-02-26 17:28:31.325716898 +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/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/doc/html/snmp.epub/OEBPS/content.opf 2025-02-26 17:28:31.353717154 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp.epub/OEBPS/content.opf 2025-02-26 17:28:31.365717264 +0000 @@ -4,10 +4,10 @@ version="3.0"> snmp - 5.18 - urn:uuid:e6fa9fa4-9919-d392-3067-bbdda9d8d4b3 + urn:uuid:724baf7b-e5af-9a06-6daa-0d116bf1aaee en - 2025-02-26T17:21:52Z + 2041-03-31T06:41:19Z /usr/share/doc/packages/erlang-doc/lib/snmp-5.18/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/doc/html/snmp.epub/OEBPS/snmp.xhtml 2025-02-26 17:28:31.353717154 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp.epub/OEBPS/snmp.xhtml 2025-02-26 17:28:31.365717264 +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/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/doc/html/snmp.epub/OEBPS/snmp_advanced_agent.xhtml 2025-02-26 17:28:31.353717154 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp.epub/OEBPS/snmp_advanced_agent.xhtml 2025-02-26 17:28:31.365717264 +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/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/doc/html/snmp.epub/OEBPS/snmp_agent_config_files.xhtml 2025-02-26 17:28:31.353717154 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp.epub/OEBPS/snmp_agent_config_files.xhtml 2025-02-26 17:28:31.365717264 +0000 @@ -45,19 +45,19 @@

    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}.

    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 +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}.

    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 @@ -83,12 +83,12 @@ 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}.

    A value must be provided for all variables, which lack default values in the +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}.

    A value must be provided for all variables, which lack default values in the MIB.

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18/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/doc/html/snmp.epub/OEBPS/snmp_agent_funct_descr.xhtml 2025-02-26 17:28:31.353717154 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp.epub/OEBPS/snmp_agent_funct_descr.xhtml 2025-02-26 17:28:31.365717264 +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/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/doc/html/snmp.epub/OEBPS/snmp_app.xhtml 2025-02-26 17:28:31.353717154 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp.epub/OEBPS/snmp_app.xhtml 2025-02-26 17:28:31.365717264 +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/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/doc/html/snmp.epub/OEBPS/snmp_app_b.xhtml 2025-02-26 17:28:31.353717154 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp.epub/OEBPS/snmp_app_b.xhtml 2025-02-26 17:28:31.361717228 +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/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/doc/html/snmp.epub/OEBPS/snmp_config.xhtml 2025-02-26 17:28:31.353717154 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp.epub/OEBPS/snmp_config.xhtml 2025-02-26 17:28:31.361717228 +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/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/doc/html/snmp.epub/OEBPS/snmp_generic.xhtml 2025-02-26 17:28:31.353717154 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp.epub/OEBPS/snmp_generic.xhtml 2025-02-26 17:28:31.361717228 +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/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/doc/html/snmp.epub/OEBPS/snmp_impl_example_agent.xhtml 2025-02-26 17:28:31.349717118 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp.epub/OEBPS/snmp_impl_example_agent.xhtml 2025-02-26 17:28:31.361717228 +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/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/doc/html/snmp.epub/OEBPS/snmp_index.xhtml	2025-02-26 17:28:31.349717118 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp.epub/OEBPS/snmp_index.xhtml	2025-02-26 17:28:31.361717228 +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/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/doc/html/snmp.epub/OEBPS/snmp_instr_functions.xhtml 2025-02-26 17:28:31.349717118 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp.epub/OEBPS/snmp_instr_functions.xhtml 2025-02-26 17:28:31.361717228 +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/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/doc/html/snmp.epub/OEBPS/snmp_manager_config_files.xhtml 2025-02-26 17:28:31.349717118 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp.epub/OEBPS/snmp_manager_config_files.xhtml 2025-02-26 17:28:31.361717228 +0000 @@ -44,10 +44,10 @@ 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.

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18/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/doc/html/snmp.epub/OEBPS/snmp_mib_compiler.xhtml 2025-02-26 17:28:31.349717118 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp.epub/OEBPS/snmp_mib_compiler.xhtml 2025-02-26 17:28:31.361717228 +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/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/doc/html/snmp.epub/OEBPS/snmp_pdus.xhtml 2025-02-26 17:28:31.349717118 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp.epub/OEBPS/snmp_pdus.xhtml 2025-02-26 17:28:31.361717228 +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/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/doc/html/snmp.epub/OEBPS/snmpa.xhtml 2025-02-26 17:28:31.349717118 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp.epub/OEBPS/snmpa.xhtml 2025-02-26 17:28:31.361717228 +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/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/doc/html/snmp.epub/OEBPS/snmpc_cmd.xhtml 2025-02-26 17:28:31.345717082 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp.epub/OEBPS/snmpc_cmd.xhtml 2025-02-26 17:28:31.357717191 +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/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/doc/html/snmp.epub/OEBPS/snmpm.xhtml 2025-02-26 17:28:31.345717082 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp.epub/OEBPS/snmpm.xhtml 2025-02-26 17:28:31.357717191 +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/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/doc/html/snmp.html 2025-02-26 17:28:31.641719789 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp.html 2025-02-26 17:28:31.641719789 +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/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/doc/html/snmp_advanced_agent.html 2025-02-26 17:28:31.665720009 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_advanced_agent.html 2025-02-26 17:28:31.665720009 +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/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/doc/html/snmp_agent_config_files.html 2025-02-26 17:28:31.685720191 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_agent_config_files.html 2025-02-26 17:28:31.685720191 +0000 @@ -150,19 +150,19 @@

    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}.

    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 +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}.

    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 @@ -188,12 +188,12 @@ 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}.

    A value must be provided for all variables, which lack default values in the +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}.

    A value must be provided for all variables, which lack default values in the MIB.

    @@ -311,7 +311,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18/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/doc/html/snmp_agent_funct_descr.html 2025-02-26 17:28:31.705720375 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_agent_funct_descr.html 2025-02-26 17:28:31.705720375 +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/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/doc/html/snmp_agent_netif.html 2025-02-26 17:28:31.725720557 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_agent_netif.html 2025-02-26 17:28:31.725720557 +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/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/doc/html/snmp_app.html 2025-02-26 17:28:31.749720777 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_app.html 2025-02-26 17:28:31.749720777 +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/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/doc/html/snmp_app_a.html 2025-02-26 17:28:31.769720960 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_app_a.html 2025-02-26 17:28:31.769720960 +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/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/doc/html/snmp_app_b.html 2025-02-26 17:28:31.785721106 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_app_b.html 2025-02-26 17:28:31.785721106 +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/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/doc/html/snmp_app_c.html 2025-02-26 17:28:31.801721253 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_app_c.html 2025-02-26 17:28:31.801721253 +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/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/doc/html/snmp_audit_trail_log.html 2025-02-26 17:28:31.817721399 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_audit_trail_log.html 2025-02-26 17:28:31.817721399 +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/doc/html/snmp_community_mib.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_community_mib.html 2025-02-26 17:28:31.837721582 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_community_mib.html 2025-02-26 17:28:31.837721582 +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/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/doc/html/snmp_config.html 2025-02-26 17:28:31.865721838 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_config.html 2025-02-26 17:28:31.865721838 +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/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/doc/html/snmp_def_instr_functions.html 2025-02-26 17:28:31.885722021 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_def_instr_functions.html 2025-02-26 17:28:31.885722021 +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/doc/html/snmp_framework_mib.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_framework_mib.html 2025-02-26 17:28:31.905722204 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_framework_mib.html 2025-02-26 17:28:31.905722204 +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/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/doc/html/snmp_generic.html 2025-02-26 17:28:31.929722424 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_generic.html 2025-02-26 17:28:31.929722424 +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/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/doc/html/snmp_impl_example_agent.html 2025-02-26 17:28:31.957722680 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_impl_example_agent.html 2025-02-26 17:28:31.957722680 +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/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/doc/html/snmp_impl_example_manager.html	2025-02-26 17:28:31.973722826 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_impl_example_manager.html	2025-02-26 17:28:31.973722826 +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/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/doc/html/snmp_index.html 2025-02-26 17:28:31.993723009 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_index.html 2025-02-26 17:28:31.993723009 +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/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/doc/html/snmp_instr_functions.html 2025-02-26 17:28:32.013723192 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_instr_functions.html 2025-02-26 17:28:32.013723192 +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/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/doc/html/snmp_intro.html 2025-02-26 17:28:32.029723338 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_intro.html 2025-02-26 17:28:32.029723338 +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/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/doc/html/snmp_manager_config_files.html 2025-02-26 17:28:32.049723521 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_manager_config_files.html 2025-02-26 17:28:32.049723521 +0000 @@ -149,10 +149,10 @@ 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.

    @@ -247,7 +247,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.18/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/doc/html/snmp_manager_funct_descr.html 2025-02-26 17:28:32.065723668 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_manager_funct_descr.html 2025-02-26 17:28:32.065723668 +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/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/doc/html/snmp_manager_netif.html 2025-02-26 17:28:32.081723814 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_manager_netif.html 2025-02-26 17:28:32.081723814 +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/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/doc/html/snmp_mib_compiler.html 2025-02-26 17:28:32.097723961 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_mib_compiler.html 2025-02-26 17:28:32.097723961 +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/doc/html/snmp_notification_mib.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_notification_mib.html 2025-02-26 17:28:32.117724143 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_notification_mib.html 2025-02-26 17:28:32.117724143 +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/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/doc/html/snmp_pdus.html 2025-02-26 17:28:32.141724363 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_pdus.html 2025-02-26 17:28:32.141724363 +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/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/doc/html/snmp_standard_mib.html 2025-02-26 17:28:32.161724546 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_standard_mib.html 2025-02-26 17:28:32.161724546 +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/doc/html/snmp_target_mib.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_target_mib.html 2025-02-26 17:28:32.185724765 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_target_mib.html 2025-02-26 17:28:32.189724802 +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/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/doc/html/snmp_user_based_sm_mib.html 2025-02-26 17:28:32.209724985 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_user_based_sm_mib.html 2025-02-26 17:28:32.209724985 +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/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/doc/html/snmp_view_based_acm_mib.html 2025-02-26 17:28:32.237725241 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmp_view_based_acm_mib.html 2025-02-26 17:28:32.237725241 +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/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/doc/html/snmpa.html 2025-02-26 17:28:32.309725899 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa.html 2025-02-26 17:28:32.309725899 +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/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/doc/html/snmpa_conf.html 2025-02-26 17:28:32.361726376 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_conf.html 2025-02-26 17:28:32.361726376 +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/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/doc/html/snmpa_discovery_handler.html 2025-02-26 17:28:32.381726558 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_discovery_handler.html 2025-02-26 17:28:32.381726558 +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/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/doc/html/snmpa_error.html 2025-02-26 17:28:32.397726705 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_error.html 2025-02-26 17:28:32.397726705 +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/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/doc/html/snmpa_error_io.html 2025-02-26 17:28:32.413726851 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_error_io.html 2025-02-26 17:28:32.413726851 +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/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/doc/html/snmpa_error_logger.html 2025-02-26 17:28:32.429726998 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_error_logger.html 2025-02-26 17:28:32.429726998 +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/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/doc/html/snmpa_error_report.html 2025-02-26 17:28:32.445727143 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_error_report.html 2025-02-26 17:28:32.445727143 +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/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/doc/html/snmpa_local_db.html 2025-02-26 17:28:32.465727327 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_local_db.html 2025-02-26 17:28:32.465727327 +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/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/doc/html/snmpa_mib_data.html 2025-02-26 17:28:32.489727546 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_mib_data.html 2025-02-26 17:28:32.489727546 +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/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/doc/html/snmpa_mib_storage.html 2025-02-26 17:28:32.513727766 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_mib_storage.html 2025-02-26 17:28:32.513727766 +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/doc/html/snmpa_mpd.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_mpd.html 2025-02-26 17:28:32.533727949 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_mpd.html 2025-02-26 17:28:32.533727949 +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/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/doc/html/snmpa_network_interface.html 2025-02-26 17:28:32.553728132 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_network_interface.html 2025-02-26 17:28:32.553728132 +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/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/doc/html/snmpa_network_interface_filter.html 2025-02-26 17:28:32.573728314 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_network_interface_filter.html 2025-02-26 17:28:32.573728314 +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/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/doc/html/snmpa_notification_delivery_info_receiver.html 2025-02-26 17:28:32.589728461 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_notification_delivery_info_receiver.html 2025-02-26 17:28:32.589728461 +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/doc/html/snmpa_notification_filter.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_notification_filter.html 2025-02-26 17:28:32.605728607 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_notification_filter.html 2025-02-26 17:28:32.605728607 +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/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/doc/html/snmpa_supervisor.html 2025-02-26 17:28:32.625728791 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpa_supervisor.html 2025-02-26 17:28:32.625728791 +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/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/doc/html/snmpc.html 2025-02-26 17:28:32.645728973 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpc.html 2025-02-26 17:28:32.645728973 +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/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/doc/html/snmpc_cmd.html 2025-02-26 17:28:32.665729157 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpc_cmd.html 2025-02-26 17:28:32.665729157 +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/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/doc/html/snmpm.html 2025-02-26 17:28:32.721729669 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpm.html 2025-02-26 17:28:32.721729669 +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/doc/html/snmpm_conf.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpm_conf.html 2025-02-26 17:28:32.753729961 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpm_conf.html 2025-02-26 17:28:32.753729961 +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/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/doc/html/snmpm_mpd.html 2025-02-26 17:28:32.773730144 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpm_mpd.html 2025-02-26 17:28:32.773730144 +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/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/doc/html/snmpm_network_interface.html 2025-02-26 17:28:32.793730327 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpm_network_interface.html 2025-02-26 17:28:32.793730327 +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/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/doc/html/snmpm_network_interface_filter.html 2025-02-26 17:28:32.813730510 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpm_network_interface_filter.html 2025-02-26 17:28:32.813730510 +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/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/doc/html/snmpm_user.html 2025-02-26 17:28:32.833730694 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.18/doc/html/snmpm_user.html 2025-02-26 17:28:32.833730694 +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.6/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/404.html 2025-02-26 17:28:32.849730839 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/404.html 2025-02-26 17:28:32.849730839 +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.6/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/api-reference.html 2025-02-26 17:28:32.865730986 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/api-reference.html 2025-02-26 17:28:32.865730986 +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.6/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.6/doc/html/configurations.html 2025-02-26 17:28:32.885731169 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/configurations.html 2025-02-26 17:28:32.885731169 +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.6/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.6/doc/html/configure_algos.html 2025-02-26 17:28:32.913731425 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/configure_algos.html 2025-02-26 17:28:32.913731425 +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.6/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.6/doc/html/hardening.html	2025-02-26 17:28:32.933731608 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/hardening.html	2025-02-26 17:28:32.933731608 +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.6/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.6/doc/html/introduction.html 2025-02-26 17:28:32.953731791 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/introduction.html 2025-02-26 17:28:32.953731791 +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.6/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.6/doc/html/notes.html 2025-02-26 17:28:33.001732230 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/notes.html 2025-02-26 17:28:33.001732230 +0000 @@ -3317,7 +3317,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/search.html 2025-02-26 17:28:33.021732413 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/search.html 2025-02-26 17:28:33.021732413 +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.6/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.6/doc/html/ssh.epub/OEBPS/configurations.xhtml 2025-02-26 17:28:33.049732669 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh.epub/OEBPS/configurations.xhtml 2025-02-26 17:28:33.053732706 +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.6/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.6/doc/html/ssh.epub/OEBPS/configure_algos.xhtml 2025-02-26 17:28:33.045732632 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh.epub/OEBPS/configure_algos.xhtml 2025-02-26 17:28:33.053732706 +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.6/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.6/doc/html/ssh.epub/OEBPS/content.opf	2025-02-26 17:28:33.045732632 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh.epub/OEBPS/content.opf	2025-02-26 17:28:33.053732706 +0000
    @@ -4,10 +4,10 @@
              version="3.0">
       
         ssh - 5.2.6
    -    urn:uuid:479b0dcc-6390-4cd2-c3b2-02e2249b633c
    +    urn:uuid:a774aa33-087e-2bda-8ead-8c54f7094bc9
         en
     
    -    2025-02-26T17:22:45Z
    +    2041-03-31T06:42:06Z
     
       
       
    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/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.6/doc/html/ssh.epub/OEBPS/hardening.xhtml	2025-02-26 17:28:33.045732632 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh.epub/OEBPS/hardening.xhtml	2025-02-26 17:28:33.053732706 +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.6/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.6/doc/html/ssh.epub/OEBPS/ssh.xhtml 2025-02-26 17:28:33.045732632 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh.epub/OEBPS/ssh.xhtml 2025-02-26 17:28:33.053732706 +0000 @@ -3360,14 +3360,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 @@ -5195,21 +5195,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.6/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.6/doc/html/ssh.epub/OEBPS/ssh_agent.xhtml 2025-02-26 17:28:33.041732596 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh.epub/OEBPS/ssh_agent.xhtml 2025-02-26 17:28:33.053732706 +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.6/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.6/doc/html/ssh.epub/OEBPS/using_ssh.xhtml 2025-02-26 17:28:33.041732596 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh.epub/OEBPS/using_ssh.xhtml 2025-02-26 17:28:33.049732669 +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.6/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.6/doc/html/ssh.html	2025-02-26 17:28:33.209734133 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh.html	2025-02-26 17:28:33.213734169 +0000
    @@ -3486,14 +3486,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 @@ -5336,21 +5336,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"]
    @@ -5933,7 +5933,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/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.6/doc/html/ssh_agent.html 2025-02-26 17:28:33.237734389 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_agent.html 2025-02-26 17:28:33.237734389 +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.6/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.6/doc/html/ssh_app.html 2025-02-26 17:28:33.257734572 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_app.html 2025-02-26 17:28:33.261734609 +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.6/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.6/doc/html/ssh_client_channel.html 2025-02-26 17:28:33.285734828 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_client_channel.html 2025-02-26 17:28:33.285734828 +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.6/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.6/doc/html/ssh_client_key_api.html 2025-02-26 17:28:33.305735011 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_client_key_api.html 2025-02-26 17:28:33.305735011 +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.6/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.6/doc/html/ssh_connection.html 2025-02-26 17:28:33.337735303 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_connection.html 2025-02-26 17:28:33.337735303 +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.6/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.6/doc/html/ssh_file.html 2025-02-26 17:28:33.365735560 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_file.html 2025-02-26 17:28:33.365735560 +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.6/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.6/doc/html/ssh_server_channel.html 2025-02-26 17:28:33.385735743 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_server_channel.html 2025-02-26 17:28:33.385735743 +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.6/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.6/doc/html/ssh_server_key_api.html 2025-02-26 17:28:33.401735890 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_server_key_api.html 2025-02-26 17:28:33.401735890 +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.6/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.6/doc/html/ssh_sftp.html 2025-02-26 17:28:33.445736292 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_sftp.html 2025-02-26 17:28:33.445736292 +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.6/doc/html/ssh_sftpd.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_sftpd.html 2025-02-26 17:28:33.465736474 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/ssh_sftpd.html 2025-02-26 17:28:33.465736474 +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.6/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.6/doc/html/terminology.html 2025-02-26 17:28:33.481736621 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/terminology.html 2025-02-26 17:28:33.481736621 +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.6/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.6/doc/html/using_ssh.html 2025-02-26 17:28:33.513736914 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.2.6/doc/html/using_ssh.html 2025-02-26 17:28:33.513736914 +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.6/doc/html/404.html differs (HTML document, UTF-8 Unicode text)
    --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/404.html	2025-02-26 17:28:33.529737060 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/404.html	2025-02-26 17:28:33.529737060 +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.6/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/api-reference.html 2025-02-26 17:28:33.545737206 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/api-reference.html 2025-02-26 17:28:33.545737206 +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.6/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.6/doc/html/notes.html 2025-02-26 17:28:33.593737646 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/notes.html 2025-02-26 17:28:33.593737646 +0000 @@ -3459,7 +3459,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/search.html 2025-02-26 17:28:33.613737828 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/search.html 2025-02-26 17:28:33.613737828 +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.6/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.6/doc/html/ssl.epub/OEBPS/content.opf 2025-02-26 17:28:33.637738048 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/ssl.epub/OEBPS/content.opf 2025-02-26 17:28:33.641738084 +0000 @@ -4,10 +4,10 @@ version="3.0"> ssl - 11.2.6 - urn:uuid:1245845f-54d3-77b3-00ce-a150d70fb03f + urn:uuid:10a7301a-5133-1e1d-0d28-2a7dc860d306 en - 2025-02-26T17:22:33Z + 2041-03-31T06:41:55Z /usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/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.6/doc/html/ssl.epub/OEBPS/ssl.xhtml 2025-02-26 17:28:33.637738048 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/ssl.epub/OEBPS/ssl.xhtml 2025-02-26 17:28:33.641738084 +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.

    @@ -2414,26 +2414,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
    @@ -2518,8 +2518,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.

    @@ -2961,7 +2961,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 @@ -3105,7 +3105,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 @@ -3115,7 +3115,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 @@ -3523,20 +3523,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 @@ -3553,25 +3553,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 @@ -3721,11 +3721,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 @@ -4023,8 +4023,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).
      @@ -4155,7 +4155,7 @@ /usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/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.6/doc/html/ssl.epub/OEBPS/ssl_distribution.xhtml 2025-02-26 17:28:33.633738011 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/ssl.epub/OEBPS/ssl_distribution.xhtml 2025-02-26 17:28:33.641738084 +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.6/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.6/doc/html/ssl.epub/OEBPS/using_ssl.xhtml 2025-02-26 17:28:33.633738011 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/ssl.epub/OEBPS/using_ssl.xhtml 2025-02-26 17:28:33.637738048 +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.6/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.6/doc/html/ssl.html 2025-02-26 17:28:33.777739329 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/ssl.html 2025-02-26 17:28:33.777739329 +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.

    @@ -2535,26 +2535,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
    @@ -2644,8 +2644,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.

    @@ -3097,7 +3097,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 @@ -3241,7 +3241,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 @@ -3251,7 +3251,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 @@ -3669,20 +3669,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 @@ -3699,25 +3699,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 @@ -3867,11 +3867,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 @@ -4184,8 +4184,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).
      @@ -4321,7 +4321,7 @@ /usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/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.6/doc/html/ssl_app.html 2025-02-26 17:28:33.801739548 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/ssl_app.html 2025-02-26 17:28:33.801739548 +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.6/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.6/doc/html/ssl_crl_cache.html 2025-02-26 17:28:33.817739695 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/ssl_crl_cache.html 2025-02-26 17:28:33.817739695 +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.6/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.6/doc/html/ssl_crl_cache_api.html 2025-02-26 17:28:33.837739877 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/ssl_crl_cache_api.html 2025-02-26 17:28:33.837739877 +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.6/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.6/doc/html/ssl_distribution.html 2025-02-26 17:28:33.861740098 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/ssl_distribution.html 2025-02-26 17:28:33.861740098 +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.6/doc/html/ssl_protocol.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/ssl_protocol.html 2025-02-26 17:28:33.877740243 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/ssl_protocol.html 2025-02-26 17:28:33.877740243 +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.6/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.6/doc/html/ssl_session_cache_api.html 2025-02-26 17:28:33.897740426 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/ssl_session_cache_api.html 2025-02-26 17:28:33.897740426 +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.6/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.6/doc/html/standards_compliance.html 2025-02-26 17:28:33.925740683 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/standards_compliance.html 2025-02-26 17:28:33.925740683 +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.6/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.6/doc/html/using_ssl.html 2025-02-26 17:28:33.961741012 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.2.6/doc/html/using_ssl.html 2025-02-26 17:28:33.961741012 +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/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/404.html 2025-02-26 17:28:33.977741158 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/404.html 2025-02-26 17:28:33.981741195 +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/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/api-reference.html 2025-02-26 17:28:34.017741524 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/api-reference.html 2025-02-26 17:28:34.017741524 +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/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/doc/html/argparse.html 2025-02-26 17:28:34.049741817 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/argparse.html 2025-02-26 17:28:34.049741817 +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/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/doc/html/array.html 2025-02-26 17:28:34.085742146 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/array.html 2025-02-26 17:28:34.085742146 +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/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/doc/html/assert_hrl.html 2025-02-26 17:28:34.101742292 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/assert_hrl.html 2025-02-26 17:28:34.101742292 +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/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/doc/html/base64.html 2025-02-26 17:28:34.125742513 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/base64.html 2025-02-26 17:28:34.125742513 +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/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/doc/html/beam_lib.html 2025-02-26 17:28:34.161742841 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/beam_lib.html 2025-02-26 17:28:34.161742841 +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/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/doc/html/binary.html 2025-02-26 17:28:34.193743135 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/binary.html 2025-02-26 17:28:34.193743135 +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/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/doc/html/c.html	2025-02-26 17:28:34.229743463 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/c.html	2025-02-26 17:28:34.229743463 +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/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/doc/html/calendar.html 2025-02-26 17:28:34.265743793 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/calendar.html 2025-02-26 17:28:34.265743793 +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/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/doc/html/dets.html 2025-02-26 17:28:34.321744305 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/dets.html 2025-02-26 17:28:34.317744269 +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/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/doc/html/dict.html 2025-02-26 17:28:34.349744561 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/dict.html 2025-02-26 17:28:34.349744561 +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/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/doc/html/digraph.html 2025-02-26 17:28:34.381744854 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/digraph.html 2025-02-26 17:28:34.385744891 +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/doc/html/digraph_utils.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/digraph_utils.html 2025-02-26 17:28:34.409745110 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/digraph_utils.html 2025-02-26 17:28:34.409745110 +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/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/doc/html/edlin.html 2025-02-26 17:28:34.429745294 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/edlin.html 2025-02-26 17:28:34.429745294 +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/doc/html/edlin_expand.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/edlin_expand.html 2025-02-26 17:28:34.453745513 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/edlin_expand.html 2025-02-26 17:28:34.453745513 +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/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/doc/html/epp.html 2025-02-26 17:28:34.477745732 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/epp.html 2025-02-26 17:28:34.477745732 +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/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/doc/html/erl_anno.html 2025-02-26 17:28:34.505745988 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_anno.html 2025-02-26 17:28:34.505745988 +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/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/doc/html/erl_error.html 2025-02-26 17:28:34.525746171 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_error.html 2025-02-26 17:28:34.525746171 +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/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/doc/html/erl_eval.html 2025-02-26 17:28:34.553746428 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_eval.html 2025-02-26 17:28:34.553746428 +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/doc/html/erl_expand_records.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_expand_records.html 2025-02-26 17:28:34.569746574 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_expand_records.html 2025-02-26 17:28:34.569746574 +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/doc/html/erl_features.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_features.html 2025-02-26 17:28:34.589746757 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_features.html 2025-02-26 17:28:34.589746757 +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/doc/html/erl_id_trans.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_id_trans.html 2025-02-26 17:28:34.605746903 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_id_trans.html 2025-02-26 17:28:34.605746903 +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/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/doc/html/erl_internal.html 2025-02-26 17:28:34.625747087 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_internal.html 2025-02-26 17:28:34.625747087 +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/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/doc/html/erl_lint.html 2025-02-26 17:28:34.645747269 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_lint.html 2025-02-26 17:28:34.645747269 +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/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/doc/html/erl_parse.html 2025-02-26 17:28:34.701747781 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_parse.html 2025-02-26 17:28:34.701747781 +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/doc/html/erl_pp.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_pp.html 2025-02-26 17:28:34.729748037 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_pp.html 2025-02-26 17:28:34.729748037 +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/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/doc/html/erl_scan.html 2025-02-26 17:28:34.753748257 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_scan.html 2025-02-26 17:28:34.753748257 +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/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/doc/html/erl_tar.html 2025-02-26 17:28:34.785748550 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/erl_tar.html 2025-02-26 17:28:34.785748550 +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/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/doc/html/escript.html 2025-02-26 17:28:34.809748769 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/escript.html 2025-02-26 17:28:34.809748769 +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/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/doc/html/ets.html 2025-02-26 17:28:34.873749355 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/ets.html 2025-02-26 17:28:34.873749355 +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/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/doc/html/file_sorter.html	2025-02-26 17:28:34.909749684 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/file_sorter.html	2025-02-26 17:28:34.909749684 +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/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/doc/html/filelib.html 2025-02-26 17:28:34.933749903 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/filelib.html 2025-02-26 17:28:34.933749903 +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/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/doc/html/filename.html 2025-02-26 17:28:34.961750160 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/filename.html 2025-02-26 17:28:34.961750160 +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/doc/html/gb_sets.html differs (HTML document, UTF-8 Unicode text)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/gb_sets.html	2025-02-26 17:28:34.997750489 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/gb_sets.html	2025-02-26 17:28:34.997750489 +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/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/doc/html/gb_trees.html 2025-02-26 17:28:35.025750745 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/gb_trees.html 2025-02-26 17:28:35.025750745 +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/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/doc/html/gen_event.html 2025-02-26 17:28:35.069751148 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/gen_event.html 2025-02-26 17:28:35.069751148 +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/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/doc/html/gen_fsm.html 2025-02-26 17:28:35.117751587 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/gen_fsm.html 2025-02-26 17:28:35.117751587 +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/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/doc/html/gen_server.html	2025-02-26 17:28:35.169752062 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/gen_server.html	2025-02-26 17:28:35.165752026 +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/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/doc/html/gen_statem.html 2025-02-26 17:28:35.241752721 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/gen_statem.html 2025-02-26 17:28:35.241752721 +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/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/doc/html/introduction.html 2025-02-26 17:28:35.261752904 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/introduction.html 2025-02-26 17:28:35.261752904 +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/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/doc/html/io.html 2025-02-26 17:28:35.313753380 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/io.html 2025-02-26 17:28:35.313753380 +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/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/doc/html/io_lib.html	2025-02-26 17:28:35.353753746 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/io_lib.html	2025-02-26 17:28:35.353753746 +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/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/doc/html/io_protocol.html 2025-02-26 17:28:35.385754038 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/io_protocol.html 2025-02-26 17:28:35.385754038 +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/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/doc/html/json.html	2025-02-26 17:28:35.421754368 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/json.html	2025-02-26 17:28:35.421754368 +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/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/doc/html/lists.html 2025-02-26 17:28:35.477754880 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/lists.html 2025-02-26 17:28:35.477754880 +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/doc/html/log_mf_h.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/log_mf_h.html 2025-02-26 17:28:35.501755100 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/log_mf_h.html 2025-02-26 17:28:35.501755100 +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/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/doc/html/maps.html 2025-02-26 17:28:35.541755466 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/maps.html 2025-02-26 17:28:35.541755466 +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/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/doc/html/math.html 2025-02-26 17:28:35.569755722 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/math.html 2025-02-26 17:28:35.569755722 +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/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/doc/html/ms_transform.html 2025-02-26 17:28:35.597755978 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/ms_transform.html 2025-02-26 17:28:35.597755978 +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/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/doc/html/notes.html 2025-02-26 17:28:35.681756747 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/notes.html 2025-02-26 17:28:35.681756747 +0000 @@ -139,25 +139,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

      @@ -237,8 +237,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.
        @@ -271,12 +271,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

    @@ -4613,7 +4613,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-6.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/doc/html/orddict.html 2025-02-26 17:28:35.717757076 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/orddict.html 2025-02-26 17:28:35.717757076 +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/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/doc/html/ordsets.html 2025-02-26 17:28:35.745757332 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/ordsets.html 2025-02-26 17:28:35.745757332 +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/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/doc/html/peer.html 2025-02-26 17:28:35.773757588 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/peer.html 2025-02-26 17:28:35.773757588 +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/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/doc/html/pool.html 2025-02-26 17:28:35.797757807 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/pool.html 2025-02-26 17:28:35.797757807 +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/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/doc/html/proc_lib.html 2025-02-26 17:28:35.829758100 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/proc_lib.html 2025-02-26 17:28:35.833758137 +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/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/doc/html/proplists.html 2025-02-26 17:28:35.861758393 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/proplists.html 2025-02-26 17:28:35.861758393 +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/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/doc/html/qlc.html 2025-02-26 17:28:35.913758869 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/qlc.html 2025-02-26 17:28:35.913758869 +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="8863899277-44">}]).
    +    qlc:table(TF, [{info_fun, InfoFun}, {format_fun, FormatFun},
    +                   {lookup_fun, LookupFun},{key_equality,&#href_anchor"p" data-group-id="4742059033-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/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/doc/html/queue.html	2025-02-26 17:28:35.957759271 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/queue.html	2025-02-26 17:28:35.957759271 +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/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/doc/html/rand.html	2025-02-26 17:28:35.997759637 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/rand.html	2025-02-26 17:28:35.997759637 +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/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/doc/html/random.html 2025-02-26 17:28:36.017759820 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/random.html 2025-02-26 17:28:36.017759820 +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/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/doc/html/re.html 2025-02-26 17:28:36.073760332 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/re.html 2025-02-26 17:28:36.073760332 +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/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/search.html 2025-02-26 17:28:36.093760515 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/search.html 2025-02-26 17:28:36.093760515 +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/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/doc/html/sets.html 2025-02-26 17:28:36.117760735 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/sets.html 2025-02-26 17:28:36.117760735 +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/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/doc/html/shell.html 2025-02-26 17:28:36.149761027 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/shell.html 2025-02-26 17:28:36.149761027 +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/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/doc/html/shell_default.html	2025-02-26 17:28:36.165761174 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/shell_default.html	2025-02-26 17:28:36.165761174 +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/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/doc/html/shell_docs.html 2025-02-26 17:28:36.193761430 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/shell_docs.html 2025-02-26 17:28:36.193761430 +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/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/doc/html/slave.html 2025-02-26 17:28:36.213761613 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/slave.html 2025-02-26 17:28:36.213761613 +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/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/doc/html/sofs.html 2025-02-26 17:28:36.289762308 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/sofs.html 2025-02-26 17:28:36.289762308 +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/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/doc/html/stdlib.epub/OEBPS/argparse.xhtml 2025-02-26 17:28:36.349762858 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/argparse.xhtml 2025-02-26 17:28:36.389763223 +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/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/doc/html/stdlib.epub/OEBPS/array.xhtml 2025-02-26 17:28:36.349762858 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/array.xhtml 2025-02-26 17:28:36.389763223 +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/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/doc/html/stdlib.epub/OEBPS/assert_hrl.xhtml 2025-02-26 17:28:36.349762858 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/assert_hrl.xhtml 2025-02-26 17:28:36.389763223 +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/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/doc/html/stdlib.epub/OEBPS/base64.xhtml 2025-02-26 17:28:36.349762858 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/base64.xhtml 2025-02-26 17:28:36.389763223 +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/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/doc/html/stdlib.epub/OEBPS/beam_lib.xhtml 2025-02-26 17:28:36.349762858 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/beam_lib.xhtml 2025-02-26 17:28:36.389763223 +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/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/doc/html/stdlib.epub/OEBPS/binary.xhtml 2025-02-26 17:28:36.349762858 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/binary.xhtml 2025-02-26 17:28:36.389763223 +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/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/doc/html/stdlib.epub/OEBPS/c.xhtml	2025-02-26 17:28:36.349762858 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/c.xhtml	2025-02-26 17:28:36.385763186 +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/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/doc/html/stdlib.epub/OEBPS/calendar.xhtml 2025-02-26 17:28:36.349762858 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/calendar.xhtml 2025-02-26 17:28:36.385763186 +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/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/doc/html/stdlib.epub/OEBPS/content.opf 2025-02-26 17:28:36.349762858 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/content.opf 2025-02-26 17:28:36.385763186 +0000 @@ -4,10 +4,10 @@ version="3.0"> stdlib - 6.2 - urn:uuid:e55974d0-c8ec-e09e-f7c4-fa0e043fe58c + urn:uuid:fca4dcf7-cc5a-f409-f113-a67e5e738d87 en - 2025-02-26T17:21:10Z + 2041-03-31T06:40:35Z /usr/share/doc/packages/erlang-doc/lib/stdlib-6.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/doc/html/stdlib.epub/OEBPS/dets.xhtml 2025-02-26 17:28:36.349762858 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/dets.xhtml 2025-02-26 17:28:36.385763186 +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/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/doc/html/stdlib.epub/OEBPS/dict.xhtml 2025-02-26 17:28:36.349762858 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/dict.xhtml 2025-02-26 17:28:36.385763186 +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/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/doc/html/stdlib.epub/OEBPS/epp.xhtml 2025-02-26 17:28:36.345762820 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/epp.xhtml 2025-02-26 17:28:36.385763186 +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/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/doc/html/stdlib.epub/OEBPS/erl_error.xhtml 2025-02-26 17:28:36.345762820 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/erl_error.xhtml 2025-02-26 17:28:36.385763186 +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/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/doc/html/stdlib.epub/OEBPS/erl_eval.xhtml 2025-02-26 17:28:36.345762820 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/erl_eval.xhtml 2025-02-26 17:28:36.385763186 +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/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/doc/html/stdlib.epub/OEBPS/erl_lint.xhtml 2025-02-26 17:28:36.345762820 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/erl_lint.xhtml 2025-02-26 17:28:36.385763186 +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/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/doc/html/stdlib.epub/OEBPS/erl_parse.xhtml 2025-02-26 17:28:36.345762820 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/erl_parse.xhtml 2025-02-26 17:28:36.385763186 +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/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/doc/html/stdlib.epub/OEBPS/erl_scan.xhtml 2025-02-26 17:28:36.345762820 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/erl_scan.xhtml 2025-02-26 17:28:36.381763150 +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/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/doc/html/stdlib.epub/OEBPS/erl_tar.xhtml 2025-02-26 17:28:36.345762820 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/erl_tar.xhtml 2025-02-26 17:28:36.381763150 +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/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/doc/html/stdlib.epub/OEBPS/escript.xhtml 2025-02-26 17:28:36.345762820 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/escript.xhtml 2025-02-26 17:28:36.381763150 +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/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/doc/html/stdlib.epub/OEBPS/ets.xhtml 2025-02-26 17:28:36.345762820 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/ets.xhtml 2025-02-26 17:28:36.381763150 +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/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/doc/html/stdlib.epub/OEBPS/file_sorter.xhtml	2025-02-26 17:28:36.341762784 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/file_sorter.xhtml	2025-02-26 17:28:36.381763150 +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/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/doc/html/stdlib.epub/OEBPS/filelib.xhtml 2025-02-26 17:28:36.341762784 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/filelib.xhtml 2025-02-26 17:28:36.381763150 +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/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/doc/html/stdlib.epub/OEBPS/filename.xhtml 2025-02-26 17:28:36.341762784 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/filename.xhtml 2025-02-26 17:28:36.381763150 +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/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/doc/html/stdlib.epub/OEBPS/gen_event.xhtml	2025-02-26 17:28:36.341762784 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/gen_event.xhtml	2025-02-26 17:28:36.377763114 +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/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/doc/html/stdlib.epub/OEBPS/gen_fsm.xhtml 2025-02-26 17:28:36.341762784 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/gen_fsm.xhtml 2025-02-26 17:28:36.377763114 +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/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/doc/html/stdlib.epub/OEBPS/gen_server.xhtml	2025-02-26 17:28:36.341762784 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/gen_server.xhtml	2025-02-26 17:28:36.377763114 +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/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/doc/html/stdlib.epub/OEBPS/gen_statem.xhtml 2025-02-26 17:28:36.337762747 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/gen_statem.xhtml 2025-02-26 17:28:36.377763114 +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/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/doc/html/stdlib.epub/OEBPS/io.xhtml 2025-02-26 17:28:36.337762747 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/io.xhtml 2025-02-26 17:28:36.373763077 +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/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/doc/html/stdlib.epub/OEBPS/io_lib.xhtml	2025-02-26 17:28:36.337762747 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/io_lib.xhtml	2025-02-26 17:28:36.373763077 +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/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/doc/html/stdlib.epub/OEBPS/io_protocol.xhtml 2025-02-26 17:28:36.337762747 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/io_protocol.xhtml 2025-02-26 17:28:36.373763077 +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/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/doc/html/stdlib.epub/OEBPS/json.xhtml	2025-02-26 17:28:36.337762747 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/json.xhtml	2025-02-26 17:28:36.373763077 +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/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/doc/html/stdlib.epub/OEBPS/lists.xhtml 2025-02-26 17:28:36.337762747 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/lists.xhtml 2025-02-26 17:28:36.373763077 +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/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/doc/html/stdlib.epub/OEBPS/maps.xhtml 2025-02-26 17:28:36.333762711 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/maps.xhtml 2025-02-26 17:28:36.369763040 +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/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/doc/html/stdlib.epub/OEBPS/ms_transform.xhtml 2025-02-26 17:28:36.333762711 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/ms_transform.xhtml 2025-02-26 17:28:36.369763040 +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/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/doc/html/stdlib.epub/OEBPS/notes.xhtml 2025-02-26 17:28:36.333762711 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/notes.xhtml 2025-02-26 17:28:36.369763040 +0000 @@ -34,25 +34,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

      @@ -132,8 +132,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.
        @@ -166,12 +166,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/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/doc/html/stdlib.epub/OEBPS/orddict.xhtml 2025-02-26 17:28:36.329762674 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/orddict.xhtml 2025-02-26 17:28:36.365763003 +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/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/doc/html/stdlib.epub/OEBPS/peer.xhtml 2025-02-26 17:28:36.329762674 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/peer.xhtml 2025-02-26 17:28:36.365763003 +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/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/doc/html/stdlib.epub/OEBPS/proc_lib.xhtml 2025-02-26 17:28:36.329762674 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/proc_lib.xhtml 2025-02-26 17:28:36.365763003 +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/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/doc/html/stdlib.epub/OEBPS/proplists.xhtml 2025-02-26 17:28:36.329762674 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/proplists.xhtml 2025-02-26 17:28:36.365763003 +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/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/doc/html/stdlib.epub/OEBPS/qlc.xhtml 2025-02-26 17:28:36.329762674 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/qlc.xhtml 2025-02-26 17:28:36.365763003 +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/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/doc/html/stdlib.epub/OEBPS/queue.xhtml	2025-02-26 17:28:36.325762637 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/queue.xhtml	2025-02-26 17:28:36.361762967 +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/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/doc/html/stdlib.epub/OEBPS/rand.xhtml	2025-02-26 17:28:36.325762637 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/rand.xhtml	2025-02-26 17:28:36.361762967 +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/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/doc/html/stdlib.epub/OEBPS/random.xhtml 2025-02-26 17:28:36.325762637 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/random.xhtml 2025-02-26 17:28:36.361762967 +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/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/doc/html/stdlib.epub/OEBPS/re.xhtml 2025-02-26 17:28:36.325762637 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/re.xhtml 2025-02-26 17:28:36.361762967 +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/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/doc/html/stdlib.epub/OEBPS/sets.xhtml 2025-02-26 17:28:36.325762637 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/sets.xhtml 2025-02-26 17:28:36.361762967 +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/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/doc/html/stdlib.epub/OEBPS/shell.xhtml 2025-02-26 17:28:36.325762637 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/shell.xhtml 2025-02-26 17:28:36.361762967 +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/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/doc/html/stdlib.epub/OEBPS/shell_default.xhtml	2025-02-26 17:28:36.325762637 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/shell_default.xhtml	2025-02-26 17:28:36.361762967 +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/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/doc/html/stdlib.epub/OEBPS/slave.xhtml 2025-02-26 17:28:36.325762637 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/slave.xhtml 2025-02-26 17:28:36.357762930 +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/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/doc/html/stdlib.epub/OEBPS/sofs.xhtml 2025-02-26 17:28:36.321762601 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/sofs.xhtml 2025-02-26 17:28:36.357762930 +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/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/doc/html/stdlib.epub/OEBPS/stdlib_app.xhtml 2025-02-26 17:28:36.321762601 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/stdlib_app.xhtml 2025-02-26 17:28:36.357762930 +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/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/doc/html/stdlib.epub/OEBPS/string.xhtml 2025-02-26 17:28:36.321762601 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/string.xhtml 2025-02-26 17:28:36.357762930 +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/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/doc/html/stdlib.epub/OEBPS/supervisor.xhtml 2025-02-26 17:28:36.321762601 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/supervisor.xhtml 2025-02-26 17:28:36.357762930 +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/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/doc/html/stdlib.epub/OEBPS/timer.xhtml 2025-02-26 17:28:36.321762601 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/timer.xhtml 2025-02-26 17:28:36.353762893 +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/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/doc/html/stdlib.epub/OEBPS/unicode.xhtml 2025-02-26 17:28:36.321762601 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/unicode.xhtml 2025-02-26 17:28:36.353762893 +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/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/doc/html/stdlib.epub/OEBPS/unicode_usage.xhtml 2025-02-26 17:28:36.321762601 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/unicode_usage.xhtml 2025-02-26 17:28:36.353762893 +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/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/doc/html/stdlib.epub/OEBPS/uri_string.xhtml	2025-02-26 17:28:36.317762564 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/uri_string.xhtml	2025-02-26 17:28:36.353762893 +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/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/doc/html/stdlib.epub/OEBPS/uri_string_usage.xhtml 2025-02-26 17:28:36.317762564 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/uri_string_usage.xhtml 2025-02-26 17:28:36.353762893 +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/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/doc/html/stdlib.epub/OEBPS/zip.xhtml 2025-02-26 17:28:36.317762564 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib.epub/OEBPS/zip.xhtml 2025-02-26 17:28:36.353762893 +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/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/doc/html/stdlib_app.html 2025-02-26 17:28:37.053769297 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/stdlib_app.html 2025-02-26 17:28:37.053769297 +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/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/doc/html/string.html 2025-02-26 17:28:37.109769809 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/string.html 2025-02-26 17:28:37.105769773 +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/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/doc/html/supervisor.html 2025-02-26 17:28:37.149770175 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/supervisor.html 2025-02-26 17:28:37.149770175 +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/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/doc/html/supervisor_bridge.html 2025-02-26 17:28:37.169770359 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/supervisor_bridge.html 2025-02-26 17:28:37.169770359 +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/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/doc/html/sys.html 2025-02-26 17:28:37.209770725 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/sys.html 2025-02-26 17:28:37.209770725 +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/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/doc/html/timer.html 2025-02-26 17:28:37.241771017 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/timer.html 2025-02-26 17:28:37.241771017 +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/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/doc/html/unicode.html 2025-02-26 17:28:37.273771310 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/unicode.html 2025-02-26 17:28:37.273771310 +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/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/doc/html/unicode_usage.html 2025-02-26 17:28:37.313771675 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/unicode_usage.html 2025-02-26 17:28:37.313771675 +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/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/doc/html/uri_string.html	2025-02-26 17:28:37.345771968 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/uri_string.html	2025-02-26 17:28:37.345771968 +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/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/doc/html/uri_string_usage.html 2025-02-26 17:28:37.365772152 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/uri_string_usage.html 2025-02-26 17:28:37.365772152 +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/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/doc/html/win32reg.html 2025-02-26 17:28:37.389772371 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/win32reg.html 2025-02-26 17:28:37.389772371 +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/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/doc/html/zip.html 2025-02-26 17:28:37.425772700 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-6.2/doc/html/zip.html 2025-02-26 17:28:37.425772700 +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.1/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/404.html 2025-02-26 17:28:37.441772846 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/404.html 2025-02-26 17:28:37.441772846 +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.1/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/api-reference.html 2025-02-26 17:28:37.457772993 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/api-reference.html 2025-02-26 17:28:37.457772993 +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.1/doc/html/chapter.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/chapter.html 2025-02-26 17:28:37.473773140 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/chapter.html 2025-02-26 17:28:37.473773140 +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.1/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.1/doc/html/epp_dodger.html 2025-02-26 17:28:37.497773359 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/epp_dodger.html 2025-02-26 17:28:37.497773359 +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.1/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.1/doc/html/erl_comment_scan.html 2025-02-26 17:28:37.513773505 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/erl_comment_scan.html 2025-02-26 17:28:37.517773542 +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.1/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.1/doc/html/erl_prettypr.html 2025-02-26 17:28:37.537773725 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/erl_prettypr.html 2025-02-26 17:28:37.537773725 +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.1/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.1/doc/html/erl_recomment.html 2025-02-26 17:28:37.557773908 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/erl_recomment.html 2025-02-26 17:28:37.557773908 +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.1/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.1/doc/html/erl_syntax.html 2025-02-26 17:28:37.685775078 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/erl_syntax.html 2025-02-26 17:28:37.685775078 +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.1/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.1/doc/html/erl_syntax_lib.html 2025-02-26 17:28:37.737775555 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/erl_syntax_lib.html 2025-02-26 17:28:37.737775555 +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.1/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.1/doc/html/merl.html 2025-02-26 17:28:37.769775847 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/merl.html 2025-02-26 17:28:37.769775847 +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.1/doc/html/merl_transform.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/merl_transform.html 2025-02-26 17:28:37.785775993 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/merl_transform.html 2025-02-26 17:28:37.785775993 +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.1/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.1/doc/html/notes.html 2025-02-26 17:28:37.809776213 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/notes.html 2025-02-26 17:28:37.809776213 +0000 @@ -910,7 +910,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.1/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.1/doc/html/prettypr.html 2025-02-26 17:28:37.837776470 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/prettypr.html 2025-02-26 17:28:37.837776470 +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.1/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/search.html 2025-02-26 17:28:37.849776579 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-3.2.1/doc/html/search.html 2025-02-26 17:28:37.849776579 +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-02-26 17:28:37.865776726 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/404.html 2025-02-26 17:28:37.865776726 +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-02-26 17:28:37.881776871 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/api-reference.html 2025-02-26 17:28:37.881776871 +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-02-26 17:28:37.897777018 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/getting_started.html 2025-02-26 17:28:37.897777018 +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-02-26 17:28:37.913777164 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/introduction.html 2025-02-26 17:28:37.913777164 +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-02-26 17:28:37.929777311 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/notes.html 2025-02-26 17:28:37.929777311 +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-02-26 17:28:37.945777457 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/search.html 2025-02-26 17:28:37.945777457 +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-02-26 17:28:37.965777640 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp.epub/OEBPS/content.opf 2025-02-26 17:28:37.965777640 +0000 @@ -4,10 +4,10 @@ version="3.0"> tftp - 1.2.2 - urn:uuid:3023dbcb-96f4-2c8c-8070-3a991c400bd2 + urn:uuid:2c8985a9-dc0f-0137-d58b-213e240e7a5d en - 2025-02-26T17:22:49Z + 2041-03-31T06:42:10Z /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-02-26 17:28:37.965777640 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp.epub/OEBPS/getting_started.xhtml 2025-02-26 17:28:37.965777640 +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-02-26 17:28:37.965777640 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp.epub/OEBPS/tftp.xhtml 2025-02-26 17:28:37.965777640 +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-02-26 17:28:38.021778152 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp.html 2025-02-26 17:28:38.021778152 +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-02-26 17:28:38.037778298 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.2/doc/html/tftp_logger.html 2025-02-26 17:28:38.037778298 +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-02-26 17:28:38.053778445 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/404.html 2025-02-26 17:28:38.053778445 +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-02-26 17:28:38.069778591 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/api-reference.html 2025-02-26 17:28:38.069778591 +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-02-26 17:28:38.105778920 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cover.html 2025-02-26 17:28:38.105778920 +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-02-26 17:28:38.137779213 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cover_chapter.html 2025-02-26 17:28:38.137779213 +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-02-26 17:28:38.161779433 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cprof.html	2025-02-26 17:28:38.165779470 +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-02-26 17:28:38.185779653 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/cprof_chapter.html 2025-02-26 17:28:38.185779653 +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-02-26 17:28:38.209779872 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/eprof.html	2025-02-26 17:28:38.209779872 +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-02-26 17:28:38.229780055 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/erlang-el.html 2025-02-26 17:28:38.229780055 +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-02-26 17:28:38.245780201 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/erlang_mode_chapter.html 2025-02-26 17:28:38.245780201 +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-02-26 17:28:38.281780531 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/fprof.html 2025-02-26 17:28:38.281780531 +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-02-26 17:28:38.301780714 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/fprof_chapter.html	2025-02-26 17:28:38.301780714 +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-02-26 17:28:38.329780970 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/lcnt.html 2025-02-26 17:28:38.333781006 +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-02-26 17:28:38.353781189 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/lcnt_chapter.html 2025-02-26 17:28:38.353781189 +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-02-26 17:28:38.373781372 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/make.html 2025-02-26 17:28:38.373781372 +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-02-26 17:28:38.405781666 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/notes.html 2025-02-26 17:28:38.405781666 +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-02-26 17:28:38.421781812 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/search.html 2025-02-26 17:28:38.421781812 +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-02-26 17:28:38.441781994 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tags.html 2025-02-26 17:28:38.441781994 +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-02-26 17:28:38.469782250 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/content.opf 2025-02-26 17:28:38.477782324 +0000 @@ -4,10 +4,10 @@ version="3.0"> tools - 4.1.1 - urn:uuid:2d75d954-e724-2aa2-8a2a-08087a8643d2 + urn:uuid:5fc9aad3-18b7-e910-9be4-c989d139db0b en - 2025-02-26T17:21:27Z + 2041-03-31T06:40:54Z /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-02-26 17:28:38.469782250 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/cover.xhtml 2025-02-26 17:28:38.477782324 +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-02-26 17:28:38.469782250 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/cover_chapter.xhtml 2025-02-26 17:28:38.477782324 +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-02-26 17:28:38.469782250 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/cprof.xhtml	2025-02-26 17:28:38.477782324 +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-02-26 17:28:38.469782250 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/cprof_chapter.xhtml 2025-02-26 17:28:38.477782324 +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-02-26 17:28:38.469782250 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/erlang-el.xhtml	2025-02-26 17:28:38.473782287 +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-02-26 17:28:38.469782250 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/fprof.xhtml 2025-02-26 17:28:38.473782287 +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-02-26 17:28:38.465782214 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/fprof_chapter.xhtml	2025-02-26 17:28:38.473782287 +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-02-26 17:28:38.465782214 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/lcnt_chapter.xhtml 2025-02-26 17:28:38.473782287 +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-02-26 17:28:38.465782214 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/make.xhtml 2025-02-26 17:28:38.473782287 +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-02-26 17:28:38.465782214 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/notes.xhtml 2025-02-26 17:28:38.473782287 +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-02-26 17:28:38.465782214 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/tprof.xhtml 2025-02-26 17:28:38.473782287 +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-02-26 17:28:38.465782214 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tools.epub/OEBPS/xref_chapter.xhtml	2025-02-26 17:28:38.469782250 +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-02-26 17:28:38.653783934 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/tprof.html 2025-02-26 17:28:38.653783934 +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-02-26 17:28:38.713784483 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/xref.html	2025-02-26 17:28:38.713784483 +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-02-26 17:28:38.737784702 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.1/doc/html/xref_chapter.html 2025-02-26 17:28:38.737784702 +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-02-26 17:28:38.753784849 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/404.html 2025-02-26 17:28:38.753784849 +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-02-26 17:28:38.793785215 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/api-reference.html 2025-02-26 17:28:38.797785252 +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-02-26 17:28:38.813785397 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/chapter.html 2025-02-26 17:28:38.813785397 +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-02-26 17:28:39.213789057 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/gl.html 2025-02-26 17:28:39.209789020 +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-02-26 17:28:39.265789532 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/glu.html 2025-02-26 17:28:39.265789532 +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-02-26 17:28:39.289789752 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/notes.html 2025-02-26 17:28:39.289789752 +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-02-26 17:28:39.305789898 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/search.html 2025-02-26 17:28:39.305789898 +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-02-26 17:28:39.373790520 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx.epub/OEBPS/chapter.xhtml 2025-02-26 17:28:39.417790923 +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-02-26 17:28:39.373790520 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx.epub/OEBPS/content.opf 2025-02-26 17:28:39.417790923 +0000 @@ -4,10 +4,10 @@ version="3.0"> wx - 2.4.3 - urn:uuid:1c9233c1-c035-3082-95d3-b138a3952779 + urn:uuid:7036e1a0-88d6-f640-76ec-f5d5a253c79e en - 2025-02-26T17:22:19Z + 2041-03-31T06:41:43Z /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-02-26 17:28:39.329790117 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx.epub/OEBPS/wx_object.xhtml 2025-02-26 17:28:39.373790520 +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-02-26 17:28:39.809794509 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx.html 2025-02-26 17:28:39.809794509 +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-02-26 17:28:39.829794691 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAcceleratorEntry.html 2025-02-26 17:28:39.829794691 +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-02-26 17:28:39.849794875 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAcceleratorTable.html 2025-02-26 17:28:39.849794875 +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-02-26 17:28:39.869795057 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxActivateEvent.html 2025-02-26 17:28:39.869795057 +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-02-26 17:28:39.885795204 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxArtProvider.html 2025-02-26 17:28:39.885795204 +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-02-26 17:28:39.905795387 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiDockArt.html 2025-02-26 17:28:39.905795387 +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-02-26 17:28:39.937795680 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiManager.html 2025-02-26 17:28:39.937795680 +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-02-26 17:28:39.961795899 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiManagerEvent.html 2025-02-26 17:28:39.961795899 +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-02-26 17:28:39.989796156 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiNotebook.html 2025-02-26 17:28:39.989796156 +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-02-26 17:28:40.013796375 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiNotebookEvent.html 2025-02-26 17:28:40.013796375 +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-02-26 17:28:40.061796814 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiPaneInfo.html 2025-02-26 17:28:40.061796814 +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-02-26 17:28:40.081796997 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiSimpleTabArt.html 2025-02-26 17:28:40.081796997 +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-02-26 17:28:40.101797180 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxAuiTabArt.html 2025-02-26 17:28:40.101797180 +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-02-26 17:28:40.129797436 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBitmap.html 2025-02-26 17:28:40.129797436 +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-02-26 17:28:40.149797619 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBitmapButton.html 2025-02-26 17:28:40.149797619 +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-02-26 17:28:40.169797802 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBitmapDataObject.html 2025-02-26 17:28:40.169797802 +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-02-26 17:28:40.189797985 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBookCtrlBase.html 2025-02-26 17:28:40.193798021 +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-02-26 17:28:40.209798168 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBookCtrlEvent.html 2025-02-26 17:28:40.209798168 +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-02-26 17:28:40.225798314 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBoxSizer.html 2025-02-26 17:28:40.225798314 +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-02-26 17:28:40.249798534 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBrush.html 2025-02-26 17:28:40.249798534 +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-02-26 17:28:40.269798717 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBufferedDC.html 2025-02-26 17:28:40.269798717 +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-02-26 17:28:40.289798899 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxBufferedPaintDC.html 2025-02-26 17:28:40.289798899 +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-02-26 17:28:40.309799083 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxButton.html 2025-02-26 17:28:40.309799083 +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-02-26 17:28:40.337799339 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCalendarCtrl.html 2025-02-26 17:28:40.337799339 +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-02-26 17:28:40.361799558 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCalendarDateAttr.html 2025-02-26 17:28:40.365799595 +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-02-26 17:28:40.381799742 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCalendarEvent.html 2025-02-26 17:28:40.381799742 +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-02-26 17:28:40.405799961 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCaret.html 2025-02-26 17:28:40.405799961 +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-02-26 17:28:40.425800143 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCheckBox.html 2025-02-26 17:28:40.425800143 +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-02-26 17:28:40.445800327 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCheckListBox.html 2025-02-26 17:28:40.445800327 +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-02-26 17:28:40.465800510 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxChildFocusEvent.html 2025-02-26 17:28:40.465800510 +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-02-26 17:28:40.485800693 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxChoice.html 2025-02-26 17:28:40.485800693 +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-02-26 17:28:40.513800949 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxChoicebook.html 2025-02-26 17:28:40.513800949 +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-02-26 17:28:40.529801095 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxClientDC.html 2025-02-26 17:28:40.529801095 +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-02-26 17:28:40.553801315 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxClipboard.html 2025-02-26 17:28:40.553801315 +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-02-26 17:28:40.569801461 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxClipboardTextEvent.html 2025-02-26 17:28:40.569801461 +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-02-26 17:28:40.589801645 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCloseEvent.html 2025-02-26 17:28:40.589801645 +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-02-26 17:28:40.609801827 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourData.html 2025-02-26 17:28:40.609801827 +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-02-26 17:28:40.629802010 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourDialog.html 2025-02-26 17:28:40.629802010 +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-02-26 17:28:40.649802193 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourPickerCtrl.html 2025-02-26 17:28:40.649802193 +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-02-26 17:28:40.665802339 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxColourPickerEvent.html 2025-02-26 17:28:40.665802339 +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-02-26 17:28:40.693802595 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxComboBox.html 2025-02-26 17:28:40.693802595 +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-02-26 17:28:40.713802779 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCommandEvent.html 2025-02-26 17:28:40.713802779 +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-02-26 17:28:40.729802925 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxContextMenuEvent.html 2025-02-26 17:28:40.729802925 +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-02-26 17:28:40.745803071 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxControl.html 2025-02-26 17:28:40.745803071 +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-02-26 17:28:40.773803327 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxControlWithItems.html 2025-02-26 17:28:40.773803327 +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-02-26 17:28:40.789803473 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxCursor.html 2025-02-26 17:28:40.789803473 +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-02-26 17:28:40.841803950 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDC.html 2025-02-26 17:28:40.841803950 +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-02-26 17:28:40.861804132 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDCOverlay.html 2025-02-26 17:28:40.861804132 +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-02-26 17:28:40.881804316 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDataObject.html 2025-02-26 17:28:40.881804316 +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-02-26 17:28:40.897804461 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDateEvent.html 2025-02-26 17:28:40.897804461 +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-02-26 17:28:40.917804644 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDatePickerCtrl.html 2025-02-26 17:28:40.917804644 +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-02-26 17:28:40.941804864 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDialog.html 2025-02-26 17:28:40.941804864 +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-02-26 17:28:40.957805010 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDirDialog.html 2025-02-26 17:28:40.957805010 +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-02-26 17:28:40.977805194 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDirPickerCtrl.html 2025-02-26 17:28:40.977805194 +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-02-26 17:28:40.997805376 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDisplay.html 2025-02-26 17:28:40.997805376 +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-02-26 17:28:41.013805523 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDisplayChangedEvent.html 2025-02-26 17:28:41.013805523 +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-02-26 17:28:41.033805706 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxDropFilesEvent.html 2025-02-26 17:28:41.033805706 +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-02-26 17:28:41.049805853 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxEraseEvent.html 2025-02-26 17:28:41.049805853 +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-02-26 17:28:41.065805998 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxEvent.html 2025-02-26 17:28:41.069806035 +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-02-26 17:28:41.089806218 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxEvtHandler.html 2025-02-26 17:28:41.089806218 +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-02-26 17:28:41.105806365 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFileDataObject.html 2025-02-26 17:28:41.109806401 +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-02-26 17:28:41.129806584 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFileDialog.html 2025-02-26 17:28:41.129806584 +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-02-26 17:28:41.149806767 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFileDirPickerEvent.html 2025-02-26 17:28:41.149806767 +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-02-26 17:28:41.165806913 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFilePickerCtrl.html 2025-02-26 17:28:41.169806950 +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-02-26 17:28:41.185807097 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFindReplaceData.html 2025-02-26 17:28:41.185807097 +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-02-26 17:28:41.205807279 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFindReplaceDialog.html 2025-02-26 17:28:41.205807279 +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-02-26 17:28:41.225807462 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFlexGridSizer.html 2025-02-26 17:28:41.225807462 +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-02-26 17:28:41.245807645 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFocusEvent.html 2025-02-26 17:28:41.245807645 +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-02-26 17:28:41.269807865 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFont.html 2025-02-26 17:28:41.269807865 +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-02-26 17:28:41.289808047 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontData.html 2025-02-26 17:28:41.289808047 +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-02-26 17:28:41.309808231 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontDialog.html 2025-02-26 17:28:41.309808231 +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-02-26 17:28:41.329808413 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontPickerCtrl.html 2025-02-26 17:28:41.329808413 +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-02-26 17:28:41.345808560 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFontPickerEvent.html 2025-02-26 17:28:41.345808560 +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-02-26 17:28:41.373808816 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxFrame.html 2025-02-26 17:28:41.373808816 +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-02-26 17:28:41.389808962 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGBSizerItem.html 2025-02-26 17:28:41.389808962 +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-02-26 17:28:41.405809109 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGCDC.html 2025-02-26 17:28:41.405809109 +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-02-26 17:28:41.425809292 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGLCanvas.html 2025-02-26 17:28:41.425809292 +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-02-26 17:28:41.445809475 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGLContext.html 2025-02-26 17:28:41.445809475 +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-02-26 17:28:41.465809658 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGauge.html 2025-02-26 17:28:41.465809658 +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-02-26 17:28:41.489809877 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGenericDirCtrl.html 2025-02-26 17:28:41.489809877 +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-02-26 17:28:41.505810024 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsBrush.html 2025-02-26 17:28:41.505810024 +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-02-26 17:28:41.537810316 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsContext.html 2025-02-26 17:28:41.537810316 +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-02-26 17:28:41.557810499 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsFont.html 2025-02-26 17:28:41.557810499 +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-02-26 17:28:41.573810646 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsGradientStops.html 2025-02-26 17:28:41.573810646 +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-02-26 17:28:41.593810828 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsMatrix.html 2025-02-26 17:28:41.597810865 +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-02-26 17:28:41.613811011 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsObject.html 2025-02-26 17:28:41.613811011 +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-02-26 17:28:41.637811231 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsPath.html 2025-02-26 17:28:41.637811231 +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-02-26 17:28:41.653811377 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsPen.html 2025-02-26 17:28:41.653811377 +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-02-26 17:28:41.673811561 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGraphicsRenderer.html 2025-02-26 17:28:41.673811561 +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-02-26 17:28:41.761812365 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGrid.html 2025-02-26 17:28:41.765812402 +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-02-26 17:28:41.793812658 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridBagSizer.html 2025-02-26 17:28:41.793812658 +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-02-26 17:28:41.817812877 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellAttr.html 2025-02-26 17:28:41.817812877 +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-02-26 17:28:41.837813061 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellBoolEditor.html 2025-02-26 17:28:41.837813061 +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-02-26 17:28:41.853813207 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellBoolRenderer.html 2025-02-26 17:28:41.853813207 +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-02-26 17:28:41.869813354 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellChoiceEditor.html 2025-02-26 17:28:41.869813354 +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-02-26 17:28:41.889813536 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellEditor.html 2025-02-26 17:28:41.889813536 +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-02-26 17:28:41.909813720 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellFloatEditor.html 2025-02-26 17:28:41.909813720 +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-02-26 17:28:41.925813866 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellFloatRenderer.html 2025-02-26 17:28:41.925813866 +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-02-26 17:28:41.945814048 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellNumberEditor.html 2025-02-26 17:28:41.945814048 +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-02-26 17:28:41.961814195 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellNumberRenderer.html 2025-02-26 17:28:41.961814195 +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-02-26 17:28:41.977814341 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellRenderer.html 2025-02-26 17:28:41.981814378 +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-02-26 17:28:41.997814524 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellStringRenderer.html 2025-02-26 17:28:41.997814524 +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-02-26 17:28:42.013814670 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridCellTextEditor.html 2025-02-26 17:28:42.013814670 +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-02-26 17:28:42.033814854 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridEvent.html 2025-02-26 17:28:42.033814854 +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-02-26 17:28:42.053815036 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxGridSizer.html 2025-02-26 17:28:42.053815036 +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-02-26 17:28:42.073815220 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHelpEvent.html 2025-02-26 17:28:42.073815220 +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-02-26 17:28:42.093815402 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHtmlEasyPrinting.html 2025-02-26 17:28:42.093815402 +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-02-26 17:28:42.113815585 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHtmlLinkEvent.html 2025-02-26 17:28:42.113815585 +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-02-26 17:28:42.137815805 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxHtmlWindow.html 2025-02-26 17:28:42.137815805 +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-02-26 17:28:42.157815988 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIcon.html 2025-02-26 17:28:42.157815988 +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-02-26 17:28:42.177816171 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIconBundle.html 2025-02-26 17:28:42.177816171 +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-02-26 17:28:42.193816317 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIconizeEvent.html 2025-02-26 17:28:42.193816317 +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-02-26 17:28:42.213816500 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxIdleEvent.html 2025-02-26 17:28:42.213816500 +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-02-26 17:28:42.265816976 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxImage.html 2025-02-26 17:28:42.265816976 +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-02-26 17:28:42.293817232 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxImageList.html 2025-02-26 17:28:42.293817232 +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-02-26 17:28:42.309817378 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxInitDialogEvent.html 2025-02-26 17:28:42.309817378 +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-02-26 17:28:42.329817562 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxJoystickEvent.html 2025-02-26 17:28:42.329817562 +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-02-26 17:28:42.353817781 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxKeyEvent.html 2025-02-26 17:28:42.353817781 +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-02-26 17:28:42.373817964 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxLayoutAlgorithm.html 2025-02-26 17:28:42.373817964 +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-02-26 17:28:42.393818147 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListBox.html 2025-02-26 17:28:42.397818184 +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-02-26 17:28:42.441818586 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListCtrl.html 2025-02-26 17:28:42.441818586 +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-02-26 17:28:42.465818806 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListEvent.html 2025-02-26 17:28:42.465818806 +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-02-26 17:28:42.489819025 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListItem.html 2025-02-26 17:28:42.489819025 +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-02-26 17:28:42.509819209 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListItemAttr.html 2025-02-26 17:28:42.509819209 +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-02-26 17:28:42.529819391 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListView.html 2025-02-26 17:28:42.529819391 +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-02-26 17:28:42.557819647 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxListbook.html 2025-02-26 17:28:42.557819647 +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-02-26 17:28:42.581819866 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxLocale.html 2025-02-26 17:28:42.581819866 +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-02-26 17:28:42.601820050 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxLogNull.html 2025-02-26 17:28:42.601820050 +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-02-26 17:28:42.621820233 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMDIChildFrame.html 2025-02-26 17:28:42.621820233 +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-02-26 17:28:42.637820379 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMDIClientWindow.html 2025-02-26 17:28:42.637820379 +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-02-26 17:28:42.661820599 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMDIParentFrame.html 2025-02-26 17:28:42.661820599 +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-02-26 17:28:42.677820745 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMask.html 2025-02-26 17:28:42.677820745 +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-02-26 17:28:42.693820891 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMaximizeEvent.html 2025-02-26 17:28:42.693820891 +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-02-26 17:28:42.713821074 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMemoryDC.html 2025-02-26 17:28:42.713821074 +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-02-26 17:28:42.749821403 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenu.html 2025-02-26 17:28:42.749821403 +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-02-26 17:28:42.777821659 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenuBar.html 2025-02-26 17:28:42.777821659 +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-02-26 17:28:42.797821843 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenuEvent.html 2025-02-26 17:28:42.797821843 +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-02-26 17:28:42.825822099 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMenuItem.html 2025-02-26 17:28:42.825822099 +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-02-26 17:28:42.845822281 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMessageDialog.html 2025-02-26 17:28:42.845822281 +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-02-26 17:28:42.865822465 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMiniFrame.html 2025-02-26 17:28:42.865822465 +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-02-26 17:28:42.881822611 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMirrorDC.html 2025-02-26 17:28:42.881822611 +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-02-26 17:28:42.901822794 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMouseCaptureChangedEvent.html 2025-02-26 17:28:42.901822794 +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-02-26 17:28:42.921822977 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMouseCaptureLostEvent.html 2025-02-26 17:28:42.921822977 +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-02-26 17:28:42.953823270 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMouseEvent.html 2025-02-26 17:28:42.953823270 +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-02-26 17:28:42.973823452 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMoveEvent.html 2025-02-26 17:28:42.973823452 +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-02-26 17:28:42.993823636 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxMultiChoiceDialog.html 2025-02-26 17:28:42.993823636 +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-02-26 17:28:43.013823818 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNavigationKeyEvent.html 2025-02-26 17:28:43.013823818 +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-02-26 17:28:43.037824039 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNotebook.html 2025-02-26 17:28:43.037824039 +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-02-26 17:28:43.061824258 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNotificationMessage.html 2025-02-26 17:28:43.061824258 +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-02-26 17:28:43.081824440 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxNotifyEvent.html 2025-02-26 17:28:43.081824440 +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-02-26 17:28:43.097824587 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxOverlay.html 2025-02-26 17:28:43.097824587 +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-02-26 17:28:43.117824770 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPageSetupDialog.html 2025-02-26 17:28:43.117824770 +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-02-26 17:28:43.145825026 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPageSetupDialogData.html 2025-02-26 17:28:43.145825026 +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-02-26 17:28:43.161825173 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPaintDC.html 2025-02-26 17:28:43.161825173 +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-02-26 17:28:43.181825355 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPaintEvent.html 2025-02-26 17:28:43.181825355 +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-02-26 17:28:43.201825538 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPalette.html 2025-02-26 17:28:43.201825538 +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-02-26 17:28:43.217825685 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPaletteChangedEvent.html 2025-02-26 17:28:43.217825685 +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-02-26 17:28:43.233825832 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPanel.html 2025-02-26 17:28:43.233825832 +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-02-26 17:28:43.253826014 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPasswordEntryDialog.html 2025-02-26 17:28:43.253826014 +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-02-26 17:28:43.277826233 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPen.html 2025-02-26 17:28:43.277826233 +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-02-26 17:28:43.297826417 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPickerBase.html 2025-02-26 17:28:43.297826417 +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-02-26 17:28:43.317826599 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPopupTransientWindow.html 2025-02-26 17:28:43.317826599 +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-02-26 17:28:43.341826819 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPopupWindow.html 2025-02-26 17:28:43.341826819 +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-02-26 17:28:43.357826966 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPostScriptDC.html 2025-02-26 17:28:43.357826966 +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-02-26 17:28:43.373827111 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPreviewCanvas.html 2025-02-26 17:28:43.373827111 +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-02-26 17:28:43.393827295 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPreviewControlBar.html 2025-02-26 17:28:43.393827295 +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-02-26 17:28:43.413827478 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPreviewFrame.html 2025-02-26 17:28:43.413827478 +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-02-26 17:28:43.437827697 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintData.html 2025-02-26 17:28:43.437827697 +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-02-26 17:28:43.457827880 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintDialog.html 2025-02-26 17:28:43.457827880 +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-02-26 17:28:43.481828100 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintDialogData.html 2025-02-26 17:28:43.481828100 +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-02-26 17:28:43.505828319 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintPreview.html 2025-02-26 17:28:43.505828319 +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-02-26 17:28:43.525828503 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrinter.html 2025-02-26 17:28:43.529828539 +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-02-26 17:28:43.557828795 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxPrintout.html 2025-02-26 17:28:43.557828795 +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-02-26 17:28:43.573828941 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxProgressDialog.html 2025-02-26 17:28:43.573828941 +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-02-26 17:28:43.593829125 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxQueryNewPaletteEvent.html 2025-02-26 17:28:43.593829125 +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-02-26 17:28:43.617829344 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxRadioBox.html 2025-02-26 17:28:43.617829344 +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-02-26 17:28:43.641829563 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxRadioButton.html 2025-02-26 17:28:43.641829563 +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-02-26 17:28:43.665829783 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxRegion.html 2025-02-26 17:28:43.665829783 +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-02-26 17:28:43.685829966 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSashEvent.html 2025-02-26 17:28:43.685829966 +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-02-26 17:28:43.705830149 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSashLayoutWindow.html 2025-02-26 17:28:43.705830149 +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-02-26 17:28:43.729830368 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSashWindow.html 2025-02-26 17:28:43.729830368 +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-02-26 17:28:43.745830515 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScreenDC.html 2025-02-26 17:28:43.745830515 +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-02-26 17:28:43.769830734 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrollBar.html 2025-02-26 17:28:43.769830734 +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-02-26 17:28:43.785830881 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrollEvent.html 2025-02-26 17:28:43.785830881 +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-02-26 17:28:43.805831063 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrollWinEvent.html 2025-02-26 17:28:43.805831063 +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-02-26 17:28:43.833831320 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxScrolledWindow.html 2025-02-26 17:28:43.833831320 +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-02-26 17:28:43.853831503 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSetCursorEvent.html 2025-02-26 17:28:43.853831503 +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-02-26 17:28:43.869831649 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxShowEvent.html 2025-02-26 17:28:43.869831649 +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-02-26 17:28:43.889831832 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSingleChoiceDialog.html 2025-02-26 17:28:43.889831832 +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-02-26 17:28:43.905831978 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizeEvent.html 2025-02-26 17:28:43.905831978 +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-02-26 17:28:43.949832381 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizer.html 2025-02-26 17:28:43.949832381 +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-02-26 17:28:43.973832600 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizerFlags.html 2025-02-26 17:28:43.973832600 +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-02-26 17:28:44.001832856 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSizerItem.html 2025-02-26 17:28:44.001832856 +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-02-26 17:28:44.025833077 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSlider.html 2025-02-26 17:28:44.025833077 +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-02-26 17:28:44.045833259 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSpinButton.html 2025-02-26 17:28:44.045833259 +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-02-26 17:28:44.069833478 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSpinCtrl.html 2025-02-26 17:28:44.069833478 +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-02-26 17:28:44.085833625 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSpinEvent.html 2025-02-26 17:28:44.085833625 +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-02-26 17:28:44.105833808 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSplashScreen.html 2025-02-26 17:28:44.105833808 +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-02-26 17:28:44.125833991 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSplitterEvent.html 2025-02-26 17:28:44.125833991 +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-02-26 17:28:44.153834247 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSplitterWindow.html 2025-02-26 17:28:44.153834247 +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-02-26 17:28:44.173834430 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticBitmap.html 2025-02-26 17:28:44.173834430 +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-02-26 17:28:44.189834577 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticBox.html 2025-02-26 17:28:44.189834577 +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-02-26 17:28:44.209834759 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticBoxSizer.html 2025-02-26 17:28:44.209834759 +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-02-26 17:28:44.229834942 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticLine.html 2025-02-26 17:28:44.229834942 +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-02-26 17:28:44.249835125 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStaticText.html 2025-02-26 17:28:44.249835125 +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-02-26 17:28:44.273835345 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStatusBar.html 2025-02-26 17:28:44.273835345 +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-02-26 17:28:44.293835528 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStdDialogButtonSizer.html 2025-02-26 17:28:44.293835528 +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-02-26 17:28:44.449836955 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStyledTextCtrl.html 2025-02-26 17:28:44.449836955 +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-02-26 17:28:44.485837285 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxStyledTextEvent.html 2025-02-26 17:28:44.485837285 +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-02-26 17:28:44.505837467 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSysColourChangedEvent.html 2025-02-26 17:28:44.505837467 +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-02-26 17:28:44.521837614 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSystemOptions.html 2025-02-26 17:28:44.521837614 +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-02-26 17:28:44.541837796 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxSystemSettings.html 2025-02-26 17:28:44.541837796 +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-02-26 17:28:44.561837979 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTaskBarIcon.html 2025-02-26 17:28:44.561837979 +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-02-26 17:28:44.577838126 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTaskBarIconEvent.html 2025-02-26 17:28:44.577838126 +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-02-26 17:28:44.605838382 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextAttr.html 2025-02-26 17:28:44.605838382 +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-02-26 17:28:44.641838711 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextCtrl.html 2025-02-26 17:28:44.641838711 +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-02-26 17:28:44.661838894 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextDataObject.html 2025-02-26 17:28:44.661838894 +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-02-26 17:28:44.681839077 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTextEntryDialog.html 2025-02-26 17:28:44.681839077 +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-02-26 17:28:44.701839260 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToggleButton.html 2025-02-26 17:28:44.701839260 +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-02-26 17:28:44.737839589 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToolBar.html 2025-02-26 17:28:44.733839553 +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-02-26 17:28:44.753839736 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToolTip.html 2025-02-26 17:28:44.753839736 +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-02-26 17:28:44.781839992 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxToolbook.html 2025-02-26 17:28:44.785840029 +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-02-26 17:28:44.809840248 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTopLevelWindow.html 2025-02-26 17:28:44.813840285 +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-02-26 17:28:44.861840724 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTreeCtrl.html 2025-02-26 17:28:44.861840724 +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-02-26 17:28:44.885840944 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTreeEvent.html 2025-02-26 17:28:44.885840944 +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-02-26 17:28:44.913841200 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxTreebook.html 2025-02-26 17:28:44.913841200 +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-02-26 17:28:44.937841419 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxUpdateUIEvent.html 2025-02-26 17:28:44.937841419 +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-02-26 17:28:44.973841748 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWebView.html 2025-02-26 17:28:44.973841748 +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-02-26 17:28:44.993841931 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWebViewEvent.html 2025-02-26 17:28:44.993841931 +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-02-26 17:28:45.089842809 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindow.html 2025-02-26 17:28:45.089842809 +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-02-26 17:28:45.113843029 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindowCreateEvent.html 2025-02-26 17:28:45.113843029 +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-02-26 17:28:45.129843175 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindowDC.html 2025-02-26 17:28:45.129843175 +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-02-26 17:28:45.145843322 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxWindowDestroyEvent.html 2025-02-26 17:28:45.149843359 +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-02-26 17:28:45.173843578 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wxXmlResource.html 2025-02-26 17:28:45.173843578 +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-02-26 17:28:45.201843834 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx_misc.html 2025-02-26 17:28:45.201843834 +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-02-26 17:28:45.233844127 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.4.3/doc/html/wx_object.html 2025-02-26 17:28:45.233844127 +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/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/404.html 2025-02-26 17:28:45.249844274 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/404.html 2025-02-26 17:28:45.249844274 +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/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/api-reference.html 2025-02-26 17:28:45.265844419 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/api-reference.html 2025-02-26 17:28:45.265844419 +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/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/doc/html/notes.html 2025-02-26 17:28:45.293844675 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/notes.html 2025-02-26 17:28:45.293844675 +0000 @@ -1338,7 +1338,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/search.html 2025-02-26 17:28:45.309844822 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/search.html 2025-02-26 17:28:45.309844822 +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/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/doc/html/xmerl.html 2025-02-26 17:28:45.333845042 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl.html 2025-02-26 17:28:45.333845042 +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/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/doc/html/xmerl_eventp.html 2025-02-26 17:28:45.353845225 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl_eventp.html 2025-02-26 17:28:45.353845225 +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/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/doc/html/xmerl_examples.html 2025-02-26 17:28:45.373845408 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl_examples.html 2025-02-26 17:28:45.373845408 +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/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/doc/html/xmerl_sax_parser.html 2025-02-26 17:28:45.393845590 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl_sax_parser.html 2025-02-26 17:28:45.397845627 +0000 @@ -797,7 +797,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/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/doc/html/xmerl_scan.html 2025-02-26 17:28:45.421845847 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl_scan.html 2025-02-26 17:28:45.421845847 +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/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/doc/html/xmerl_ug.html 2025-02-26 17:28:45.449846103 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl_ug.html 2025-02-26 17:28:45.449846103 +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/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/doc/html/xmerl_xpath.html	2025-02-26 17:28:45.473846322 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl_xpath.html	2025-02-26 17:28:45.473846322 +0000
    @@ -500,7 +500,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl_xs.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl_xs.html 2025-02-26 17:28:45.489846469 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl_xs.html 2025-02-26 17:28:45.489846469 +0000 @@ -366,7 +366,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/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/doc/html/xmerl_xs_examples.html 2025-02-26 17:28:45.509846652 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl_xs_examples.html 2025-02-26 17:28:45.509846652 +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/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/doc/html/xmerl_xsd.html 2025-02-26 17:28:45.533846871 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1/doc/html/xmerl_xsd.html 2025-02-26 17:28:45.533846871 +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.2.1-1.1.x86_64.rpm RPMS/erlang-jinterface-27.2.1-1.1.x86_64.rpm differ: char 225, line 1 Comparing erlang-jinterface-27.2.1-1.1.x86_64.rpm to erlang-jinterface-27.2.1-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 495da933faa5d1d4ca2111b7a5498a1451c25832152a5687627dd06e98ea3077 0 +/usr/lib64/erlang/lib/jinterface-1.14.1/priv/OtpErlang.jar 5fe0be4f214d87fa939af4c1b2d55d4097604a88f3042a6c981af187d9b8a487 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=2 (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.1/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.1/doc/html/kernel.epub/OEBPS/logger_disk_log_h.xhtml	2025-02-26 17:28:26.545673171 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/kernel.epub/OEBPS/logger_disk_log_h.xhtml	2025-02-26 17:28:26.565673355 +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.1/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.1/doc/html/kernel.epub/OEBPS/logger_filters.xhtml 2025-02-26 17:28:26.545673171 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/kernel.epub/OEBPS/logger_filters.xhtml 2025-02-26 17:28:26.565673355 +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.1/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.1/doc/html/kernel.epub/OEBPS/logger_std_h.xhtml 2025-02-26 17:28:26.545673171 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/kernel.epub/OEBPS/logger_std_h.xhtml 2025-02-26 17:28:26.565673355 +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.1/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.1/doc/html/kernel.epub/OEBPS/net.xhtml 2025-02-26 17:28:26.545673171 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/kernel.epub/OEBPS/net.xhtml 2025-02-26 17:28:26.565673355 +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.1/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.1/doc/html/kernel.epub/OEBPS/net_adm.xhtml 2025-02-26 17:28:26.545673171 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/kernel.epub/OEBPS/net_adm.xhtml 2025-02-26 17:28:26.565673355 +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.1/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.1/doc/html/kernel.epub/OEBPS/net_kernel.xhtml 2025-02-26 17:28:26.545673171 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/kernel.epub/OEBPS/net_kernel.xhtml 2025-02-26 17:28:26.565673355 +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.1/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.1/doc/html/kernel.epub/OEBPS/notes.xhtml 2025-02-26 17:28:26.545673171 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/kernel.epub/OEBPS/notes.xhtml 2025-02-26 17:28:26.565673355 +0000 @@ -3912,12 +3912,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.1/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.1/doc/html/kernel.epub/OEBPS/os.xhtml	2025-02-26 17:28:26.541673135 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/kernel.epub/OEBPS/os.xhtml	2025-02-26 17:28:26.561673318 +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.1/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.1/doc/html/kernel.epub/OEBPS/pg.xhtml 2025-02-26 17:28:26.541673135 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/kernel.epub/OEBPS/pg.xhtml 2025-02-26 17:28:26.561673318 +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.1/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.1/doc/html/kernel.epub/OEBPS/rpc.xhtml 2025-02-26 17:28:26.541673135 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/kernel.epub/OEBPS/rpc.xhtml 2025-02-26 17:28:26.561673318 +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.1/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.1/doc/html/kernel.epub/OEBPS/seq_trace.xhtml 2025-02-26 17:28:26.541673135 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/kernel.epub/OEBPS/seq_trace.xhtml 2025-02-26 17:28:26.561673318 +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.1/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.1/doc/html/kernel.epub/OEBPS/socket.xhtml 2025-02-26 17:28:26.541673135 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/kernel.epub/OEBPS/socket.xhtml 2025-02-26 17:28:26.561673318 +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).
        @@ -4730,7 +4730,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),
             :
      @@ -4894,7 +4894,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),
      @@ -4925,7 +4925,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),
      @@ -5022,7 +5022,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.

      /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/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.1/doc/html/kernel.epub/OEBPS/socket_usage.xhtml 2025-02-26 17:28:26.541673135 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/kernel.epub/OEBPS/socket_usage.xhtml 2025-02-26 17:28:26.557673281 +0000 @@ -81,47 +81,47 @@ Example

      This example is intended to show how to create a simple (echo) server -(and client).

      -module(example).
      +(and client).

      -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),
      +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.
       
       
      @@ -129,188 +129,188 @@
       
       %% === 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),
      -    receive
      -	{'DOWN', MRef, process, Pid, Info} ->
      -	    erlang:error({failed_starting_acceptor, Info});
      -	{Pid, started} ->
      +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} ->
       	    %% 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).
      +    acceptor_loop(LSock).
       
      -acceptor_loop(LSock) ->
      -    case socket:accept(LSock, infinity) of
      -	{ok, ASock} ->
      -	    start_handler(ASock),
      -	    acceptor_loop(LSock);
      -	{error, Reason} ->
      -	    erlang:error({accept_failed, Reason})
      +acceptor_loop(LSock) ->
      +    case socket:accept(LSock, infinity) of
      +	{ok, ASock} ->
      +	    start_handler(ASock),
      +	    acceptor_loop(LSock);
      +	{error, Reason} ->
      +	    erlang:error({accept_failed, Reason})
           end.
       
       
       %% --- Echo Server - Handler ---
       
      -start_handler(Sock) ->
      -    Self = self(),
      -    {Pid, MRef} = spawn_monitor(fun() -> handler_init(Self, Sock) end),
      -    receive
      -	{'DOWN', MRef, process, Pid, Info} ->
      -	    erlang:error({failed_starting_handler, Info});
      -	{Pid, started} ->
      +start_handler(Sock) ->
      /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/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.1/doc/html/kernel.epub/OEBPS/trace.xhtml	2025-02-26 17:28:26.537673099 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/kernel.epub/OEBPS/trace.xhtml	2025-02-26 17:28:26.557673281 +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

      @@ -1201,9 +1201,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 @@ -1254,10 +1254,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.1/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.1/doc/html/logger_chapter.html 2025-02-26 17:28:27.013677452 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/logger_chapter.html 2025-02-26 17:28:27.013677452 +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.1/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.1/doc/html/logger_cookbook.html	2025-02-26 17:28:27.041677708 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/logger_cookbook.html	2025-02-26 17:28:27.041677708 +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.1/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.1/doc/html/logger_disk_log_h.html	2025-02-26 17:28:27.057677855 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/logger_disk_log_h.html	2025-02-26 17:28:27.057677855 +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.1/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.1/doc/html/logger_filters.html 2025-02-26 17:28:27.077678038 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/logger_filters.html 2025-02-26 17:28:27.077678038 +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.1/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.1/doc/html/logger_formatter.html 2025-02-26 17:28:27.097678221 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/logger_formatter.html 2025-02-26 17:28:27.097678221 +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.1/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.1/doc/html/logger_handler.html 2025-02-26 17:28:27.117678404 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/logger_handler.html 2025-02-26 17:28:27.117678404 +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.1/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.1/doc/html/logger_std_h.html 2025-02-26 17:28:27.133678550 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/logger_std_h.html 2025-02-26 17:28:27.133678550 +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.1/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.1/doc/html/net.html 2025-02-26 17:28:27.161678807 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/net.html 2025-02-26 17:28:27.161678807 +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.1/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.1/doc/html/net_adm.html 2025-02-26 17:28:27.181678989 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/net_adm.html 2025-02-26 17:28:27.181678989 +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.1/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.1/doc/html/net_kernel.html 2025-02-26 17:28:27.205679210 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/net_kernel.html 2025-02-26 17:28:27.205679210 +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.1/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.1/doc/html/notes.html 2025-02-26 17:28:27.281679904 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/notes.html 2025-02-26 17:28:27.281679904 +0000 @@ -4016,12 +4016,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:
    @@ -4448,7 +4448,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/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.1/doc/html/os.html 2025-02-26 17:28:27.313680197 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/os.html 2025-02-26 17:28:27.313680197 +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.1/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.1/doc/html/pg.html 2025-02-26 17:28:27.337680416 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/pg.html 2025-02-26 17:28:27.337680416 +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.1/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.1/doc/html/rpc.html 2025-02-26 17:28:27.365680673 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/rpc.html 2025-02-26 17:28:27.365680673 +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.1/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/search.html 2025-02-26 17:28:27.381680819 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/search.html 2025-02-26 17:28:27.381680819 +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.1/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.1/doc/html/seq_trace.html 2025-02-26 17:28:27.405681038 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/seq_trace.html 2025-02-26 17:28:27.405681038 +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.1/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.1/doc/html/socket.html 2025-02-26 17:28:27.501681917 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/socket.html 2025-02-26 17:28:27.501681917 +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).
        @@ -4851,7 +4851,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),
             :
      @@ -5015,7 +5015,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),
      @@ -5046,7 +5046,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),
      @@ -5143,7 +5143,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.

      @@ -7349,7 +7349,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/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.1/doc/html/socket_usage.html 2025-02-26 17:28:27.533682209 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/socket_usage.html 2025-02-26 17:28:27.533682209 +0000 @@ -186,47 +186,47 @@ Example

      This example is intended to show how to create a simple (echo) server -(and client).

      -module(example).
      +(and client).

      -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),
      +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.
       
       
      @@ -234,188 +234,188 @@
       
       %% === 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).
      +    acceptor_loop(LSock).
       
      -acceptor_loop(LSock) ->
      -    case socket:accept(LSock, infinity) of
      -	{ok, ASock} ->
      -	    start_handler(ASock),
      -	    acceptor_loop(LSock);
      -	{error, Reason} ->
      -	    erlang:error({accept_failed, Reason})
      +acceptor_loop(LSock) ->
      +    case socket:accept(LSock, infinity) of
      +	{ok, ASock} ->
      +	    start_handler(ASock),
      +	    acceptor_loop(LSock);
      +	{error, Reason} ->
      +	    erlang:error({accept_failed, Reason})
           end.
       
       
       %% --- Echo Server - Handler ---
       
      -start_handler(Sock) ->
      -    Self = self(),
      -    {Pid, MRef} = spawn_monitor(fun() -> handler_init(Self, Sock) end),
      +start_handler(Sock) ->
      +    Self = self(),
      +    {Pid, MRef} = spawn_monitor(fun() -> handler_init(Self, Sock) end),
           receive
      -	{'DOWN', MRef, process, Pid, Info} ->
      -	    erlang:error({failed_starting_handler, Info});
      /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/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.1/doc/html/trace.html	2025-02-26 17:28:27.573682575 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/trace.html	2025-02-26 17:28:27.573682575 +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

      @@ -1322,9 +1322,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 @@ -1375,10 +1375,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="1482273583-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="6666164516-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 @@ -1524,7 +1524,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/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.1/doc/html/wrap_log_reader.html 2025-02-26 17:28:27.593682759 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.2.1/doc/html/wrap_log_reader.html 2025-02-26 17:28:27.593682759 +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/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/404.html 2025-02-26 17:28:27.609682905 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/404.html 2025-02-26 17:28:27.609682905 +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/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/api-reference.html 2025-02-26 17:28:27.625683051 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/api-reference.html 2025-02-26 17:28:27.625683051 +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/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/doc/html/megaco.epub/OEBPS/content.opf 2025-02-26 17:28:27.649683271 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco.epub/OEBPS/content.opf 2025-02-26 17:28:27.653683307 +0000 @@ -4,10 +4,10 @@ version="3.0"> megaco - 4.7 - urn:uuid:c8922e6b-b983-3dab-ca5f-0ddad4b70240 + urn:uuid:7aded77e-d958-6e36-0d7f-196fdf68cfcb en - 2025-02-26T17:22:41Z + 2041-03-31T06:42:02Z /usr/share/doc/packages/erlang-doc/lib/megaco-4.7/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/doc/html/megaco.epub/OEBPS/megaco.xhtml 2025-02-26 17:28:27.649683271 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco.epub/OEBPS/megaco.xhtml 2025-02-26 17:28:27.653683307 +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/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/doc/html/megaco.epub/OEBPS/megaco_debug.xhtml 2025-02-26 17:28:27.649683271 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco.epub/OEBPS/megaco_debug.xhtml 2025-02-26 17:28:27.653683307 +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/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/doc/html/megaco.epub/OEBPS/megaco_encode.xhtml 2025-02-26 17:28:27.645683234 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco.epub/OEBPS/megaco_encode.xhtml 2025-02-26 17:28:27.653683307 +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/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/doc/html/megaco.epub/OEBPS/megaco_examples.xhtml 2025-02-26 17:28:27.645683234 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco.epub/OEBPS/megaco_examples.xhtml 2025-02-26 17:28:27.653683307 +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/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/doc/html/megaco.epub/OEBPS/megaco_performance.xhtml 2025-02-26 17:28:27.645683234 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco.epub/OEBPS/megaco_performance.xhtml 2025-02-26 17:28:27.649683271 +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/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/doc/html/megaco.epub/OEBPS/megaco_user.xhtml 2025-02-26 17:28:27.645683234 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco.epub/OEBPS/megaco_user.xhtml 2025-02-26 17:28:27.649683271 +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/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/doc/html/megaco.html 2025-02-26 17:28:27.809684734 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco.html 2025-02-26 17:28:27.809684734 +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/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/doc/html/megaco_architecture.html 2025-02-26 17:28:27.829684918 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_architecture.html 2025-02-26 17:28:27.829684918 +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/doc/html/megaco_codec_meas.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_codec_meas.html 2025-02-26 17:28:27.845685064 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_codec_meas.html 2025-02-26 17:28:27.845685064 +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/doc/html/megaco_codec_mstone1.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_codec_mstone1.html 2025-02-26 17:28:27.865685246 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_codec_mstone1.html 2025-02-26 17:28:27.865685246 +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/doc/html/megaco_codec_mstone2.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_codec_mstone2.html 2025-02-26 17:28:27.881685393 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_codec_mstone2.html 2025-02-26 17:28:27.881685393 +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/doc/html/megaco_codec_transform.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_codec_transform.html 2025-02-26 17:28:27.897685539 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_codec_transform.html 2025-02-26 17:28:27.897685539 +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/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/doc/html/megaco_debug.html 2025-02-26 17:28:27.913685686 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_debug.html 2025-02-26 17:28:27.913685686 +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/doc/html/megaco_digit_map.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_digit_map.html 2025-02-26 17:28:27.933685868 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_digit_map.html 2025-02-26 17:28:27.933685868 +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/doc/html/megaco_edist_compress.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_edist_compress.html 2025-02-26 17:28:27.949686015 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_edist_compress.html 2025-02-26 17:28:27.949686015 +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/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/doc/html/megaco_encode.html 2025-02-26 17:28:27.969686198 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_encode.html 2025-02-26 17:28:27.969686198 +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/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/doc/html/megaco_encoder.html 2025-02-26 17:28:27.993686418 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_encoder.html 2025-02-26 17:28:27.993686418 +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/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/doc/html/megaco_examples.html 2025-02-26 17:28:28.009686564 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_examples.html 2025-02-26 17:28:28.013686600 +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/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/doc/html/megaco_flex_scanner.html 2025-02-26 17:28:28.029686747 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_flex_scanner.html 2025-02-26 17:28:28.029686747 +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/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/doc/html/megaco_intro.html 2025-02-26 17:28:28.045686893 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_intro.html 2025-02-26 17:28:28.045686893 +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/doc/html/megaco_mib.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_mib.html 2025-02-26 17:28:28.061687040 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_mib.html 2025-02-26 17:28:28.061687040 +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/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/doc/html/megaco_performance.html 2025-02-26 17:28:28.077687186 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_performance.html 2025-02-26 17:28:28.077687186 +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/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/doc/html/megaco_run.html 2025-02-26 17:28:28.097687369 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_run.html 2025-02-26 17:28:28.097687369 +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/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/doc/html/megaco_sdp.html 2025-02-26 17:28:28.117687552 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_sdp.html 2025-02-26 17:28:28.117687552 +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/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/doc/html/megaco_tcp.html 2025-02-26 17:28:28.141687771 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_tcp.html 2025-02-26 17:28:28.141687771 +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/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/doc/html/megaco_transport.html 2025-02-26 17:28:28.157687918 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_transport.html 2025-02-26 17:28:28.157687918 +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/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/doc/html/megaco_transport_mechanisms.html 2025-02-26 17:28:28.173688064 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_transport_mechanisms.html 2025-02-26 17:28:28.173688064 +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/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/doc/html/megaco_udp.html 2025-02-26 17:28:28.193688248 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_udp.html 2025-02-26 17:28:28.193688248 +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/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/doc/html/megaco_user.html 2025-02-26 17:28:28.225688540 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/megaco_user.html 2025-02-26 17:28:28.225688540 +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/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/doc/html/notes.html 2025-02-26 17:28:28.249688760 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/notes.html 2025-02-26 17:28:28.249688760 +0000 @@ -996,7 +996,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/search.html 2025-02-26 17:28:28.265688906 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.7/doc/html/search.html 2025-02-26 17:28:28.265688906 +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.3/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/404.html 2025-02-26 17:28:28.281689052 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/404.html 2025-02-26 17:28:28.281689052 +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.3/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/api-reference.html 2025-02-26 17:28:28.297689198 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/api-reference.html 2025-02-26 17:28:28.297689198 +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.3/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.3/doc/html/mnesia.epub/OEBPS/content.opf 2025-02-26 17:28:28.325689455 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia.epub/OEBPS/content.opf 2025-02-26 17:28:28.329689492 +0000 @@ -4,10 +4,10 @@ version="3.0"> mnesia - 4.23.3 - urn:uuid:6d5de6e9-9657-f205-3af6-2297497a34ef + urn:uuid:c030f92b-b176-0897-f3c4-d297b5c83b07 en - 2025-02-26T17:22:24Z + 2041-03-31T06:41:47Z /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/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.3/doc/html/mnesia.epub/OEBPS/mnesia.xhtml 2025-02-26 17:28:28.325689455 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia.epub/OEBPS/mnesia.xhtml 2025-02-26 17:28:28.329689492 +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.3/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.3/doc/html/mnesia.epub/OEBPS/mnesia_app_a.xhtml 2025-02-26 17:28:28.321689418 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia.epub/OEBPS/mnesia_app_a.xhtml 2025-02-26 17:28:28.329689492 +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.3/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.3/doc/html/mnesia.epub/OEBPS/mnesia_app_b.xhtml 2025-02-26 17:28:28.321689418 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia.epub/OEBPS/mnesia_app_b.xhtml 2025-02-26 17:28:28.329689492 +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,230 +38,230 @@
     	 foldl/6, foldr/6, table_info/4,
     	 first/3, next/4, prev/4, last/3,
     	 clear_table/4
    -       ]).
    %% Callback functions which provides transparent
    +       ]).
    %% 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).
    +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(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).
    +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).
    +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).
    +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, LockKind) ->
    +    do_select(ActivityId, Opaque, Tab, MatchSpec, LockKind).
     
     
    -select(ActivityId, Opaque, Tab, MatchSpec, Limit, LockKind) ->
    -    init_select(ActivityId, Opaque, Tab, MatchSpec, Limit, LockKind).
    +select(ActivityId, Opaque, Tab, MatchSpec, Limit, LockKind) ->
    +    init_select(ActivityId, Opaque, Tab, MatchSpec, Limit, LockKind).
     
     
    -all_keys(ActivityId, Opaque, Tab, LockKind) ->
    -    Match = [mnesia:all_keys(ActivityId, Opaque, Frag, LockKind)
    -	     || Frag <- frag_names(Tab)],
    -    lists:append(Match).
    +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 ->
    -	    SumFun = fun({_, Size}, Acc) -> Acc + Size end,
    -	    lists:foldl(SumFun, 0, frag_memory(ActivityId, Opaque, Tab));
    +	    SumFun = fun({_, Size}, Acc) -> Acc + Size end,
    +	    lists:foldl(SumFun, 0, frag_memory(ActivityId, Opaque, Tab));
     	base_table ->
    -	    lookup_prop(Tab, base_table);
    +	    lookup_prop(Tab, base_table);
     	node_pool ->
    -	    lookup_prop(Tab, node_pool);
    +	    lookup_prop(Tab, node_pool);
     	n_fragments ->
    -	    FH = lookup_frag_hash(Tab),
    +	    FH = lookup_frag_hash(Tab),
     	    FH#frag_state.n_fragments;
     	foreign_key ->
    -	    FH = lookup_frag_hash(Tab),
    +	    FH = lookup_frag_hash(Tab),
     	    FH#frag_state.foreign_key;
     	foreigners ->
    -	    lookup_foreigners(Tab);
    +	    lookup_foreigners(Tab);
     	n_ram_copies ->
    -	    length(val({Tab, ram_copies}));
    +	    length(val({Tab, ram_copies}));
     	n_disc_copies ->
    -	    length(val({Tab, disc_copies}));
    +	    length(val({Tab, disc_copies}));
     	n_disc_only_copies ->
    -	    length(val({Tab, disc_only_copies}));
    +	    length(val({Tab, disc_only_copies}));
     	n_external_copies ->
    /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/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.3/doc/html/mnesia.epub/OEBPS/mnesia_app_c.xhtml	2025-02-26 17:28:28.321689418 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia.epub/OEBPS/mnesia_app_c.xhtml	2025-02-26 17:28:28.329689492 +0000
    @@ -26,136 +26,136 @@
       
       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.3/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.3/doc/html/mnesia.epub/OEBPS/mnesia_chap2.xhtml	2025-02-26 17:28:28.321689418 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia.epub/OEBPS/mnesia_chap2.xhtml	2025-02-26 17:28:28.329689492 +0000
    @@ -32,21 +32,21 @@
     
     

    This section provides a simplified demonstration of a Mnesia system startup. The dialogue from the Erlang shell is as follows:

    unix> erl -mnesia dir '"/tmp/funky"'
    -Erlang (BEAM) emulator version 4.9
    +Erlang (BEAM) emulator version 4.9
     
    -Eshell V4.9  (abort with ^G)
    +Eshell V4.9  (abort with ^G)
     1>
    -1> mnesia:create_schema([node()]).
    +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 <---
    ----> Pending (remote) transactions <---
    ----> Active (local) transactions <---
    +---> Pending (remote) transactions <---
    +---> Active (local) transactions <---
     ---> Uncertain transactions <---
     ---> Active tables <---
     funky          : with 0 records occupying 269 words of mem
    @@ -54,17 +54,17 @@
     ===> System info in version "1.0", debug level = none <===
     opt_disc. Directory "/tmp/funky" is used.
     use fall-back at restart = false
    -running db nodes = [nonode@nohost]
    -stopped db nodes = []
    -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 = []
    +remote           = []
    +ram_copies       = [funky]
    +disc_copies      = [schema]
    +disc_only_copies = []
    +[{nonode@nohost,disc_copies}] = [schema]
    +[{nonode@nohost,ram_copies}] = [funky]
     1 transactions committed, 0 aborted, 0 restarted, 1 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, ArgList) 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 (BEAM) emulator version 4.9
      +Erlang (BEAM) emulator version 4.9
       
      -Eshell V4.9  (abort with ^G)
      -1> mnesia:create_schema([node()]).
      +Eshell V4.9  (abort with ^G)
      +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,13 +197,13 @@ 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 <---
    ----> Pending (remote) transactions <---
    ----> Active (local) transactions <---
    +---> Pending (remote) transactions <---
    +---> Active (local) transactions <---
     ---> Uncertain transactions <---
     ---> Active tables <---
     in_proj        : with 0 records occuping 269 words of mem
    @@ -216,19 +216,19 @@
     ===> System info in version "1.0", debug level = none <===
     opt_disc. Directory "/ldisc/scratch/Mnesia.Company" is used.
     use fall-back at restart = false
    -running db nodes = [nonode@nohost]
    -stopped db nodes = []
    -remote           = []
    +running db nodes = [nonode@nohost]
    +stopped db nodes = []
    +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]
    +    [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]
     6 transactions committed, 0 aborted, 0 restarted, 6 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, ArgList) creates the required database tables. The options available with ArgList are explained in @@ -242,32 +242,32 @@ /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/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.3/doc/html/mnesia.epub/OEBPS/mnesia_chap3.xhtml 2025-02-26 17:28:28.321689418 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia.epub/OEBPS/mnesia_chap3.xhtml 2025-02-26 17:28:28.329689492 +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.3/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.3/doc/html/mnesia.epub/OEBPS/mnesia_chap4.xhtml 2025-02-26 17:28:28.321689418 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia.epub/OEBPS/mnesia_chap4.xhtml 2025-02-26 17:28:28.325689455 +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.3/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.3/doc/html/mnesia.epub/OEBPS/mnesia_chap5.xhtml	2025-02-26 17:28:28.321689418 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia.epub/OEBPS/mnesia_chap5.xhtml	2025-02-26 17:28:28.325689455 +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 V4.7.3.3  (abort with ^G)
        -(a@sam)1> mnesia:start().
        +fragmented table and how more fragments are added later:

        Eshell V4.7.3.3  (abort with ^G)
        +(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},
        - {n_doubles,0},
        - {n_fragments,1},
        - {next_n_to_split,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},
        + {n_doubles,0},
        + {n_fragments,1},
        + {next_n_to_split,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,64},
        - {dictionary_frag2,64},
        - {dictionary_frag3,64},
        - {dictionary_frag4,64}]
        -(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,64}, + {dictionary_frag2,64}, + {dictionary_frag3,64}, + {dictionary_frag4,64}] +(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 V4.7.3.3  (abort with ^G)
        -(a@sam)1> mnesia:start().
        +Default is undefined.

        Eshell V4.7.3.3  (abort with ^G)
        +(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},
        -(a@sam)5>                      {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},
        +(a@sam)5>                      {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,0},
        - {prim_dict_frag4,1},
        - {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,0},
        - {sec_dict_frag4,1},
        - {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.3/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.3/doc/html/mnesia.epub/OEBPS/mnesia_chap7.xhtml 2025-02-26 17:28:28.317689382 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia.epub/OEBPS/mnesia_chap7.xhtml 2025-02-26 17:28:28.325689455 +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 (BEAM) emulator version 4.9
      +database:

      % erl -sname klacke -mnesia dir '"/ldisc/scratch/klacke"'
      Erlang (BEAM) emulator version 4.9
       
      -Eshell V4.9  (abort with ^G)
      -(klacke@gin)1> mnesia:create_schema([node()]).
      +Eshell V4.9  (abort with ^G)
      +(klacke@gin)1> mnesia:create_schema([node()]).
       ok
      -(klacke@gin)2>
      +(klacke@gin)2>
       ^Z
       Suspended

      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,40 +429,40 @@ 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, db_nodes, Nodes}, Acc) ->
      -                {[{schema, db_nodes, lists:map(Switch,Nodes)}], Acc};
      -           ({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, db_nodes, Nodes}, Acc) ->
      +                {[{schema, db_nodes, lists:map(Switch,Nodes)}], Acc};
      +           ({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.3/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.3/doc/html/mnesia.epub/OEBPS/mnesia_registry.xhtml 2025-02-26 17:28:28.317689382 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia.epub/OEBPS/mnesia_registry.xhtml 2025-02-26 17:28:28.325689455 +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.3/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.3/doc/html/mnesia.html 2025-02-26 17:28:28.529691321 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia.html 2025-02-26 17:28:28.529691321 +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.3/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.3/doc/html/mnesia_app_a.html 2025-02-26 17:28:28.557691577 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_app_a.html 2025-02-26 17:28:28.557691577 +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.3/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.3/doc/html/mnesia_app_b.html 2025-02-26 17:28:28.581691797 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_app_b.html 2025-02-26 17:28:28.581691797 +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,230 +143,230 @@
     	 foldl/6, foldr/6, table_info/4,
     	 first/3, next/4, prev/4, last/3,
     	 clear_table/4
    -       ]).
    %% Callback functions which provides transparent
    +       ]).
    %% 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).
    +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(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).
    +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).
    +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).
    +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, LockKind) ->
    +    do_select(ActivityId, Opaque, Tab, MatchSpec, LockKind).
     
     
    -select(ActivityId, Opaque, Tab, MatchSpec, Limit, LockKind) ->
    -    init_select(ActivityId, Opaque, Tab, MatchSpec, Limit, LockKind).
    +select(ActivityId, Opaque, Tab, MatchSpec, Limit, LockKind) ->
    +    init_select(ActivityId, Opaque, Tab, MatchSpec, Limit, LockKind).
     
     
    -all_keys(ActivityId, Opaque, Tab, LockKind) ->
    -    Match = [mnesia:all_keys(ActivityId, Opaque, Frag, LockKind)
    -	     || Frag <- frag_names(Tab)],
    -    lists:append(Match).
    +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 ->
    -	    SumFun = fun({_, Size}, Acc) -> Acc + Size end,
    -	    lists:foldl(SumFun, 0, frag_memory(ActivityId, Opaque, Tab));
    +	    SumFun = fun({_, Size}, Acc) -> Acc + Size end,
    +	    lists:foldl(SumFun, 0, frag_memory(ActivityId, Opaque, Tab));
     	base_table ->
    -	    lookup_prop(Tab, base_table);
    +	    lookup_prop(Tab, base_table);
     	node_pool ->
    -	    lookup_prop(Tab, node_pool);
    +	    lookup_prop(Tab, node_pool);
     	n_fragments ->
    -	    FH = lookup_frag_hash(Tab),
    +	    FH = lookup_frag_hash(Tab),
     	    FH#frag_state.n_fragments;
     	foreign_key ->
    -	    FH = lookup_frag_hash(Tab),
    +	    FH = lookup_frag_hash(Tab),
     	    FH#frag_state.foreign_key;
     	foreigners ->
    -	    lookup_foreigners(Tab);
    +	    lookup_foreigners(Tab);
     	n_ram_copies ->
    -	    length(val({Tab, ram_copies}));
    +	    length(val({Tab, ram_copies}));
     	n_disc_copies ->
    -	    length(val({Tab, disc_copies}));
    +	    length(val({Tab, disc_copies}));
     	n_disc_only_copies ->
    -	    length(val({Tab, disc_only_copies}));
    +	    length(val({Tab, disc_only_copies}));
     	n_external_copies ->
    /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/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.3/doc/html/mnesia_app_c.html	2025-02-26 17:28:28.605692016 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_app_c.html	2025-02-26 17:28:28.605692016 +0000
    @@ -131,136 +131,136 @@
       
       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.3/doc/html/mnesia_chap1.html differs (HTML document, UTF-8 Unicode text)
    --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_chap1.html	2025-02-26 17:28:28.621692163 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_chap1.html	2025-02-26 17:28:28.621692163 +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.3/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.3/doc/html/mnesia_chap2.html 2025-02-26 17:28:28.649692419 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_chap2.html 2025-02-26 17:28:28.649692419 +0000 @@ -137,21 +137,21 @@

    This section provides a simplified demonstration of a Mnesia system startup. The dialogue from the Erlang shell is as follows:

    unix> erl -mnesia dir '"/tmp/funky"'
    -Erlang (BEAM) emulator version 4.9
    +Erlang (BEAM) emulator version 4.9
     
    -Eshell V4.9  (abort with ^G)
    +Eshell V4.9  (abort with ^G)
     1>
    -1> mnesia:create_schema([node()]).
    +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 <---
    ----> Pending (remote) transactions <---
    ----> Active (local) transactions <---
    +---> Pending (remote) transactions <---
    +---> Active (local) transactions <---
     ---> Uncertain transactions <---
     ---> Active tables <---
     funky          : with 0 records occupying 269 words of mem
    @@ -159,17 +159,17 @@
     ===> System info in version "1.0", debug level = none <===
     opt_disc. Directory "/tmp/funky" is used.
     use fall-back at restart = false
    -running db nodes = [nonode@nohost]
    -stopped db nodes = []
    -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 = []
    +remote           = []
    +ram_copies       = [funky]
    +disc_copies      = [schema]
    +disc_only_copies = []
    +[{nonode@nohost,disc_copies}] = [schema]
    +[{nonode@nohost,ram_copies}] = [funky]
     1 transactions committed, 0 aborted, 0 restarted, 1 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, ArgList) 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 (BEAM) emulator version 4.9
      +Erlang (BEAM) emulator version 4.9
       
      -Eshell V4.9  (abort with ^G)
      -1> mnesia:create_schema([node()]).
      +Eshell V4.9  (abort with ^G)
      +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,13 +302,13 @@ 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 <---
    ----> Pending (remote) transactions <---
    ----> Active (local) transactions <---
    +---> Pending (remote) transactions <---
    +---> Active (local) transactions <---
     ---> Uncertain transactions <---
     ---> Active tables <---
     in_proj        : with 0 records occuping 269 words of mem
    @@ -321,19 +321,19 @@
     ===> System info in version "1.0", debug level = none <===
     opt_disc. Directory "/ldisc/scratch/Mnesia.Company" is used.
     use fall-back at restart = false
    -running db nodes = [nonode@nohost]
    -stopped db nodes = []
    -remote           = []
    +running db nodes = [nonode@nohost]
    +stopped db nodes = []
    +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]
    +    [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]
     6 transactions committed, 0 aborted, 0 restarted, 6 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, ArgList) creates the required database tables. The options available with ArgList are explained in @@ -347,32 +347,32 @@ /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/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.3/doc/html/mnesia_chap3.html 2025-02-26 17:28:28.673692638 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_chap3.html 2025-02-26 17:28:28.673692638 +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.3/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.3/doc/html/mnesia_chap4.html 2025-02-26 17:28:28.705692931 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_chap4.html 2025-02-26 17:28:28.705692931 +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.3/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.3/doc/html/mnesia_chap5.html	2025-02-26 17:28:28.741693260 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_chap5.html	2025-02-26 17:28:28.741693260 +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 V4.7.3.3  (abort with ^G)
        -(a@sam)1> mnesia:start().
        +fragmented table and how more fragments are added later:

        Eshell V4.7.3.3  (abort with ^G)
        +(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},
        - {n_doubles,0},
        - {n_fragments,1},
        - {next_n_to_split,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},
        + {n_doubles,0},
        + {n_fragments,1},
        + {next_n_to_split,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,64},
        - {dictionary_frag2,64},
        - {dictionary_frag3,64},
        - {dictionary_frag4,64}]
        -(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,64}, + {dictionary_frag2,64}, + {dictionary_frag3,64}, + {dictionary_frag4,64}] +(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 V4.7.3.3  (abort with ^G)
        -(a@sam)1> mnesia:start().
        +Default is undefined.

        Eshell V4.7.3.3  (abort with ^G)
        +(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},
        -(a@sam)5>                      {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},
        +(a@sam)5>                      {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,0},
        - {prim_dict_frag4,1},
        - {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,0},
        - {sec_dict_frag4,1},
        - {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.3/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.3/doc/html/mnesia_chap7.html 2025-02-26 17:28:28.765693479 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_chap7.html 2025-02-26 17:28:28.769693516 +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 (BEAM) emulator version 4.9
      +database:

      % erl -sname klacke -mnesia dir '"/ldisc/scratch/klacke"'
      Erlang (BEAM) emulator version 4.9
       
      -Eshell V4.9  (abort with ^G)
      -(klacke@gin)1> mnesia:create_schema([node()]).
      +Eshell V4.9  (abort with ^G)
      +(klacke@gin)1> mnesia:create_schema([node()]).
       ok
      -(klacke@gin)2>
      +(klacke@gin)2>
       ^Z
       Suspended

      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,40 +534,40 @@ 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, db_nodes, Nodes}, Acc) ->
      -                {[{schema, db_nodes, lists:map(Switch,Nodes)}], Acc};
      -           ({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, db_nodes, Nodes}, Acc) ->
      +                {[{schema, db_nodes, lists:map(Switch,Nodes)}], Acc};
      +           ({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).

      @@ -710,7 +710,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_chap8.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_chap8.html 2025-02-26 17:28:28.785693663 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_chap8.html 2025-02-26 17:28:28.785693663 +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.3/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.3/doc/html/mnesia_frag_hash.html 2025-02-26 17:28:28.801693809 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_frag_hash.html 2025-02-26 17:28:28.805693845 +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.3/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.3/doc/html/mnesia_overview.html 2025-02-26 17:28:28.821693992 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_overview.html 2025-02-26 17:28:28.821693992 +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.3/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.3/doc/html/mnesia_registry.html 2025-02-26 17:28:28.837694138 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/mnesia_registry.html 2025-02-26 17:28:28.837694138 +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.3/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.3/doc/html/notes.html 2025-02-26 17:28:28.865694394 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/notes.html 2025-02-26 17:28:28.865694394 +0000 @@ -1515,7 +1515,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/search.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/search.html 2025-02-26 17:28:28.881694541 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.23.3/doc/html/search.html 2025-02-26 17:28:28.881694541 +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-02-26 17:28:28.893694650 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/404.html 2025-02-26 17:28:28.893694650 +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-02-26 17:28:28.909694797 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/api-reference.html 2025-02-26 17:28:28.909694797 +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-02-26 17:28:28.925694943 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/cdv_cmd.html 2025-02-26 17:28:28.925694943 +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-02-26 17:28:28.949695163 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/crashdump_ug.html 2025-02-26 17:28:28.949695163 +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-02-26 17:28:28.965695309 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/crashdump_viewer.html 2025-02-26 17:28:28.965695309 +0000 @@ -303,7 +303,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/observer-2.17/doc/html/dist/search_data-227F454E.js Missing in old package: /usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/dist/search_data-227F454E.js /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-02-26 17:28:28.985695493 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/etop.html 2025-02-26 17:28:28.985695493 +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-02-26 17:28:29.001695638 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/etop_ug.html 2025-02-26 17:28:29.001695638 +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-02-26 17:28:29.017695785 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/introduction_ug.html 2025-02-26 17:28:29.017695785 +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-02-26 17:28:29.045696041 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/notes.html 2025-02-26 17:28:29.045696041 +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-02-26 17:28:29.065696224 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer.epub/OEBPS/content.opf 2025-02-26 17:28:29.069696260 +0000 @@ -4,10 +4,10 @@ version="3.0"> observer - 2.17 - urn:uuid:07333316-ebcc-06bd-b72c-666ddff4cc37 + urn:uuid:094a6506-90b9-bd10-48df-10cb58d2e22f en - 2025-02-26T17:22:35Z + 2041-03-31T06:41:57Z /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-02-26 17:28:29.065696224 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer.epub/OEBPS/ttb.xhtml 2025-02-26 17:28:29.069696260 +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-02-26 17:28:29.065696224 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer.epub/OEBPS/ttb_ug.xhtml 2025-02-26 17:28:29.069696260 +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-02-26 17:28:29.133696846 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer.html	2025-02-26 17:28:29.133696846 +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-02-26 17:28:29.149696993 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer_app.html 2025-02-26 17:28:29.149696993 +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-02-26 17:28:29.169697175 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/observer_ug.html 2025-02-26 17:28:29.169697175 +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-02-26 17:28:29.185697322 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/search.html 2025-02-26 17:28:29.185697322 +0000 @@ -122,7 +122,7 @@
    - + /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-02-26 17:28:29.225697688 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/ttb.html 2025-02-26 17:28:29.225697688 +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-02-26 17:28:29.261698018 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.17/doc/html/ttb_ug.html 2025-02-26 17:28:29.261698018 +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-02-26 17:28:29.277698164 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/404.html	2025-02-26 17:28:29.277698164 +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-02-26 17:28:29.293698310 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/api-reference.html 2025-02-26 17:28:29.293698310 +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-02-26 17:28:29.313698493 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/databases.html 2025-02-26 17:28:29.313698493 +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/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-02-26 17:28:29.329698640 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/error_handling.html 2025-02-26 17:28:29.329698640 +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-02-26 17:28:29.353698859 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/getting_started.html 2025-02-26 17:28:29.353698859 +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="0652548418-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="4543202187-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-02-26 17:28:29.369699005 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/introduction.html 2025-02-26 17:28:29.369699005 +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-02-26 17:28:29.393699224 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/notes.html 2025-02-26 17:28:29.397699261 +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-02-26 17:28:29.417699444 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/odbc.epub/OEBPS/content.opf 2025-02-26 17:28:29.421699481 +0000 @@ -4,10 +4,10 @@ version="3.0"> odbc - 2.15 - urn:uuid:085f20db-7a06-e661-0a78-b22dfbad7085 + urn:uuid:c9137589-6342-4168-de85-9c16691ce7e5 en - 2025-02-26T17:22:36Z + 2041-03-31T06:41:58Z /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-02-26 17:28:29.417699444 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/odbc.epub/OEBPS/getting_started.xhtml 2025-02-26 17:28:29.417699444 +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-02-26 17:28:29.477699993 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/odbc.html	2025-02-26 17:28:29.477699993 +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-02-26 17:28:29.493700139 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.15/doc/html/search.html 2025-02-26 17:28:29.493700139 +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/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-02-26 17:28:29.505700249 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/404.html 2025-02-26 17:28:29.505700249 +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-02-26 17:28:29.521700395 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/api-reference.html 2025-02-26 17:28:29.521700395 +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-02-26 17:28:29.541700579 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/cpu_sup.html 2025-02-26 17:28:29.541700579 +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-02-26 17:28:29.561700761 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/disksup.html 2025-02-26 17:28:29.561700761 +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-02-26 17:28:29.581700945 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/memsup.html 2025-02-26 17:28:29.581700945 +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-02-26 17:28:29.605701164 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/notes.html 2025-02-26 17:28:29.605701164 +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-02-26 17:28:29.625701347 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/nteventlog.html 2025-02-26 17:28:29.625701347 +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-02-26 17:28:29.645701530 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/os_mon.epub/OEBPS/content.opf 2025-02-26 17:28:29.649701567 +0000 @@ -4,10 +4,10 @@ version="3.0"> os_mon - 2.10.1 - urn:uuid:11f28689-9f90-4895-70ff-7962024a5c02 + urn:uuid:140dd628-801e-fb15-37be-19a5dc39bac4 en - 2025-02-26T17:22:27Z + 2041-03-31T06:41:50Z /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-02-26 17:28:29.685701896 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/os_mon_app.html 2025-02-26 17:28:29.685701896 +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-02-26 17:28:29.705702079 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/os_sup.html 2025-02-26 17:28:29.705702079 +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-02-26 17:28:29.717702189 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.10.1/doc/html/search.html 2025-02-26 17:28:29.717702189 +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-02-26 17:28:29.733702335 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/404.html 2025-02-26 17:28:29.733702335 +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-02-26 17:28:29.745702445 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/api-reference.html 2025-02-26 17:28:29.749702482 +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-02-26 17:28:29.773702701 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/leex.html 2025-02-26 17:28:29.773702701 +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-02-26 17:28:29.793702883 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/notes.html 2025-02-26 17:28:29.793702883 +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-02-26 17:28:29.817703104 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/parsetools.epub/OEBPS/content.opf 2025-02-26 17:28:29.817703104 +0000 @@ -4,10 +4,10 @@ version="3.0"> parsetools - 2.6 - urn:uuid:3317c861-9452-b02b-30de-6effe01b395b + urn:uuid:4966de44-9733-77cb-7579-293388900c06 en - 2025-02-26T17:21:36Z + 2041-03-31T06:41:03Z /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-02-26 17:28:29.813703067 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/parsetools.epub/OEBPS/leex.xhtml 2025-02-26 17:28:29.817703104 +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-02-26 17:28:29.813703067 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/parsetools.epub/OEBPS/yecc.xhtml 2025-02-26 17:28:29.817703104 +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-02-26 17:28:29.861703505 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/search.html 2025-02-26 17:28:29.861703505 +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-02-26 17:28:29.885703726 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.6/doc/html/yecc.html 2025-02-26 17:28:29.885703726 +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/doc/html/404.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/404.html 2025-02-26 17:28:29.901703872 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/404.html 2025-02-26 17:28:29.901703872 +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/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text) --- old//usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/api-reference.html 2025-02-26 17:28:29.917704018 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/api-reference.html 2025-02-26 17:28:29.917704018 +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/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/doc/html/notes.html 2025-02-26 17:28:29.945704274 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/notes.html 2025-02-26 17:28:29.945704274 +0000 @@ -1448,7 +1448,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/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/doc/html/public_key.epub/OEBPS/content.opf 2025-02-26 17:28:29.969704494 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/public_key.epub/OEBPS/content.opf 2025-02-26 17:28:29.969704494 +0000 @@ -4,10 +4,10 @@ version="3.0"> public_key - 1.17 - urn:uuid:433f862e-ce75-a623-0999-95f3a29d769a + urn:uuid:d428a47c-0aa8-56cf-a641-825a71c59b92 en - 2025-02-26T17:22:30Z + 2041-03-31T06:41:53Z /usr/share/doc/packages/erlang-doc/lib/public_key-1.17/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/doc/html/public_key.epub/OEBPS/public_key.xhtml 2025-02-26 17:28:29.965704457 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/public_key.epub/OEBPS/public_key.xhtml 2025-02-26 17:28:29.969704494 +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/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/doc/html/public_key.epub/OEBPS/public_key_records.xhtml 2025-02-26 17:28:29.965704457 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/public_key.epub/OEBPS/public_key_records.xhtml 2025-02-26 17:28:29.969704494 +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/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/doc/html/public_key.epub/OEBPS/using_public_key.xhtml	2025-02-26 17:28:29.965704457 +0000
          +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/public_key.epub/OEBPS/using_public_key.xhtml	2025-02-26 17:28:29.969704494 +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/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/doc/html/public_key.html	2025-02-26 17:28:30.077705482 +0000
          +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/public_key.html	2025-02-26 17:28:30.077705482 +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/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/doc/html/public_key_app.html 2025-02-26 17:28:30.097705664 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/public_key_app.html 2025-02-26 17:28:30.097705664 +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/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/doc/html/public_key_records.html 2025-02-26 17:28:30.121705885 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/public_key_records.html 2025-02-26 17:28:30.121705885 +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/doc/html/search.html differs (HTML document, UTF-8 Unicode text)
                --- old//usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/search.html	2025-02-26 17:28:30.137706031 +0000
                +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/search.html	2025-02-26 17:28:30.137706031 +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/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/doc/html/using_public_key.html 2025-02-26 17:28:30.173706360 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.17/doc/html/using_public_key.html 2025-02-26 17:28:30.173706360 +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-02-26 17:28:30.189706506 +0000
                +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/404.html	2025-02-26 17:28:30.189706506 +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-02-26 17:28:30.205706653 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/api-reference.html 2025-02-26 17:28:30.205706653 +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-02-26 17:28:30.229706872 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/notes.html 2025-02-26 17:28:30.229706872 +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-02-26 17:28:30.249707056 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool.epub/OEBPS/content.opf 2025-02-26 17:28:30.253707092 +0000 @@ -4,10 +4,10 @@ version="3.0"> reltool - 1.0.1 - urn:uuid:24a0c771-bdf4-c7af-80b2-1bcba06f38de + urn:uuid:9b87c89f-b22a-5f67-3d50-cf43b70ccdd6 en - 2025-02-26T17:22:22Z + 2041-03-31T06:41:45Z /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-02-26 17:28:30.249707056 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool.epub/OEBPS/reltool_examples.xhtml 2025-02-26 17:28:30.253707092 +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-02-26 17:28:30.317707678 +0000
                +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool.html	2025-02-26 17:28:30.321707714 +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-02-26 17:28:30.357708044 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool_examples.html 2025-02-26 17:28:30.357708044 +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-02-26 17:28:30.377708226 +0000
                +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool_intro.html	2025-02-26 17:28:30.381708263 +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-02-26 17:28:30.397708409 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/reltool_usage.html 2025-02-26 17:28:30.397708409 +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-02-26 17:28:30.413708556 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.1/doc/html/search.html 2025-02-26 17:28:30.413708556 +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-02-26 17:28:30.429708702 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/404.html 2025-02-26 17:28:30.429708702 +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-02-26 17:28:30.445708848 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/api-reference.html 2025-02-26 17:28:30.445708848 +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-02-26 17:28:30.505709397 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dbg.html 2025-02-26 17:28:30.505709397 +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}]}
                Missing in old package: /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dist/search_data-7F27CE3F.js
                Missing in old package: /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dist/search_data-7F27CE3F.js
                /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-02-26 17:28:30.529709616 +0000
                +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dtrace.html	2025-02-26 17:28:30.529709616 +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-02-26 17:28:30.553709837 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/dyntrace.html 2025-02-26 17:28:30.553709837 +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-02-26 17:28:30.577710056 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/instrument.html 2025-02-26 17:28:30.577710056 +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-02-26 17:28:30.601710275 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.1.1/doc/html/lttng.html 2025-02-26 17:28:30.601710275 +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>