diff options
Diffstat (limited to 'lib/unilbrk/u8-width-linebreaks.c')
-rw-r--r-- | lib/unilbrk/u8-width-linebreaks.c | 82 |
1 files changed, 55 insertions, 27 deletions
diff --git a/lib/unilbrk/u8-width-linebreaks.c b/lib/unilbrk/u8-width-linebreaks.c index 19ab9ba2..34d949bb 100644 --- a/lib/unilbrk/u8-width-linebreaks.c +++ b/lib/unilbrk/u8-width-linebreaks.c @@ -1,49 +1,50 @@ /* Line breaking of UTF-8 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 -u8_width_linebreaks (const uint8_t *s, size_t n, - int width, int start_column, int at_end_columns, - const char *o, const char *encoding, - char *p) +u8_width_linebreaks_internal (const uint8_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 uint8_t *s_end; char *last_p; int last_column; int piece_width; - u8_possible_linebreaks (s, n, encoding, p); + u8_possible_linebreaks_loop (s, n, encoding, cr, p); s_end = s + n; last_p = NULL; @@ -58,7 +59,8 @@ u8_width_linebreaks (const uint8_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 @@ u8_width_linebreaks (const uint8_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. */ @@ -116,6 +118,30 @@ u8_width_linebreaks (const uint8_t *s, size_t n, return last_column + piece_width; } +#undef u8_width_linebreaks + +int +u8_width_linebreaks (const uint8_t *s, size_t n, + int width, int start_column, int at_end_columns, + const char *o, const char *encoding, + char *p) +{ + return u8_width_linebreaks_internal (s, n, + width, start_column, at_end_columns, + o, encoding, -1, p); +} + +int +u8_width_linebreaks_v2 (const uint8_t *s, size_t n, + int width, int start_column, int at_end_columns, + const char *o, const char *encoding, + char *p) +{ + return u8_width_linebreaks_internal (s, n, + width, start_column, at_end_columns, + o, encoding, LBP_CR, p); +} + #ifdef TEST @@ -183,7 +209,7 @@ main (int argc, char * argv[]) char *breaks = malloc (length); int i; - u8_width_linebreaks ((uint8_t *) input, length, width, 0, 0, NULL, "UTF-8", breaks); + u8_width_linebreaks_v2 ((uint8_t *) input, length, width, 0, 0, NULL, "UTF-8", breaks); for (i = 0; i < length; i++) { @@ -194,6 +220,8 @@ main (int argc, char * argv[]) break; case UC_BREAK_MANDATORY: break; + case UC_BREAK_CR_BEFORE_LF: + break; case UC_BREAK_PROHIBITED: break; default: |