Refactor post_process()-function to take the entire property-array - libgrapheme - unicode string library
 (HTM) git clone git://git.suckless.org/libgrapheme
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 6375ae6d522413ba1a6e3b2a62c6e5e99349aafa
 (DIR) parent cd3a639d18c25942d0d48c8001f18222ba5899ef
 (HTM) Author: Laslo Hunhold <dev@frign.de>
       Date:   Fri, 28 Oct 2022 17:08:41 +0200
       
       Refactor post_process()-function to take the entire property-array
       
       This does not make much of a difference, but gives enough flexibility
       for a later change to incorporate the bidi-bracket-property into the
       bidi-LUT.
       
       Signed-off-by: Laslo Hunhold <dev@frign.de>
       
       Diffstat:
         M gen/line.c                          |      88 ++++++++++++++++---------------
         M gen/util.c                          |      13 ++++---------
         M gen/util.h                          |       4 ++--
       
       3 files changed, 51 insertions(+), 54 deletions(-)
       ---
 (DIR) diff --git a/gen/line.c b/gen/line.c
       @@ -392,55 +392,57 @@ handle_conflict(uint_least32_t cp, uint_least8_t prop1, uint_least8_t prop2)
                return result;
        }
        
       -static uint_least8_t
       -post_process(uint_least32_t cp, uint_least8_t prop)
       +static void
       +post_process(struct properties *prop)
        {
       -        const char *target = NULL;
       +        const char *target;
                uint_least8_t result;
       +        size_t i;
        
       -        (void)cp;
       -
       -        /* LB1 */
       -        if (!strcmp(line_break_property[prop].enumname, "TMP_AI") ||
       -            !strcmp(line_break_property[prop].enumname, "TMP_SG") ||
       -            !strcmp(line_break_property[prop].enumname, "TMP_XX")) {
       -                /* map AI, SG and XX to AL */
       -                target = "AL";
       -        } else if (!strcmp(line_break_property[prop].enumname, "TMP_SA_WITH_MN_OR_MC")) {
       -                /* map SA (with General_Category Mn or Mc) to CM */
       -                target = "CM";
       -        } else if (!strcmp(line_break_property[prop].enumname, "TMP_SA_WITHOUT_MN_OR_MC")) {
       -                /* map SA (without General_Category Mn or Mc) to AL */
       -                target = "AL";
       -        } else if (!strcmp(line_break_property[prop].enumname, "TMP_CJ")) {
       -                /* map CJ to NS */
       -                target = "NS";
       -        } else if (!strcmp(line_break_property[prop].enumname, "TMP_CN") ||
       -                   !strcmp(line_break_property[prop].enumname, "TMP_EXTENDED_PICTOGRAPHIC") ||
       -                   !strcmp(line_break_property[prop].enumname, "TMP_MN") ||
       -                   !strcmp(line_break_property[prop].enumname, "TMP_MC") ||
       -                   !strcmp(line_break_property[prop].enumname, "TMP_EAW_H") ||
       -                   !strcmp(line_break_property[prop].enumname, "TMP_EAW_W") ||
       -                   !strcmp(line_break_property[prop].enumname, "TMP_EAW_F")) {
       -                /* map all the temporary classes "residue" to AL */
       -                target = "AL";
       -        }
       +        /* post-mapping according to the line breaking algorithm */
       +        for (i = 0; i < UINT32_C(0x110000); i++) {
       +                /* LB1 */
       +                if (!strcmp(line_break_property[prop[i].property].enumname, "TMP_AI") ||
       +                    !strcmp(line_break_property[prop[i].property].enumname, "TMP_SG") ||
       +                    !strcmp(line_break_property[prop[i].property].enumname, "TMP_XX")) {
       +                        /* map AI, SG and XX to AL */
       +                        target = "AL";
       +                } else if (!strcmp(line_break_property[prop[i].property].enumname, "TMP_SA_WITH_MN_OR_MC")) {
       +                        /* map SA (with General_Category Mn or Mc) to CM */
       +                        target = "CM";
       +                } else if (!strcmp(line_break_property[prop[i].property].enumname, "TMP_SA_WITHOUT_MN_OR_MC")) {
       +                        /* map SA (without General_Category Mn or Mc) to AL */
       +                        target = "AL";
       +                } else if (!strcmp(line_break_property[prop[i].property].enumname, "TMP_CJ")) {
       +                        /* map CJ to NS */
       +                        target = "NS";
       +                } else if (!strcmp(line_break_property[prop[i].property].enumname, "TMP_CN") ||
       +                           !strcmp(line_break_property[prop[i].property].enumname, "TMP_EXTENDED_PICTOGRAPHIC") ||
       +                           !strcmp(line_break_property[prop[i].property].enumname, "TMP_MN") ||
       +                           !strcmp(line_break_property[prop[i].property].enumname, "TMP_MC") ||
       +                           !strcmp(line_break_property[prop[i].property].enumname, "TMP_EAW_H") ||
       +                           !strcmp(line_break_property[prop[i].property].enumname, "TMP_EAW_W") ||
       +                           !strcmp(line_break_property[prop[i].property].enumname, "TMP_EAW_F")) {
       +                        /* map all the temporary classes "residue" to AL */
       +                        target = "AL";
       +                } else {
       +                        target = NULL;
       +                }
        
       -        if (target) {
       -                for (result = 0; result < LEN(line_break_property); result++) {
       -                        if (!strcmp(line_break_property[result].enumname,
       -                                    target)) {
       -                                break;
       +                if (target) {
       +                        for (result = 0; result < LEN(line_break_property); result++) {
       +                                if (!strcmp(line_break_property[result].enumname,
       +                                            target)) {
       +                                        break;
       +                                }
       +                        }
       +                        if (result == LEN(line_break_property)) {
       +                                fprintf(stderr, "handle_conflict: Internal error.\n");
       +                                exit(1);
                                }
       -                }
       -                if (result == LEN(line_break_property)) {
       -                        fprintf(stderr, "handle_conflict: Internal error.\n");
       -                        exit(1);
       -                }
        
       -                return result;
       -        } else {
       -                return prop;
       +                        prop[i].property = result;
       +                }
                }
        }
        
 (DIR) diff --git a/gen/util.c b/gen/util.c
       @@ -495,10 +495,9 @@ properties_generate_break_property(const struct property_spec *spec,
                                           uint_least32_t),
                                           uint_least8_t (*handle_conflict)(
                                           uint_least32_t, uint_least8_t,
       -                                   uint_least8_t), uint_least8_t
       -                                   (*post_process)(uint_least32_t,
       -                                   uint_least8_t), const char *prefix,
       -                                   const char *argv0)
       +                                   uint_least8_t), void
       +                                   (*post_process)(struct properties *),
       +                                   const char *prefix, const char *argv0)
        {
                struct properties_compressed comp;
                struct properties_major_minor mm;
       @@ -556,11 +555,7 @@ properties_generate_break_property(const struct property_spec *spec,
        
                /* post-processing */
                if (post_process != NULL) {
       -                for (i = 0; i < UINT32_C(0x110000); i++) {
       -                        payload.prop[i].property =
       -                                post_process((uint_least32_t)i,
       -                                             (uint_least8_t)payload.prop[i].property);
       -                }
       +                post_process(payload.prop);
                }
        
                /* compress data */
 (DIR) diff --git a/gen/util.h b/gen/util.h
       @@ -51,8 +51,8 @@ void properties_generate_break_property(const struct property_spec *,
                                                uint_least8_t
                                                (*handle_conflict)(uint_least32_t,
                                                uint_least8_t, uint_least8_t),
       -                                        uint_least8_t (*post_process)
       -                                        (uint_least32_t, uint_least8_t),
       +                                        void (*post_process)
       +                                        (struct properties *),
                                                const char *, const char *);
        
        void break_test_list_parse(char *, struct break_test **, size_t *);