Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-31069

Reuse duplicate char-to-weight conversion code in ctype-utf8.c and ctype-ucs2.c

    XMLWordPrintable

Details

    Description

      Files ctype-utf8.c and ctype-ucs2.c have very similar pieces of the code:

      static inline void
      my_tosort_utf16(MY_UNICASE_INFO *uni_plane, my_wc_t *wc)
      {
        if (*wc <= uni_plane->maxchar)
        {
          MY_UNICASE_CHARACTER *page;
          if ((page= uni_plane->page[*wc >> 8]))
            *wc= page[*wc & 0xFF].sort;
        }
        else
        {
          *wc= MY_CS_REPLACEMENT_CHARACTER;
        }
      }
      

      static inline void
      my_tosort_utf32(MY_UNICASE_INFO *uni_plane, my_wc_t *wc)
      {
        if (*wc <= uni_plane->maxchar)
        {
          MY_UNICASE_CHARACTER *page;
          if ((page= uni_plane->page[*wc >> 8]))
            *wc= page[*wc & 0xFF].sort;
        }
        else
        {
          *wc= MY_CS_REPLACEMENT_CHARACTER;
        }
      }
      

      static inline void
      my_tosort_ucs2(MY_UNICASE_INFO *uni_plane, my_wc_t *wc)
      {
        MY_UNICASE_CHARACTER *page;
        if ((page= uni_plane->page[(*wc >> 8) & 0xFF]))
          *wc= page[*wc & 0xFF].sort;
      }
      

      static inline void
      my_tosort_unicode(MY_UNICASE_INFO *uni_plane, my_wc_t *wc, uint flags)
      {
        if (*wc <= uni_plane->maxchar)
        {
          MY_UNICASE_CHARACTER *page;
          if ((page= uni_plane->page[*wc >> 8]))
            *wc= (flags & MY_CS_LOWER_SORT) ?
                 page[*wc & 0xFF].tolower :
                 page[*wc & 0xFF].sort;
        }
        else
        {
          *wc= MY_CS_REPLACEMENT_CHARACTER;
        }
      }
      

      In order to simplify the patch for MDEV-30577 lets move the repeatable code to a shared file ctype-unidata.h:

      static inline void my_tosort_unicode_bmp(const MY_UNICASE_INFO *uni_plane,
                                               my_wc_t *wc)
      {
        const MY_UNICASE_CHARACTER *page;
        DBUG_ASSERT(*wc <= uni_plane->maxchar);
        if ((page= uni_plane->page[*wc >> 8]))
          *wc= page[*wc & 0xFF].sort;
      }
      

       

      static inline void my_tosort_unicode(const MY_UNICASE_INFO *uni_plane,
      my_wc_t *wc)
      {
      if (*wc <= uni_plane->maxchar)

      { const MY_UNICASE_CHARACTER *page; if ((page= uni_plane->page[*wc >> 8])) *wc= page[*wc & 0xFF].sort; }

      else

      { *wc= MY_CS_REPLACEMENT_CHARACTER; }

      }

       

      Attachments

        Issue Links

          Activity

            People

              bar Alexander Barkov
              bar Alexander Barkov
              Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:

                Git Integration

                  Error rendering 'com.xiplink.jira.git.jira_git_plugin:git-issue-webpanel'. Please contact your Jira administrators.