diff options
Diffstat (limited to 'lib/unilbrk/u16-possible-linebreaks.c')
| -rw-r--r-- | lib/unilbrk/u16-possible-linebreaks.c | 67 | 
1 files changed, 64 insertions, 3 deletions
| diff --git a/lib/unilbrk/u16-possible-linebreaks.c b/lib/unilbrk/u16-possible-linebreaks.c index 2b79d6aa..6a9c15b7 100644 --- a/lib/unilbrk/u16-possible-linebreaks.c +++ b/lib/unilbrk/u16-possible-linebreaks.c @@ -1,5 +1,5 @@  /* Line breaking of UTF-16 strings. -   Copyright (C) 2001-2003, 2006-2022 Free Software Foundation, Inc. +   Copyright (C) 2001-2003, 2006-2024 Free Software Foundation, Inc.     Written by Bruno Haible <bruno@clisp.org>, 2001.     This file is free software. @@ -62,6 +62,7 @@ u16_possible_linebreaks_loop (const uint16_t *s, size_t n, const char *encoding,          {            ucs4_t uc;            int count = u16_mbtouc_unsafe (&uc, s, s_end - s); +          s += count;            int prop = unilbrkprop_lookup (uc);            if (prop == LBP_BK || prop == LBP_LF || prop == LBP_CR) @@ -96,6 +97,62 @@ u16_possible_linebreaks_loop (const uint16_t *s, size_t n, const char *encoding,                    /* This is arbitrary.  */                    prop = LBP_AL;                    break; +                case LBP_QU2: +                  /* For (LB15a): Replace LBP_QU2 with LBP_QU1 if the previous +                     character's line break property was not one of +                     BK, CR, LF, OP, QU, GL, SP, ZW.  */ +                  switch (prev_prop) +                    { +                    case LBP_BK: +                    case LBP_CR: +                    case LBP_LF: +                    case LBP_OP1: case LBP_OP2: +                    case LBP_QU1: case LBP_QU2: case LBP_QU3: +                    case LBP_GL: +                    case LBP_SP: +                    case LBP_ZW: +                      break; +                    default: +                      prop = LBP_QU1; +                      break; +                    } +                  break; +                case LBP_QU3: +                  /* For (LB15b): Replace LBP_QU3 with LBP_QU1 if the next +                     character's line break property is not one of +                     BK, CR, LF, SP, GL, WJ, CL, QU, CP, EX, IS, SY, ZW.  */ +                  { +                    int next_prop; +                    if (s < s_end) +                      { +                        ucs4_t next_uc; +                        (void) u16_mbtouc_unsafe (&next_uc, s, s_end - s); +                        next_prop = unilbrkprop_lookup (next_uc); +                      } +                    else +                      next_prop = LBP_BK; +                    switch (next_prop) +                      { +                      case LBP_BK: +                      case LBP_CR: +                      case LBP_LF: +                      case LBP_SP: +                      case LBP_GL: +                      case LBP_WJ: +                      case LBP_CL: +                      case LBP_QU1: case LBP_QU2: case LBP_QU3: +                      case LBP_CP1: case LBP_CP2: +                      case LBP_EX: +                      case LBP_IS: +                      case LBP_SY: +                      case LBP_ZW: +                        break; +                      default: +                        prop = LBP_QU1; +                        break; +                      } +                  } +                  break;                  }                /* Deal with spaces and combining characters.  */ @@ -209,14 +266,16 @@ u16_possible_linebreaks_loop (const uint16_t *s, size_t n, const char *encoding,            else              ri_count = 0; -          s += count;            p += count;          }        while (s < s_end);      }  } -#undef u16_possible_linebreaks +#if defined IN_LIBUNISTRING +/* For backward compatibility with older versions of libunistring.  */ + +# undef u16_possible_linebreaks  void  u16_possible_linebreaks (const uint16_t *s, size_t n, const char *encoding, @@ -225,6 +284,8 @@ u16_possible_linebreaks (const uint16_t *s, size_t n, const char *encoding,    u16_possible_linebreaks_loop (s, n, encoding, -1, p);  } +#endif +  void  u16_possible_linebreaks_v2 (const uint16_t *s, size_t n, const char *encoding,                              char *p) | 
