diff options
Diffstat (limited to 'lib/unilbrk/u16-width-linebreaks.c')
-rw-r--r-- | lib/unilbrk/u16-width-linebreaks.c | 80 |
1 files changed, 53 insertions, 27 deletions
diff --git a/lib/unilbrk/u16-width-linebreaks.c b/lib/unilbrk/u16-width-linebreaks.c index 1f033359..592cb5a3 100644 --- a/lib/unilbrk/u16-width-linebreaks.c +++ b/lib/unilbrk/u16-width-linebreaks.c @@ -1,49 +1,50 @@ /* Line breaking of UTF-16 strings. - Copyright (C) 2001-2003, 2006-2018 Free Software Foundation, Inc. + Copyright (C) 2001-2003, 2006-2022 Free Software Foundation, Inc. Written by Bruno Haible <bruno@clisp.org>, 2001. - This program is free software: you can redistribute it and/or - modify it under the terms of either: - - * the GNU Lesser General Public License as published by the Free - Software Foundation; either version 3 of the License, or (at your - option) any later version. - - or - - * the GNU General Public License as published by the Free - Software Foundation; either version 2 of the License, or (at your - option) any later version. - - or both in parallel, as here. - This program is distributed in the hope that it will be useful, + This file is free software. + It is dual-licensed under "the GNU LGPLv3+ or the GNU GPLv2+". + You can redistribute it and/or modify it under either + - the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 3, or (at your + option) any later version, or + - the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) + any later version, or + - the same dual license "the GNU LGPLv3+ or the GNU GPLv2+". + + This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. + Lesser General Public License and the GNU General Public License + for more details. - You should have received a copy of the GNU Lesser General Public License - along with this program. If not, see <https://www.gnu.org/licenses/>. */ + You should have received a copy of the GNU Lesser General Public + License and of the GNU General Public License along with this + program. If not, see <https://www.gnu.org/licenses/>. */ #include <config.h> /* Specification. */ #include "unilbrk.h" +#include "unilbrk/internal.h" +#include "unilbrk/lbrktables.h" #include "unistr.h" #include "uniwidth.h" -int -u16_width_linebreaks (const uint16_t *s, size_t n, - int width, int start_column, int at_end_columns, - const char *o, const char *encoding, - char *p) +static int +u16_width_linebreaks_internal (const uint16_t *s, size_t n, + int width, int start_column, int at_end_columns, + const char *o, const char *encoding, int cr, + char *p) { const uint16_t *s_end; char *last_p; int last_column; int piece_width; - u16_possible_linebreaks (s, n, encoding, p); + u16_possible_linebreaks_loop (s, n, encoding, cr, p); s_end = s + n; last_p = NULL; @@ -58,7 +59,8 @@ u16_width_linebreaks (const uint16_t *s, size_t n, if (o != NULL && *o != UC_BREAK_UNDEFINED) *p = *o; - if (*p == UC_BREAK_POSSIBLE || *p == UC_BREAK_MANDATORY) + if (*p == UC_BREAK_POSSIBLE + || *p == UC_BREAK_MANDATORY || *p == UC_BREAK_CR_BEFORE_LF) { /* An atomic piece of text ends here. */ if (last_p != NULL && last_column + piece_width > width) @@ -69,7 +71,7 @@ u16_width_linebreaks (const uint16_t *s, size_t n, } } - if (*p == UC_BREAK_MANDATORY) + if (*p == UC_BREAK_MANDATORY || *p == UC_BREAK_CR_BEFORE_LF) { /* uc is a line break character. */ /* Start a new piece at column 0. */ @@ -115,3 +117,27 @@ u16_width_linebreaks (const uint16_t *s, size_t n, return last_column + piece_width; } + +#undef u16_width_linebreaks + +int +u16_width_linebreaks (const uint16_t *s, size_t n, + int width, int start_column, int at_end_columns, + const char *o, const char *encoding, + char *p) +{ + return u16_width_linebreaks_internal (s, n, + width, start_column, at_end_columns, + o, encoding, -1, p); +} + +int +u16_width_linebreaks_v2 (const uint16_t *s, size_t n, + int width, int start_column, int at_end_columns, + const char *o, const char *encoding, + char *p) +{ + return u16_width_linebreaks_internal (s, n, + width, start_column, at_end_columns, + o, encoding, LBP_CR, p); +} |