)]}'
{
  "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",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "d768101015c936e5a1bb91f4915dc74bcabddce7",
      "old_mode": 33188,
      "old_path": "Makefile",
      "new_id": "bc61213c8685e7e9fae6da7d61b78ff3826e74a3",
      "new_mode": 33188,
      "new_path": "Makefile"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "8a154243b4aa900e7187b1a30a9e7bdf2223baf4",
      "new_mode": 33188,
      "new_path": "gen2/character.c"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "268fa2ae032241ff0adaa9e4b20d85368288baa7",
      "new_mode": 33188,
      "new_path": "gen2/character.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "129648ec5b093f6a042891672a356b23886d74db",
      "new_mode": 33188,
      "new_path": "gen2/util.c"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "4bdf0bb389de3db8f09b5c095d180535e12e48a4",
      "new_mode": 33188,
      "new_path": "gen2/util.h"
    }
  ]
}
