)]}'
{
  "log": [
    {
      "commit": "bf20d2f7bce13c7d006a9ca442221399753bce9d",
      "tree": "62223b23c701bb5c47bab1b6e131deba39e81b69",
      "parents": [
        "40bc7dffb7a0ae319dba093809fc2f27a59ed8d1"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "laslo@hunhold.de",
        "time": "Wed Dec 24 08:08:54 2025 +0100"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "laslo@hunhold.de",
        "time": "Wed Dec 24 08:08:54 2025 +0100"
      },
      "message": "Bump version to 3.0.0\n\nWe need a major bump as the bidirectional API changed since the last\nrelease.\n\nThere need to be some refinements to some of the implementations for\nconformance, but overall it works reliably.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "40bc7dffb7a0ae319dba093809fc2f27a59ed8d1",
      "tree": "e533d67b6284033319b3e7a5b166a7ea2f16e9cd",
      "parents": [
        "2f5fb9740e29dd344ec8fbbcde966b71fcd3ffcf"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "laslo@hunhold.de",
        "time": "Wed Dec 24 08:05:10 2025 +0100"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "laslo@hunhold.de",
        "time": "Wed Dec 24 08:05:10 2025 +0100"
      },
      "message": "Update README\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "2f5fb9740e29dd344ec8fbbcde966b71fcd3ffcf",
      "tree": "45513a43103df239eecba2ab9567d156531b723d",
      "parents": [
        "748658dfe549d531cf615c61de7453f8ace92b2b"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "laslo@hunhold.de",
        "time": "Sun Nov 30 22:42:57 2025 +0100"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "laslo@hunhold.de",
        "time": "Sun Nov 30 22:42:57 2025 +0100"
      },
      "message": "Update Unicode data to version 17.0.0\n\nWhile some tests fail for the bidirectional and line segmentation\nalgorithms, the other algorithms pass all conformance tests.\n\nThus, overall, including the new data files brings a net-benefit.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "748658dfe549d531cf615c61de7453f8ace92b2b",
      "tree": "0bb13a0b2acc3f5db5a19b2f0581aea0c2737879",
      "parents": [
        "5c252ef6a4a7f82364bc59c2733d858c3c7927e0"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Oct 14 22:08:17 2025 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Oct 14 22:08:17 2025 +0200"
      },
      "message": "Rename .out.h to .gen.h\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "5c252ef6a4a7f82364bc59c2733d858c3c7927e0",
      "tree": "76510e59a2329c54405951b88887b09f85dbd93d",
      "parents": [
        "400ae9b5343687ebac8c1f3194197e792c34bfb4"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Oct 14 21:58:20 2025 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Oct 14 22:05:20 2025 +0200"
      },
      "message": "Fully rework LUT generation\n\nAs you may have noticed, libgrapheme currently is two versions behind\non Unicode. This is because they massively overhaul their algorithms\nwith each release, and the existing data model I developed came to\nits limits.\n\nFor each algorithm, it is necessary to extract properties from multiple\nfiles, and it is kind of a hack when two properties coincide,\ncomplicating the code.\n\nThe only solution was to fully rethink the data generation, including\nthe compression. Here\u0027s what\u0027s changed:\n\n\t1) Multiple properties are now possible, using a bitfield\n\t   approach\n\t2) Data compression is facilitated by a third dictionary stage.\n\t   For the provided first port of the character properties, we\n\t   reduce the LUT size from 35K to 23K, making it possible for\n\t   them to reside in L1, promising more performance.\n\t3) We don\u0027t need any of the ugly postprocessing, or magic\n\t   \u0027temporary\u0027 classes, etc., to work around the too stiff\n\t   data structures.\n\nThe old infrastructure remains in gen/, the new one is put in gen2/.\nOnce everything is fully ported, gen/ is removed and gen2/ renamed to\ngen/.\n\nOne after another, this will allow us to port libgrapheme to the latest\nUnicode version.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "400ae9b5343687ebac8c1f3194197e792c34bfb4",
      "tree": "09cb28e4de696b8cce927007733d47adf2cd8ff1",
      "parents": [
        "65b354f0fcb1d925f4340dbb4415ea06e8af2bec"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Oct 14 21:55:36 2025 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Oct 14 21:55:36 2025 +0200"
      },
      "message": "Update license\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "65b354f0fcb1d925f4340dbb4415ea06e8af2bec",
      "tree": "e3f1213073ec70e68502341496b7a8aa50ff05f0",
      "parents": [
        "3ee106e4ab1d5fe4696ab9089f052706d7cb9a48"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Sep 01 22:42:18 2024 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Sep 01 22:45:28 2024 +0200"
      },
      "message": "Update grapheme break algorithm to Unicode version 15.1.0\n\nWhile the change to the algorithm looks harmless in the specification,\nit comes at the price of more complexity because we have to keep track\nof a relatively complex state for a sequence of indic conjunct breaks.\n\nFortunately adding so many additional classes only decreases the\ncompression ratio for the grapheme cluster LUTs by ~0.5%.\n\nWe now pass all 1187 character tests.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "3ee106e4ab1d5fe4696ab9089f052706d7cb9a48",
      "tree": "bd5a1f538a3d9e218865e0047939cefa454b1e5e",
      "parents": [
        "f01674957f6816d55b8ed1b38a96c4ef5e3120b2"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Sep 01 17:04:18 2024 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Sep 01 17:04:18 2024 +0200"
      },
      "message": "Bump Unicode version and data to 15.1.0\n\nWith this commit we just add the updated Unicode data. Given the Unicode\nconsortium, again, fiddled with their algorithms it takes a few\nsubsequent commits to fully support Unicode 15.1.0. Unicode 16.0,\nscheduled to be released this month, should be a simple corollary; let\u0027s\nsee...\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "f01674957f6816d55b8ed1b38a96c4ef5e3120b2",
      "tree": "1896862e6f11f0a6f6769384d78f826b820872f1",
      "parents": [
        "d56ad5ac8ac47037a86d52e3445e3c5d4dc81a4b"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Sep 01 14:57:28 2024 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Sep 01 14:57:28 2024 +0200"
      },
      "message": "Don\u0027t warn about overlength strings in test data\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "d56ad5ac8ac47037a86d52e3445e3c5d4dc81a4b",
      "tree": "37f42309dc3147252428bf59807d5b55d4e6dcdd",
      "parents": [
        "c8b34aa04ac8702e55ba4b8946d6794c9c6056f5"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Sep 01 14:26:07 2024 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Sep 01 14:56:16 2024 +0200"
      },
      "message": "Fix typo in man/libgrapheme.sh\n\nThanks to Omar Polo \u003cop@omarpolo.com\u003e for reporting these!\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "c8b34aa04ac8702e55ba4b8946d6794c9c6056f5",
      "tree": "44d3f832b696ffd30c4a4badf3427e9d5521c6de",
      "parents": [
        "af792ebe99c6301fb5b5436f856b9589ad0fd5ea"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Fri Dec 01 09:37:28 2023 +0100"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Fri Dec 01 09:39:38 2023 +0100"
      },
      "message": "Close data file in parse_file_with_callback() at the end\n\nThis otherwise leads to build problems on macOS because of too many\nopen files due to leaked file descriptors.\n\nThank you, zeromake (https://blog.zeromake.com), for reporting this!\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "af792ebe99c6301fb5b5436f856b9589ad0fd5ea",
      "tree": "eeddb5bd73fcac582634f2d766e2dfbf8d9cd678",
      "parents": [
        "719d805b28b9e34d5f5e83fcbdb0fbb41c20ec6d"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Mon May 29 22:21:57 2023 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Mon May 29 22:21:57 2023 +0200"
      },
      "message": "Free generated mirror-LUT data structures to avoid memory leak\n\nThis is a technicality, but this satisfies the clang dynamic memory\nanalyzer.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "719d805b28b9e34d5f5e83fcbdb0fbb41c20ec6d",
      "tree": "f13446efe945c98ce1c983d01854688ba47e6878",
      "parents": [
        "a17b629bb30ac9c0e3e7343449dc42085bb2fc59"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Mon May 29 10:37:49 2023 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Mon May 29 10:37:49 2023 +0200"
      },
      "message": "Reflect mirroring in the bidi-tests\n\nThe bidi-tests do not contain mirrored test data, so we need to generate\nit ad-hoc using the generated mirror-LUTs.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "a17b629bb30ac9c0e3e7343449dc42085bb2fc59",
      "tree": "c034529cead8ed3c8969369625547eda8351a498",
      "parents": [
        "ba923230c7b25b0737d151c3f607a75b63676456"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Mon May 29 10:34:37 2023 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Mon May 29 10:34:37 2023 +0200"
      },
      "message": "Fix bidi-line-level-loop boundaries\n\nThe first change was caught using dynamic code analysis and prevents\naccess to uninitialized memory (it wouldn\u0027t be worse than that, though,\ngiven we do not access memory we are not allowed to and the consequences\nare harmless).\n\nThe second change was found by eyesight.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "ba923230c7b25b0737d151c3f607a75b63676456",
      "tree": "d3f368c65c2ee81a6b828f9201cf1f1482c9d8ec",
      "parents": [
        "c2aa140007c3fe8f6b58839668219e9c8414865b"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Mon May 29 08:37:11 2023 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Mon May 29 10:33:09 2023 +0200"
      },
      "message": "Silence strict casting warnings and apply bidi mirroring\n\nThe mirroring-part must have been accidentally dropped in one previous\nrefactoring.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "c2aa140007c3fe8f6b58839668219e9c8414865b",
      "tree": "34ed3960f5948cee49e2e50e1af7b6ee5567f354",
      "parents": [
        "98e8632689b89f9f25d2a7091e7315f7d48881bc"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Fri May 26 12:19:55 2023 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Fri May 26 12:19:55 2023 +0200"
      },
      "message": "Apply clang format\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "98e8632689b89f9f25d2a7091e7315f7d48881bc",
      "tree": "f7265ed437f91912ef2e0da6eb19eabc62d76722",
      "parents": [
        "4a4919e8764d3e88c4e33da537f42a0557a8bcf5"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Fri May 26 10:23:06 2023 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Fri May 26 10:23:06 2023 +0200"
      },
      "message": "Update Unicode data license\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "4a4919e8764d3e88c4e33da537f42a0557a8bcf5",
      "tree": "0204234b4cf68ef546ddb891776197bce9d62579",
      "parents": [
        "7ddf17bf2f20b598d204f32d441e8ea30765b577"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Fri May 26 10:20:32 2023 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Fri May 26 10:20:32 2023 +0200"
      },
      "message": "Properly parse reorder list\n\nIt worked all fine for the almost million conformance tests, except for\ntest number 490894, given its length exceeds 127 and thus the reorder\nlevels don\u0027t fit in a signed 8-bit-integer.\n\nThis is now fixed by making it 16 bits and making the parsing even\nstricter so we will not miss out on errors of this kind in this part of\nthe code again.\n\nWe now pass all the tests.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "7ddf17bf2f20b598d204f32d441e8ea30765b577",
      "tree": "7def3af3390ff4fc59d07e11fec8a8ac3a6cadd7",
      "parents": [
        "1815d4d8d141da580372c678c3e38fab0e948d52"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Fri May 26 10:02:58 2023 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Fri May 26 10:02:58 2023 +0200"
      },
      "message": "Add resolved paragraph direction to tests\n\nOnly the tests in BidiCharacterTests.txt specify the resolved direction,\nso we express the non-specification by using the\nneutral-direction-enum-type.\n\nRunning the tests, I noticed a small mistake I made, leading to the\nwrong resolved type being emitted. The final solution is to use a proper\nenum-return-type for the paragraph_level-function, which has been added\nas a TODO.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "1815d4d8d141da580372c678c3e38fab0e948d52",
      "tree": "60e10407b63aa35fc26b957213fc6fe670d554c1",
      "parents": [
        "52ee78ea80d51b163f7fc85e9387389266d2331b"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Fri May 26 09:53:24 2023 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Fri May 26 09:53:45 2023 +0200"
      },
      "message": "Update bidi tests to also check reordering\n\nWe already implemented the reordering extraction, which is why we\nonly needed to add the handling in the test-binary itself.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "52ee78ea80d51b163f7fc85e9387389266d2331b",
      "tree": "a86ac74ec4d4fce3403137b3d47eef7e7cfea8e3",
      "parents": [
        "77e30a69ce0807fbee01d43eebedda34b54f41af"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Fri May 26 09:40:10 2023 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Fri May 26 09:51:44 2023 +0200"
      },
      "message": "Refactor bidi and add reordering function\n\n- Rename bidi-override enum to bidi-direction, including entries. This\n  better reflects the general nature of it.\n- Remove UTF-8-related bidi-functions, given it would be too complicated\n  to reflect in an API and opens up some very difficult challenges.\n- Rename *_preprocess to *_preprocess_paragraph and return the resolved\n  paragraph embedding level as an optional out-parameter. This is the\n  only way to meaningfully handle large chunks of text with paragraphs\n  of different embedding levels.\n- Separate the get_paragraph_level() function into two for\n  isolated-paragraphs and whole paragraphs. This simplifies it a lot, as\n  we don\u0027t have the crazy bool-flag-mess any more.\n- Add a grapheme_bidirectional_reorder_line function that directly\n  operates on preprocessed data and returns the reordered string without\n  any additionally necessary buffering. For this the\n  get_line_embedding_levels had to be made a bit more general to allow\n  different ways of writing the levels into the output.\n  This function makes use of the mirror-LUT and has a small section\n  still commented out regarding the proper inversion of grapheme\n  clusters that will need more investigation.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "77e30a69ce0807fbee01d43eebedda34b54f41af",
      "tree": "0edb3b38d933d5bb60b0f14f98d9cce03f5671b4",
      "parents": [
        "f320b0ad8b7b2bc7ab5b63e91379012adbd19d12"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Wed May 24 18:05:39 2023 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Wed May 24 18:05:39 2023 +0200"
      },
      "message": "Add generating code for bidirectional character mirror mappings\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "f320b0ad8b7b2bc7ab5b63e91379012adbd19d12",
      "tree": "3a9137e5e90b2e3cb9fcd1b4c6b05fb95424226a",
      "parents": [
        "c0cab63c5300fa12284194fbef57aa2ed62a94c0"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Thu May 11 18:16:09 2023 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Thu May 11 18:16:09 2023 +0200"
      },
      "message": "Allow level-array to have different size from line length\n\nThis may not be apparent at first, but it allows you to only extract\nas many levels of a line as you need, e.g. only the first 10. Truncation\nis indicated by the return value being larger than levlen.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "c0cab63c5300fa12284194fbef57aa2ed62a94c0",
      "tree": "f19067d7ebdca4a82f621f3815ddbb5189c0b37f",
      "parents": [
        "c0d28c3cad5c9e02dfa93b3ff3e6953ad0f22d75"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Fri Feb 24 18:26:22 2023 +0100"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Fri Feb 24 18:26:22 2023 +0100"
      },
      "message": "Fix a small typo in configure\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "c0d28c3cad5c9e02dfa93b3ff3e6953ad0f22d75",
      "tree": "6dbdf7945ac45831d1c6c74e8ee97e47ed01e1eb",
      "parents": [
        "0e95e5c797b1dc41117e1ea5455f2a7f2932868d"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Fri Feb 24 18:21:02 2023 +0100"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Fri Feb 24 18:23:45 2023 +0100"
      },
      "message": "Replace all POSIX-features to become fully ISO-C99\n\nAs it turned out, the only things that needed replacing were\ngetline(), strdup() and the timing in the benchmarks. Analogously,\nwe replace -D_DEFAULT_SOURCE with -D_ISOC99_SOURCE.\n\nThis way we further extend the number of platforms where libgrapheme can\nbe compiled and run on, e.g. MSVC still does not include getline().\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "0e95e5c797b1dc41117e1ea5455f2a7f2932868d",
      "tree": "3244d1a4eca50383b5b85671c5f605b73a88daa4",
      "parents": [
        "53f5421ae389b0312bdcab1c715a03f175a58b07"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Thu Feb 23 23:16:46 2023 +0100"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Thu Feb 23 23:16:46 2023 +0100"
      },
      "message": "Port build system to MinGW-W64/Cygwin\n\nThis requires the ability to specify executable-suffixes. We trick a\nbit by not diving into the import library madness for MSVC and instead\nact as if we exported the import library \"libgrapheme.lib\", which\nhowever is just the static library.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "53f5421ae389b0312bdcab1c715a03f175a58b07",
      "tree": "6bce71d6b07a64224098e82a9b93bf63fd3713e4",
      "parents": [
        "bbbc72cba69445535dd035dfe1ee10d473655629"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Nov 29 23:45:10 2022 +0100"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Nov 29 23:45:10 2022 +0100"
      },
      "message": "Fix bidi purge loop logic a bit\n\nOtherwise you could skip one element by accident. This does not have\ndirect consequences, but may lead to slightly wrong behaviour when\nthere are stray opening brackets.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "bbbc72cba69445535dd035dfe1ee10d473655629",
      "tree": "f2bf6f27db1f75472057ecdc1eba1bca3d928e56",
      "parents": [
        "b9e1d4bbd4ce6a539999560c1cc863b645a080cd"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Nov 29 23:23:53 2022 +0100"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Nov 29 23:23:53 2022 +0100"
      },
      "message": "Implement bidirectional bracket support\n\nThe single rule N0 in the Unicode Bidirectional Algorithm may not\nsound like much, but it packs quite a punch and required some deep\nwork.\n\nIt wasn\u0027t exactly made simpler by the fact that the document is very\nconvoluted and not easy to follow. However, it helps to have experience\nfrom the other algorithms and the automatic tests allow very broad\nconfirmation of proper function.\n\nIn particular, the following changes needed to be made: The generator\nhad to be modified to\n\n\t- Implement a decompositon to match canonically equivalent\n\t  brackets. This requires us to have UnicodeData.txt present,\n\t  but what matters is that the end result is fast and small.\n\t- The LUT-printing automatically detects type, because it\u0027s just\n\t  too fragile otherwise.\n\nThe implementation of the algorithm itself had the following changes:\n\n\t- The last strong type property of an isolate runner has been\n\t  refactored to be stateless. Otherwise, you can end up with\n\t  subtle bugs where strong types are added beforehand, yielding\n\t  a TOCTOU-problem.\n\t- The bracket parsing makes use of a novel FIFO structure that\n\t  combines the best of both worlds between a stack and naive\n\t  implementation.\n\nAs an end result, we now pass all ~900k bidi tests from the Unicode\nstandard.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "b9e1d4bbd4ce6a539999560c1cc863b645a080cd",
      "tree": "0500d8a836f3fe8cfaa4a7e262abcd870ffd5a88",
      "parents": [
        "0d043e0a0cd062ea09d8238b33a97049fea9bc8b"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Thu Nov 24 13:29:31 2022 +0100"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Thu Nov 24 15:51:06 2022 +0100"
      },
      "message": "Do not falsely read entire buffer instead of simply the filled with\n\nThis was caught via dynamic analysis (clang asan), which I can definitely\nrecommend.\n\nRust evangelists might see this as a prime example for why C is bad, but\nI still think the benefits outweigh the risks if you consider the\nmaturity of tooling to catch these kinds of errors. In an ideal world we\nwould all be programming in Ada, but C\u0027s portability is unmatched.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "0d043e0a0cd062ea09d8238b33a97049fea9bc8b",
      "tree": "f0c55e38d812b8b1e4e2c90ad3d8df0e98edffe4",
      "parents": [
        "4e43b1bc0e0e50f883ed25b1e542828529006216"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Thu Nov 24 13:29:10 2022 +0100"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Thu Nov 24 13:29:10 2022 +0100"
      },
      "message": "Apply format\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "4e43b1bc0e0e50f883ed25b1e542828529006216",
      "tree": "fa0fb0bc540e1b0a3136c5d93ecc0b4d8d67b98f",
      "parents": [
        "ea1be565ad117a3e9846ae0e855d41021d94ee8a"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Mon Nov 21 12:34:22 2022 +0100"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Mon Nov 21 12:34:22 2022 +0100"
      },
      "message": "Add \"check\" target to .PHONY\n\nThanks to Tom Schwindl for noticing this!\n"
    },
    {
      "commit": "ea1be565ad117a3e9846ae0e855d41021d94ee8a",
      "tree": "f246ca9097eec1929557c9665003325d66d46f6b",
      "parents": [
        "f517655a98a155694cf57c180531724baa081c26"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Mon Nov 21 11:05:26 2022 +0100"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Mon Nov 21 11:06:37 2022 +0100"
      },
      "message": "Refactor state into unsigned integer\n\nNow that we separated the level-determination itself, there\nis no need to have a signed integer for this purpose. This\nsimplifies the masking.\n"
    },
    {
      "commit": "f517655a98a155694cf57c180531724baa081c26",
      "tree": "a60306a39b0c71a47ae9a1568411d7db78f6e802",
      "parents": [
        "07ba2622e073850bbdd6acd8dff88b391cc5ad5c"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Mon Nov 21 09:46:38 2022 +0100"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Mon Nov 21 09:46:38 2022 +0100"
      },
      "message": "Implement bidirectional rule L1.4\n\nFor this, we first make use of our paragraph level slot in each\ndata point and store it for each. This way, even if the data\nbuffer is arbitrarily split up, we always know what the current\nparagraph level is.\n\nSecondly, we add the rule L1.4 itself, which is very similar to\nthe existing implementation of rules L1.1-L1.3.\n"
    },
    {
      "commit": "07ba2622e073850bbdd6acd8dff88b391cc5ad5c",
      "tree": "c22ace59f80a927fcac12e24862c4d8c4245d9a8",
      "parents": [
        "aafe6c300e59ed1b4407c71917fb2034fdc7798a"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Mon Nov 21 08:53:14 2022 +0100"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Mon Nov 21 08:53:14 2022 +0100"
      },
      "message": "Split bidi-level-processing into preprocessing and line step\n\nThe bidirectional algorithm is a bit convoluted in this regard,\nbut the canonical choice for the implementation is to do\npreprocessing on all paragraphs first (applying all rules up to\nL1.3) and applying rule L1.4 separately.\n\nThe reason for this is that rule L1.4 requires the knowledge\nabout line break positions, which we don\u0027t have (yet). We could\ntake it as a parameter for the preprocessing-function, however,\nline breaks may change often (think of an ncurses-context with\nwindow resizes), making constant complete reprocessings very\nwasteful.\n\nThus, the line-specific processing is put into a separate\nfunction. This way, the user passes each individual line together\nwith its preprocessing data.\n\nRule L1.4 will be implemented in a later commit.\n"
    },
    {
      "commit": "aafe6c300e59ed1b4407c71917fb2034fdc7798a",
      "tree": "33807dd3931e1f01f9685809aedf34734051d882",
      "parents": [
        "fd2d1969084185ff5e638c28066d0d35d510b7f0"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Nov 20 23:37:17 2022 +0100"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Nov 20 23:37:17 2022 +0100"
      },
      "message": "Refactor bidirectional state handling\n\nThe best approach is to have only one place where state is kept and\nno risk of \"stale\" state disturbing program execution.\nHand-managing state in the isolate-runner was thus problematic, as there\nwas the real risk of sliding into stale state. Even though this is\nmanageable, it makes the code relatively fragile and hard to debug.\n\nIn another aspect, the serialization was a mess and was in dire need of\nmore structure. The state currently still contains a \"raw property\",\nbut this will be removed once the API has been properly split between\nthe preprocessing and line-processing steps. The modified array is put\nwithin an #if 0-guard.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "fd2d1969084185ff5e638c28066d0d35d510b7f0",
      "tree": "dea582cf801c04492e632bb685c6ae87bc273806",
      "parents": [
        "a796095218b0524f957f76d6f3b501ebda700d44"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Thu Nov 17 23:47:45 2022 +0100"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Thu Nov 17 23:47:45 2022 +0100"
      },
      "message": "Refactor prev_prop into prev-struct with a single member prop\n\nThis makes it more consistent across the \"cur\" and \"next\" structs.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "a796095218b0524f957f76d6f3b501ebda700d44",
      "tree": "8205e903f6d2f16e4ddf5b9ce5a7087bca267627",
      "parents": [
        "abdc2ba0c764c527aaa2ed9fe42db27d71a10bc2"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Nov 15 21:08:50 2022 +0100"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Nov 15 21:08:50 2022 +0100"
      },
      "message": "Add a check make-target as an alias for test\n\nIt\u0027s one extra line but helps a bit as the \"community\" seems to be a bit\nsplit on how to call it (test or check).\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "abdc2ba0c764c527aaa2ed9fe42db27d71a10bc2",
      "tree": "db588ecbc24dd8a0fc2b6e4bcac5188ce27ca810",
      "parents": [
        "50efb9a3396588e6e1266f51ec5446a9fa8013ea"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Nov 15 15:53:56 2022 +0100"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Nov 15 15:54:35 2022 +0100"
      },
      "message": "Apply clang-format\n\nEven though this disrupts the backtrackability of the code a bit,\nit\u0027s better to rip the band aid off now than to push it on into the\nfuture.\n\nWith these changes, formatting is automatically governed and ensured by\na simple call to\n\n\tmake format\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "50efb9a3396588e6e1266f51ec5446a9fa8013ea",
      "tree": "f91c70cea1226fbf6743baab4ad36e0b76ab58de",
      "parents": [
        "3a735213d6da553d9235c5cad2732048242ada97"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Nov 15 15:35:01 2022 +0100"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Nov 15 15:40:26 2022 +0100"
      },
      "message": "Add .clang-format file and make-rule\n\nThis is inspired by OpenBSD KNF and the common suckless style approach\n(with possible deviations). Tabs are used for indentation, spaces for\nalignment.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "3a735213d6da553d9235c5cad2732048242ada97",
      "tree": "5737330afc856256659bc71168bdc40f50d187fc",
      "parents": [
        "64c136162a2830374522b993df86d8a0a852422a"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Nov 15 15:32:15 2022 +0100"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Nov 15 15:32:15 2022 +0100"
      },
      "message": "Also mark argv as unused in test/bidirectional.c\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "64c136162a2830374522b993df86d8a0a852422a",
      "tree": "8e8d786fca6ee7ddc7b1ea014be5189d4ff0ff71",
      "parents": [
        "be3430ca6b7d275d3691f126ad65e84d732ebbb1"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Nov 13 09:41:03 2022 +0100"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Nov 13 09:41:03 2022 +0100"
      },
      "message": "Remove redundant initialization\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "be3430ca6b7d275d3691f126ad65e84d732ebbb1",
      "tree": "f3174c520ff11b6d4c4cfcea41452cf98e2c851e",
      "parents": [
        "558b9cc3bc6961d26104cf726fe148f58ba36940"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Nov 13 09:15:33 2022 +0100"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Nov 13 09:15:33 2022 +0100"
      },
      "message": "Only copy current reorder into test if it is not NULL in bidi-testgen\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "558b9cc3bc6961d26104cf726fe148f58ba36940",
      "tree": "a5402a0e16a8c3a55f5097bbe62279f3d8c5fdb6",
      "parents": [
        "5a3f01e8a1b9a7847dad17260dd859d5c92bb6bd"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Nov 13 09:12:25 2022 +0100"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Nov 13 09:12:25 2022 +0100"
      },
      "message": "Prevent two theoretical null-pointer-dereferences in gen/util.c\n\nThis was found using static analysis and is not a security issue given\nthis is in the generating code, so no runtime-affection. The worst that\ncould\u0027ve happened beforehand is that the generating code segfaults and\nproduces garbage tables which would lead to compilation failure.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "5a3f01e8a1b9a7847dad17260dd859d5c92bb6bd",
      "tree": "e02fc75c1487cfa4f7611ff384fbec9a95d97317",
      "parents": [
        "2165664f6e2fa381eea54b9f887f152df2d9f817"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Wed Nov 02 20:18:27 2022 +0100"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Wed Nov 02 22:31:17 2022 +0100"
      },
      "message": "Add configure-script to dist-archive\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "2165664f6e2fa381eea54b9f887f152df2d9f817",
      "tree": "d6dc1c521528fc4aa72d2df26496da29309829e4",
      "parents": [
        "df25b40e3ba37e63bf914c199de448c01b3d1b6e"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Oct 30 01:29:19 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Oct 30 01:30:14 2022 +0200"
      },
      "message": "Keep direct pointer at bracket-struct in bidi-state\n\nThis makes the information easier to access instead of having to turn\nthe offset in the bracket-array to a pointer in every case we use it.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "df25b40e3ba37e63bf914c199de448c01b3d1b6e",
      "tree": "00192945127b9a7ccf3f7a4342cbf03a2aa78d12",
      "parents": [
        "6769c08f08ab6bb86301f941028641e6314b8e9e"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Oct 29 01:29:53 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Oct 29 01:30:15 2022 +0200"
      },
      "message": "Update configure to make it idempotent again and add MidnightBSD\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "6769c08f08ab6bb86301f941028641e6314b8e9e",
      "tree": "97e6d10d24d7d17be0997236585a09fa1f5e9231",
      "parents": [
        "c031ada2cb11489c032f6ddd84fa7091efe6c784"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Oct 29 01:11:48 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Oct 29 01:11:48 2022 +0200"
      },
      "message": "Add bracket-pair-parsing and refactor bidi-state-management\n\nAs announced, to fully implement the bidirectional algorithm, it\nis still necessary to implement rule N0 which requires access to the\nbracket properties of each character. Inspired by how we solved it\nin gen/case.h we go with a bitwise-approach.\n\nRegarding the state-management, it\u0027s a difficult balance between\ntype-safety, readability and correctness, but I went with the approach\nthat offered the least redundancy and relatively good readability.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "c031ada2cb11489c032f6ddd84fa7091efe6c784",
      "tree": "87e4928105977565b8f51330d696bdb6a99222fc",
      "parents": [
        "6375ae6d522413ba1a6e3b2a62c6e5e99349aafa"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Fri Oct 28 17:09:44 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Fri Oct 28 17:09:44 2022 +0200"
      },
      "message": "Add UINT32_C()-macro around constant\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "6375ae6d522413ba1a6e3b2a62c6e5e99349aafa",
      "tree": "89d36a26c974e631fcbc4115d562a94402d29b4d",
      "parents": [
        "cd3a639d18c25942d0d48c8001f18222ba5899ef"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Fri Oct 28 17:08:41 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Fri Oct 28 17:09:21 2022 +0200"
      },
      "message": "Refactor post_process()-function to take the entire property-array\n\nThis does not make much of a difference, but gives enough flexibility\nfor a later change to incorporate the bidi-bracket-property into the\nbidi-LUT.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "cd3a639d18c25942d0d48c8001f18222ba5899ef",
      "tree": "d9871cacf7d8ac16f0bd3db09d4780d457850270",
      "parents": [
        "4027860f6a5384fe60181d79337862bf53116bec"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Oct 25 17:16:21 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Oct 25 17:16:21 2022 +0200"
      },
      "message": "Move comments on macro-definition-lines to separate lines\n\nThe standard says\n\n\tMacro definitions are in the form:\n\n\t\tstring1 \u003d [string2]\n\n\tThe macro named string1 is defined as having the value of\n\tstring2, where string2 is defined as all characters, if any,\n\tafter the \u003cequals-sign\u003e, up to a comment character ( \u0027#\u0027 ) or\n\tan unescaped \u003cnewline\u003e. Any \u003cblank\u003e characters immediately\n\tbefore or after the \u003cequals-sign\u003e shall be ignored.\n\nand thus having a declaration like\n\n\tMACRO \u003d helloworld # comment\n\nyields with MACRO containing the value \"helloworld \", which is obviously\nundesired for path-declarations. This is fixed now.\n\nThanks to Ionen Wolkens for reporting this issue!\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "4027860f6a5384fe60181d79337862bf53116bec",
      "tree": "44a0a9456149dc640e13c61cfcc14bac73f6f767",
      "parents": [
        "5998352d2d2e6e37531548f8e986abae5ff8ef02"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Oct 25 15:35:30 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Oct 25 15:39:12 2022 +0200"
      },
      "message": "Install a simple pkg-config-file if desired\n\nThis was requested by a few packagers and it doesn\u0027t hurt to add a bit\nof metadata.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "5998352d2d2e6e37531548f8e986abae5ff8ef02",
      "tree": "7d3fa6c312b512b81061bc9f2f448c4f698a0a7f",
      "parents": [
        "dd15fea026c3e0b389381ae8cc08e0f39fa1a8f7"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Oct 25 13:20:47 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Oct 25 13:49:50 2022 +0200"
      },
      "message": "Implement the Unicode Bidirectional Algorithm (UAX #9)\n\nTo be frank, I never heard about this until I started learning more\nabout Unicode, but this is an absolute must for all languages that go\nfrom right to left (Hebrew, Arabic, Farsi, etc.) and any case where you\nmix RTL and LTR languages.\n\nThe Unicode Bidirectional Algorithm is the normative procedure you apply\non a string to obtain embedding levels that can then be used to reorder\nthe string such that you obtain the proper reading direction. The\ncentral aspect is that strings are always stored LTR in memory and only\nreordered for presentation on the screen.\n\nCurrently, only ICU and GNU fribidi implement the algorithm, and as\nusual it\u0027s pretty convoluted to use them. There are many memory\nallocations, kitchen-sink-madness and legacy cruft, but the demand is\nthere (there\u0027s even a bidi-patch for dwm[0]).\n\nWhat\u0027s special about this implementation? There are no memory\nallocations at runtime. The user provides a 32-bit-integer-array which\nis then filled with the embedding levels. The levels themselves only\nrange from -1 to 125 (by the standard!) and would fit in a signed\n8-bit-integer, but the algorithm naturally needs a scratchpad to store\nprocessing data.\n\nA complication of the algorithm is that you, at some point, have to\nbreak the paragraph into lines and based on the line breaks the level\ndetermination is affected. GNU fribidi and ICU make this very\ncomplicated and hard to understand. The API is not final as you see it\nhere, but the final process will be (each number corresponding to a\nfunction):\n\n\t1) \"preprocessing\" the string up to the part where the algorithm\n\t   does not depend on the line breaks\n\t2) determining line embedding levels for a line\n\t   (by specifying the preprocessed data buffer and an output\n\t   level-buffer)\n\t3) reordering a line (by specifying the preprocessed data buffer\n\t   and an output string that is allowed to be the input string)\n\nConformance is obviously a large priority: There are literally over a\nmillion automatic conformance tests for the bidirectional algorithm split\nacross the files BidiTest.txt and BidiCharacterTest.txt that are\nautomatically parsed into the header gen/bidirectional-test.h.\n\nCurrently, only BidiTest.txt is used for tests (which we all pass),\ngiven bracket-pairs have not been implemented yet. This and (maybe)\narabic shaping are what is left to be implemented, but this here is\nalready a big step.\n\nOne more note: Yes, the data files are very large, but they compress\ndown very well and the tarball stays below 800K. It\u0027s very important\nto me that there\u0027s no need to pull any data from the web for compilation\nor testing for obvious reasons.\n\n[0]:https://dwm.suckless.org/patches/bidi/\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "dd15fea026c3e0b389381ae8cc08e0f39fa1a8f7",
      "tree": "751b0dc1ea4a85d75e163b2d8be39d6d8a10547a",
      "parents": [
        "efb2f452b6d1327ba091ac8a69556a060401afed"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Fri Oct 14 00:40:37 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Fri Oct 14 00:41:37 2022 +0200"
      },
      "message": "Refactor src/bidirectional.c with Herodotus\n\nThis simplifies a lot of the code and makes it more consistent as it now\nuses patterns that are similar to those in src/case.c.\n\nThe most significant effect is of course the guarantees that come with\nusing this interface.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "efb2f452b6d1327ba091ac8a69556a060401afed",
      "tree": "06309b9bec13ba7786ffcbf9a247b8b6150841f8",
      "parents": [
        "f2783665bc71b9b1f1b72830629c3724bd8e1ae4",
        "a591d58a3fb3abf40956c3017118da7f33a84bea"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Thu Oct 13 23:54:28 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Thu Oct 13 23:54:28 2022 +0200"
      },
      "message": "Merge branch \u0027master\u0027 into bidirectional\n\nThis brings this branch up to speed with the previous work.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "a591d58a3fb3abf40956c3017118da7f33a84bea",
      "tree": "03325cc7242873aa12d71815d5318a83604b47e0",
      "parents": [
        "30766915c37d88fc423a4d750227a769e7a307ae"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Oct 11 23:21:54 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Oct 11 23:21:54 2022 +0200"
      },
      "message": "Update README to reflect the ./configure-script\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "30766915c37d88fc423a4d750227a769e7a307ae",
      "tree": "70b6a8f7adfbe2216f33c65b1f2b0397384bf1b1",
      "parents": [
        "858c34a1e19bd790510bb918c583cea73487e64e"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Oct 11 22:21:47 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Oct 11 22:21:47 2022 +0200"
      },
      "message": "Add ./configure-script with presets for common systems\n\nAfter quite a few requests and a bit of reflection on my behalf I\u0027ve\ndecided to add a very simple ./configure-script that automatically\nmodifies config.mk to make it fit for common systems.\n\nEven though it\u0027s reasonable to simply have out-commentable options\nin the config.mk, it is admittedly more convenient to have such a\nscript available, especially to accomodate more systems along the way.\n\nuname(1) is Posix compliant and this ./configure-script is in no way\ncomparable to the horrible autoconf-insanity and won\u0027t take an eternity\nto run. It\u0027s also completely optional and merely a\nquality-of-life-addition for those working with libgrapheme manually.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "858c34a1e19bd790510bb918c583cea73487e64e",
      "tree": "c685c8ae1818c63ece1daa35447a8929a3c056ad",
      "parents": [
        "657e9379807b215593e8c0706a51872b7870e8fe"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Oct 09 12:13:42 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Oct 09 12:14:58 2022 +0200"
      },
      "message": "Bump to version 2.0.1\n\nHardened the code using static analysis and improved the build system\nto work perfectly on OpenBSD and macOS.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "657e9379807b215593e8c0706a51872b7870e8fe",
      "tree": "70e7be5bde6859a175abb8b4dc2691b421a85e97",
      "parents": [
        "a1913f83b643e883aa6754d8078aee7d46f53aec"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Oct 08 13:17:47 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Oct 08 13:17:47 2022 +0200"
      },
      "message": "Explicitly pop the reader-limit in to_titlecase()\n\nThis ensures that we don\u0027t have any stray limits on the stack and\nalways have a clean state.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "a1913f83b643e883aa6754d8078aee7d46f53aec",
      "tree": "d25f678747956c4799d3a2d6f0dc4147bc37e92f",
      "parents": [
        "decd5b53f1f1303d1f351e85238cad4987b8b6f0"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Oct 08 13:17:16 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Oct 08 13:17:30 2022 +0200"
      },
      "message": "Avoid memory leak in break_test_list_free()\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "decd5b53f1f1303d1f351e85238cad4987b8b6f0",
      "tree": "29ccd036f878c2d4836e33acaead6d353f06519a",
      "parents": [
        "4182a14424c1e27b943187e230948ee31d6d66ba"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Oct 08 13:16:51 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Oct 08 13:16:51 2022 +0200"
      },
      "message": "Avoid memory leak in character-benchmark\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "4182a14424c1e27b943187e230948ee31d6d66ba",
      "tree": "3b567dabeb36eae445a454055d2dc37e74dc46a7",
      "parents": [
        "004bdcf210baf1a63772bb7eca452bb0aeba010b"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Oct 08 13:14:48 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Oct 08 13:14:48 2022 +0200"
      },
      "message": "Avoid undefined behaviour and memory leaks in case-data-generator\n\nThis was found using the clang-sanitizers and was pretty tough to spot.\n\nThe first part does not influence program-operation as is, but checking\nfirst if tmp2 is NULL avoids undefined behaviour of adding a non-zero\noffset to NULL.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "004bdcf210baf1a63772bb7eca452bb0aeba010b",
      "tree": "ff048b9f211e8f8dbb3df4b33668e79b8ae2474e",
      "parents": [
        "ef3e52a7f560f66df8ed1e2487872a1e62c5cedb"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Oct 08 13:13:03 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Oct 08 13:13:03 2022 +0200"
      },
      "message": "Prevent undefined behaviour in herodotus_reader_copy()\n\nThe first part usually catches harmless cases like \"NULL + 0\", but the\nlast part prevents integer overflow in some really crazy cases that\nare unlikely but can still happen.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "ef3e52a7f560f66df8ed1e2487872a1e62c5cedb",
      "tree": "dbf05521b47565ba61184b3e3faff4bb581fc4c7",
      "parents": [
        "28064303528f2604c5bf932b1478eb9f7c7ffc04"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Oct 08 11:22:18 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Oct 08 11:22:18 2022 +0200"
      },
      "message": "Call ldconfig in a subshell\n\nThis prevents a syntax error when LDCONFIG is unset.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "28064303528f2604c5bf932b1478eb9f7c7ffc04",
      "tree": "4626c76ff28989997c6a9cd0279c29835d11b606",
      "parents": [
        "a6b3a194f0381c5aef9346d39b02eb058111d2a2"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Oct 08 11:11:49 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Oct 08 11:11:49 2022 +0200"
      },
      "message": "Check if LDCONFIG is set before calling it\n\nOtherwise this prints a warning in some make-implementations.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "a6b3a194f0381c5aef9346d39b02eb058111d2a2",
      "tree": "8fe8ec30c4deae4f758acb963f28bb99efe6eb3b",
      "parents": [
        "d42f53b5baafe01caa48477e204b63e065660117"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Oct 08 10:40:03 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Oct 08 10:46:31 2022 +0200"
      },
      "message": "Enhance build-system to perfectly support OpenBSD and macOS\n\nStudying the source material on OpenBSD[0], it is written that\n\n\tQuite a few ports need tweaks to build shared libraries correctly\n\tanyways. Remember that building shared libraries should be done with\n\n\t\t$ cc -shared -fpic|-fPIC -o libfoo.so.4.5 obj1 obj2\n\n\tTrying to rename the library after the fact to adjust the version\n\tnumber does not work: ELF libraries use some extra magic to set the\n\tlibrary internal name, so you must link it with the correct version\n\tthe first time.\n\nThus, it is necessary to directly compile into $(SONAME), which is\nchanged to in this commit.\n\nThe magic flags for macOS were taken from [1]. It sets up the linker\nsuch that it automatically respects semantic versioning and will load\nany library with a smaller compatible version (e.g. same minor-version).\n\nAdditionally, both OpenBSD and macOS have smarter linkers than Linux\nand don\u0027t need symlinks from varying versions to work right. Thus a\nflag SOSYMLINK was added to enable toggling this from the config.mk.\n\nFor convenience, the best-practices for each platform are added to\nthe config.mk in a commented-out form, saving everybody some time.\n\n[0]:https://www.openbsd.org/faq/ports/specialtopics.html#SharedLibs\n[1]:https://begriffs.com/posts/2021-07-04-shared-libraries.html#linking\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "d42f53b5baafe01caa48477e204b63e065660117",
      "tree": "df32632f2cf809ea38d320e9dd129d9ef8f332b1",
      "parents": [
        "ad4877023146953d4daa8d91c119124c38620337"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Oct 08 09:38:08 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Oct 08 09:38:08 2022 +0200"
      },
      "message": "Move version statements back into the Makefile\n\nEnsure rebuilding on such changes by adding an explicit dependency\non the Makefile in each prerequisite list that also contains config.mk.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "ad4877023146953d4daa8d91c119124c38620337",
      "tree": "501307e5501d8261567014e553b45a78ddf8c6ba",
      "parents": [
        "4b4292a8f78eec4271213982fdddaf1c479dfe96"
      ],
      "author": {
        "name": "Christopher Wellons",
        "email": "wellons@nullprogram.com",
        "time": "Fri Oct 07 11:33:10 2022 -0400"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Fri Oct 07 18:00:11 2022 +0200"
      },
      "message": "Check for empty destination before NUL-terminating\n\nThis overflow was triggered in the second test of to_lowercase_utf8\nwhere the destination is zero length (w-\u003edestlen \u003d\u003d 0). `w-\u003edestlen`\nwould overflow by subtraction, then the subscript would overflow the\ndestination.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "4b4292a8f78eec4271213982fdddaf1c479dfe96",
      "tree": "be8345b2bd5346e8233d00fabfb74a9bb8aacab0",
      "parents": [
        "ef608a20a5431e68922e787cfdd68d893497d16f"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Fri Oct 07 12:40:51 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Fri Oct 07 12:40:51 2022 +0200"
      },
      "message": "Remove superfluous printf-parameter from the example\n\nThis fortunately has no functional effect, it\u0027s just redundant.\n\nThanks to Kartik Agaram for reporting this!\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "ef608a20a5431e68922e787cfdd68d893497d16f",
      "tree": "aac8bcfab48fbe7093cf0f400ac1db83981e1c5f",
      "parents": [
        "1774b5430fe46d8d5511075d3cd644716ad4c3c8"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Thu Oct 06 23:01:24 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Thu Oct 06 23:04:50 2022 +0200"
      },
      "message": "Bump to version 2.0.0\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "1774b5430fe46d8d5511075d3cd644716ad4c3c8",
      "tree": "902b4f2c7785bd0fe72d5a4c7a621612df5123c7",
      "parents": [
        "5939cf21cdb050e1c9bce964a30c9ad94f7440b9"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Thu Oct 06 22:57:31 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Thu Oct 06 22:57:31 2022 +0200"
      },
      "message": "Update README\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "5939cf21cdb050e1c9bce964a30c9ad94f7440b9",
      "tree": "86aa652e6ffe46e0cf2a07a3ee5025b145e54e51",
      "parents": [
        "f6ab5a6edf5eae9470f7eb6ee3062fd9a7865ead"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Thu Oct 06 00:12:50 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Thu Oct 06 00:12:50 2022 +0200"
      },
      "message": "Add is_case.sh to MAN_TEMPLATE\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "f6ab5a6edf5eae9470f7eb6ee3062fd9a7865ead",
      "tree": "57f0b27b203fb95304912784856cecb508955a50",
      "parents": [
        "3ebd28c3e3ce50fd3370c587a0ec66e6c9489c83"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Thu Oct 06 00:02:29 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Thu Oct 06 00:02:29 2022 +0200"
      },
      "message": "Fix up smaller notational and type aspects for constants\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "3ebd28c3e3ce50fd3370c587a0ec66e6c9489c83",
      "tree": "f41426ffffaf34d26081fdfbd7a5f39429b9a564",
      "parents": [
        "6a70e181676e97dfe8a4b9b369ef15d286caf772"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Wed Oct 05 23:48:51 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Wed Oct 05 23:48:51 2022 +0200"
      },
      "message": "Explicitly list util.o for benchmark/ and test/ as well\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "6a70e181676e97dfe8a4b9b369ef15d286caf772",
      "tree": "e277b3cdc2aa575d02fd8389854b10b5a97a5c1d",
      "parents": [
        "ed7ebdc7f7fa748f89372e034d6d983835db5d42"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Wed Oct 05 22:57:33 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Wed Oct 05 22:57:33 2022 +0200"
      },
      "message": "Explicitly clear suffix list and fix a small oversight\n\nThe suffix list contains some rules defined by the standard. This\nmasked that gen/util.o was never covered by the rules c-\u003eo, which\nhas been fixed.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "ed7ebdc7f7fa748f89372e034d6d983835db5d42",
      "tree": "5fcaab8fd8132ada83de8326af91cbf4a75a42cc",
      "parents": [
        "b583c3ab6855d491154f7be6d3bdb5c44380290c"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Wed Oct 05 22:14:17 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Wed Oct 05 22:44:52 2022 +0200"
      },
      "message": "Switch to semantic versioning and improve dynamic library handling\n\nAfter long consideration, I\u0027ve made the decision to switch this project\nover to semantic versioning[0]. While it made sense for farbfeld in\nsome way to use incremental versioning, for libraries it is almost\ncanonical to make use of semantic versioning instead.\n\nGiven there have been breaking API-changes since version 1 (which now\ncorresponds to 1.0.0), the major version will naturally be bumped.\nAfterwards though, additions to the API will only trigger a minor bump,\nas is convention, while also making it possible to release\npatch-releases when there have been errors. Because, to be frank, if you\nonly have full integers, you kind of get anxiety that a release is in\nfact correct, given you don\u0027t want to waste another whole integer-step\non a simple bugfix.\n\nFor farbfeld, which is very small and self-contained, it was okay, but\nlibgrapheme has become complex enough to warrant this.\n\nRegarding dynamic library handling: I really read a lot about it and\nreferred to some interesting articles like [1] to figure out what the\nbest approach is to reflect versioning in the dynamic library.\n\nDoing this portably is quite difficult and the common approach to\nsimply use the major version has some serious drawbacks, given a\nbinary linked against the version 2.4 can falsely be linked against\nversions 2.3.x, 2.2.x, 2.1.x or 2.0.x at runtime, even though they\nlack functions added in 2.4 that might be used in the binary, something\nexplicitly allowed in semantic versioning.\n\nA portable trick described in [1] is to set SONAME to contain\nMAJOR.MINOR and explicitly create symlinks from all \"lower\" MAJOR-MINOR-\ncombinations with the same MAJOR-version to ensure forward-compatibility\nfor all binaries linked against a certain MAJOR.MINOR-combination.\n\nThis way, a library linked against libgrapheme-2.4 is properly linkable\nagainst libgrapheme-2.5 at runtime (given semantic versioning ensures\nforward compatibility), but at the same time, it will not allow linking\nagainst libgrapheme-2.2 (if that is installed), given it has no\nexplicit symlink set from libgrapheme-2.2 at libgrapheme.2.5.\n\n[0]:https://semver.org/\n[1]:https://begriffs.com/posts/2021-07-04-shared-libraries.html\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "b583c3ab6855d491154f7be6d3bdb5c44380290c",
      "tree": "1400772c928bd443a235a822e57b6075bade179f",
      "parents": [
        "0aa5d262f8d0975341bcc60916e12044c7d64d0d"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Wed Oct 05 20:54:24 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Wed Oct 05 20:54:24 2022 +0200"
      },
      "message": "Fix sorting in grapheme.h\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "0aa5d262f8d0975341bcc60916e12044c7d64d0d",
      "tree": "7df52ac409b39be693f0f23728ecc543c6f85691",
      "parents": [
        "608a5c3c12c036871e74c9da12fe1fffb400e3f1"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Oct 04 08:11:00 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Oct 04 08:11:40 2022 +0200"
      },
      "message": "Use explicit constant-macro instead of cast\n\nThanks NRK for the suggestion!\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "608a5c3c12c036871e74c9da12fe1fffb400e3f1",
      "tree": "3b055e3b9d26b418bf6037dc2ed51ceea793a6c2",
      "parents": [
        "4a5b4abeec1b91986ec0258289abf79b6122531c"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Oct 04 00:56:52 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Oct 04 00:56:52 2022 +0200"
      },
      "message": "Remove hyphen from \"bare metal\"\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "4a5b4abeec1b91986ec0258289abf79b6122531c",
      "tree": "cbffd2aea4acf90e13d0ee4426c4124dd115ccaa",
      "parents": [
        "fc73d06fed76dd7cde37d3704949d01391ea0032"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Oct 04 00:17:04 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Tue Oct 04 00:17:04 2022 +0200"
      },
      "message": "Rework libgrapheme(7) a bit\n\nAdd the information about the library being freestanding and fix\nwordings a bit. Reflect in the first paragraph what the library can do.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "fc73d06fed76dd7cde37d3704949d01391ea0032",
      "tree": "559c42a15e35bbaf0a4e15c5d9557967930ba23a",
      "parents": [
        "a815be4b5de7f7df2da664049fdb04874d37016a"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Mon Oct 03 23:13:26 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Mon Oct 03 23:13:26 2022 +0200"
      },
      "message": "Convert GRAPHEME_STATE to uint_least16_t and remove it\n\nI was never quite happy with the fact that the internal state-struct\nwas visible in the grapheme.h-header, given the declaration of the\nfields only namely served internal purposes and were useless noise to\nthe reader.\n\nTo keep it in was merely a choice made because I had always hoped\nto be able to implement maybe a few more state-based pairwise\nsegmentation check functions and use the GRAPHEME_STATE type in more\nplaces, but now after implementing the algorithms it becomes clear that\nthey all do not satisfy these pairwise semantics.\n\nThe first logical step was to convert the struct to an uint_least16_t,\nwhich provides enough space (at least 16 bits) to store all the complete\nstate, and have internal deserialiation and serialization functions.\n\nThe remaining question was if the\n\n\ttypedef uint_least16_t GRAPHEME_STATE\n\nshould be removed. I took inspiration from the Linux kernel coding\nstyle[0], which in section 5b lays out the exact case of typedeffing\nan integer that is meant to store flags (just like in our case).\nIt is argued there that there needs to be a good reason to typedef an\ninteger (e.g. given it might change by architecture or maybe change in\nlater versions). Both cases are not given here (we will _never_ need\nmore than 16 bits to store the grapheme cluster break state and you can\neven reduce more wastage, e.g. for storing the prop which never exceeds\n4 bits given NUM_CHAR_BREAK_PROPS \u003d\u003d 14 \u003c 15 \u003d\u003d 2^4-1), and I must admit\nthat it improves readability a bit given you finally know what you\u0027re\ndealing with.\n\nThe expression\n\n\tGRAPHEME_STATE state \u003d 0;\n\nadmittedly looks a little fishy, given you don\u0027t really know what happens\nbehind the scenes unless you look in the header, and I want all of the\nsemantics to be crystal clear to the end-user.\n\n[0]:https://www.kernel.org/doc/html/latest/process/coding-style.html#typedefs\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "a815be4b5de7f7df2da664049fdb04874d37016a",
      "tree": "3a14d83d26fbd30fffa792a4a9985fa59c7912c7",
      "parents": [
        "5ea8d87a9a0fb9c6dda827cc55d43c637cd4086d"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Mon Oct 03 21:18:52 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Mon Oct 03 21:18:52 2022 +0200"
      },
      "message": "Add unit tests for all segmentation functions\n\nNow all functions in the library are covered by exhaustive unit tests\nwhich supplement the already present conformance tests to make sure\nthat the thin layer between API and implementation is also working as\nexpected.\n\nAt this point I would assess that libgrapheme is a stable foundation\nfor using it in the real world and now preparation can go underway\nto prepare the release of version 2.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "5ea8d87a9a0fb9c6dda827cc55d43c637cd4086d",
      "tree": "c964a6291c6c81d82606673aecfa48530e7e5876",
      "parents": [
        "28815433e3595cba51a40c4a5e291da3a8746d78"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Mon Oct 03 21:16:38 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Mon Oct 03 21:16:38 2022 +0200"
      },
      "message": "Set case-test-structs as const and use uppercase-hex-notation\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "28815433e3595cba51a40c4a5e291da3a8746d78",
      "tree": "40f0dbfd6545d51900bf50585d283dbdbe532dd1",
      "parents": [
        "f70ea8c12ab5b7ad6f90f8860544779a43ce8a9e"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Mon Oct 03 21:14:52 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Mon Oct 03 21:14:52 2022 +0200"
      },
      "message": "Unify code paths in herodotus_read_codepoint()\n\nThis saves redundancy.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "f70ea8c12ab5b7ad6f90f8860544779a43ce8a9e",
      "tree": "1f230df2c0c33680f35a1be16d3e4d83260a67cc",
      "parents": [
        "995e37182dc53da55dc4cf34868513610215c79e"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Oct 02 22:30:08 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Oct 02 22:30:58 2022 +0200"
      },
      "message": "Drop get_codepoint*() and set_codepoint*() functions\n\nThese are, now that all code has been refactored with Herodotus and\nProper, no longer used and can be dropped.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "995e37182dc53da55dc4cf34868513610215c79e",
      "tree": "e8b2a24507f0d2c7a42ca2cc586f0bdddbb1071d",
      "parents": [
        "a5b1b0c0c7bc1576b5893175b27585fa963f4433"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Oct 02 22:22:54 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Oct 02 22:22:54 2022 +0200"
      },
      "message": "Fix a few small errors in the manpages\n\nThanks to NRK for spotting most of these problems! In the other cases,\nmandoc with its Tlint-flag proved to be very useful.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "a5b1b0c0c7bc1576b5893175b27585fa963f4433",
      "tree": "067fec057aa7e841948ca8c321eb947f2941cf70",
      "parents": [
        "52b0e29e02068d6a8123042ef901f73e37b2f38f"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Oct 02 22:05:11 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Oct 02 22:05:11 2022 +0200"
      },
      "message": "Refactor sentence-functions with Proper (using Herodotus in the background)\n\nThis refactor was a breeze and it passed all conformance tests on the\nfirst try. This, just like with the word-functions, leads to a massive\nsimplification and separation of concerns in the code. And as with the\nword functions, this fixes some known quirks.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "52b0e29e02068d6a8123042ef901f73e37b2f38f",
      "tree": "2f9eab45316457c36aab72c5db8ab9df267cca62",
      "parents": [
        "b899fd685c50cbc61999296ce1e0a03a45e74f52"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Oct 02 21:17:03 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Oct 02 21:17:03 2022 +0200"
      },
      "message": "Refactor word-functions with Proper (using Herodotus in the background)\n\nAs promised, this leads to a heavy simplification and separation of\nconcerns in the code. Additionally, this fixes some known quirks in\nregard to handling NUL-terminated strings.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "b899fd685c50cbc61999296ce1e0a03a45e74f52",
      "tree": "65857d960ba487d32265bc7c8769778e3b7840b0",
      "parents": [
        "a4d42053f13e8471ee3903522f964fc0a1d3161a"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Oct 02 21:09:08 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sun Oct 02 21:09:08 2022 +0200"
      },
      "message": "Add \"proper\"-property-reader\n\nThe word- and sentence-segmentation algorithms make use of a complicated\nlogic to accomodate \"raw\" and \"skip\" properties. The code is barely\nreadable and doesn\u0027t separate abstractions away nicely. Moreover, there\nis a high probability that certain edge-cases are not handled properly.\n\nTo fix this, this commit adds a \"proper\"-property-reader, which\nbasically does the whole dirty details in the background using\nwell-commented and transparent code that builds on top of the\nherodotus-reader instead of doing this by hand. This ensures that we\nwill (provably) never have buffer overflows unless there is a mistake\nin the implementation itself, which can be verified relatively easily\ngiven each function has a limited scope.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "a4d42053f13e8471ee3903522f964fc0a1d3161a",
      "tree": "3ee560e986853ecb79543a04d74e58d89603d479",
      "parents": [
        "65785f699be45dd77bdcbfc1d3aded39151f3205"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Sep 24 12:26:19 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Sep 24 12:26:19 2022 +0200"
      },
      "message": "Refactor line-functions with Herodotus\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "65785f699be45dd77bdcbfc1d3aded39151f3205",
      "tree": "e63b726d1dfe47228507b0da67b9625449b1f9d3",
      "parents": [
        "b13acfd6cd5114fcddbffaf9855664a95f966403"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Sep 24 11:45:20 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Sep 24 11:45:20 2022 +0200"
      },
      "message": "Refactor character-functions with Herodotus\n\nThis also unifies the code and drops a lot of complicated state\nhandling.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "b13acfd6cd5114fcddbffaf9855664a95f966403",
      "tree": "6f71f346fbfe5faac306e73e7753eb5f46660ac4",
      "parents": [
        "bc1dc28c09ce845291c51041b45594fef78e4eb4"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Sep 24 10:38:29 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Sep 24 10:38:29 2022 +0200"
      },
      "message": "Update README\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "bc1dc28c09ce845291c51041b45594fef78e4eb4",
      "tree": "9f137941359e44b76ee5a7a39f45d00b23585c9b",
      "parents": [
        "5dec22a7143e1105f25c7a7626fa166d882367d0"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Sep 24 10:37:21 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Sep 24 10:37:21 2022 +0200"
      },
      "message": "Clarify a comment in gen/case.c\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "5dec22a7143e1105f25c7a7626fa166d882367d0",
      "tree": "10f3249a8410f2ec2e06b39a50ec56d05a974041",
      "parents": [
        "8a7e2ee85f0a2824e48e85e57534c5b18113cf07"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Sep 24 10:36:15 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Sep 24 10:36:15 2022 +0200"
      },
      "message": "Refactor case-checking-functions with Herodotus and add unit tests\n\nAdditionally, expand the unit tests with special-casing-cases.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "8a7e2ee85f0a2824e48e85e57534c5b18113cf07",
      "tree": "968c84af2dad186b3d8073bada06516efb173f3c",
      "parents": [
        "9f15d7eb0c9cf216f069d6972c58520013b80acb"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Sep 24 01:54:52 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Sep 24 01:54:52 2022 +0200"
      },
      "message": "Compile the library in freestanding mode\n\nLooking closely, we never explicitly depend on the standard library\nwithin the actual library code. This can be explicitly expressed by\nsetting -ffreestanding during object-compilation and -nostdlib during\nlinking. The result is a clean library with zero libc-symbols, allowing\nit to be used even without an operating system (kernel code, ELF,\netc.), by making use of the freestanding implementation form defined\nin the standard[0].\n\nTo be freestanding, the code may only include \u003cfloat.h\u003e, \u003ciso646.h\u003e,\n\u003climits.h\u003e, \u003cstdalign.h\u003e, \u003cstdarg.h\u003e, \u003cstdbool.h\u003e, \u003cstddef.h\u003e,\n\u003cstdint.h\u003e and \u003cstdnoreturn.h\u003e. We satisfy this condition implictly,\nbut there are some erroneous supplementary includes that are removed\nin this commit. Additionally, the strict compiler-implementation simply\nadds the U-prefix to the argument of UINT16_C (et. al.), which is why\ncalls to it have to be changed to really include only constants.\n\n[0]:https://www.iso-9899.info/n1570.html#4.p6\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "9f15d7eb0c9cf216f069d6972c58520013b80acb",
      "tree": "ee63f3d4a3a76007f0a3b4bce767b595f5c61816",
      "parents": [
        "9c926f112553481fae101b692f8add2998aeeaaf"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Thu Sep 22 00:16:56 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Thu Sep 22 00:16:56 2022 +0200"
      },
      "message": "Declare test-arrays as static\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "9c926f112553481fae101b692f8add2998aeeaaf",
      "tree": "f580bffb75fd95201e7a8aa06a67ee12c8144ec8",
      "parents": [
        "e63bcc42010176b300feea6a7412f814a6cc4191"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Wed Sep 21 20:25:41 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Wed Sep 21 20:25:41 2022 +0200"
      },
      "message": "Remove autistic screeching\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "e63bcc42010176b300feea6a7412f814a6cc4191",
      "tree": "d90b4b6d2ce40eb60653f2f348c22270965f87bd",
      "parents": [
        "5332f7ee034081618617c2b0785733ccc9ec8753"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Wed Sep 21 20:18:12 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Wed Sep 21 20:18:12 2022 +0200"
      },
      "message": "Add case-conversion-unit-tests\n\nTo give even more assurance and catch any possible future regressions,\nexhaustive unit tests are added for the case-conversion functions.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "5332f7ee034081618617c2b0785733ccc9ec8753",
      "tree": "39673a63beef405df6a4fe94da4d8ae1cdcb166b",
      "parents": [
        "563eb65bfbaa4f27c77d73ae81b51882c916993d"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Wed Sep 21 20:16:00 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Wed Sep 21 20:16:00 2022 +0200"
      },
      "message": "Refactor case-conversion-functions with Herodotus\n\nThe readability of the code is greatly improved, and the code is now\nmuch more robust than before.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "563eb65bfbaa4f27c77d73ae81b51882c916993d",
      "tree": "7cb4ae2a59d1ec339cfdf53f11ae74526a768f05",
      "parents": [
        "6d0595242a027c1fcb06136e632f6d727388c4ec"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Wed Sep 21 20:11:55 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Wed Sep 21 20:11:55 2022 +0200"
      },
      "message": "Add helper structure for reading from and writing into buffers\n\nThe logic behind the input and output buffers is quite intricate\nand leads to numerous subtle bugs that are best handled with a\nrefactoring using an abstraction layer that hides most of the\ngory details.\n\nThe Herodotus reader/writer elegantly does all the magic in the\nbackground, allowing us to focus on the algorithms in the front\ninstead. This especially helps with handling NUL-terminated strings,\nas we are guaranteed not to accidentally read too far.\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    },
    {
      "commit": "6d0595242a027c1fcb06136e632f6d727388c4ec",
      "tree": "2fb8872ef00f56ed42de7e14d35cd6abfcc7b55c",
      "parents": [
        "fad432f65f9011175f4fe24d4045ba0d42bdc55e"
      ],
      "author": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Sep 17 01:13:59 2022 +0200"
      },
      "committer": {
        "name": "Laslo Hunhold",
        "email": "dev@frign.de",
        "time": "Sat Sep 17 01:13:59 2022 +0200"
      },
      "message": "Sort prototypes in grapheme.h alphabetically\n\nSigned-off-by: Laslo Hunhold \u003cdev@frign.de\u003e\n"
    }
  ],
  "next": "fad432f65f9011175f4fe24d4045ba0d42bdc55e"
}
