1
0
mirror of https://https.git.savannah.gnu.org/git/gnulib.git synced 2026-06-15 15:25:49 +00:00
Files
Bruno Haible f1d55e9f84 Use countof, part 2.
Done through  sed -e 's/SIZEOF \([(][^()]*[)]\)/countof \1/g'

* lib/boot-time.c: Include <stdcountof.h>.
* lib/readutmp.c: Include <stdcountof.h>.
* lib/boot-time-aux.h (get_linux_boot_time_fallback,
get_openbsd_boot_time, get_windows_boot_time): Use countof.
* lib/duplocale.c: Include <stdcountof.h>.
(SIZEOF): Remove macro.
(duplocale): Use countof instead.
* lib/fatal-signal.c: Include <stdcountof.h>.
(SIZEOF): Remove macro.
(num_fatal_signals, actions_allocated): Use countof instead.
* lib/iconv_open.c: Include <stdcountof.h>.
(SIZEOF): Remove macro.
(rpl_iconv_open): Use countof instead.
* lib/term-style-control.c: Include <stdcountof.h>.
(SIZEOF): Remove macro.
(num_job_control_signals): Use countof instead.
* lib/uniconv/u16-conv-to-enc.c: Include <stdcountof.h>.
(SIZEOF): Remove macro.
* lib/uniconv/u32-conv-to-enc.c: Include <stdcountof.h>.
(SIZEOF): Remove macro.
* lib/uniconv/u-conv-to-enc.h (FUNC): Use countof instead.
* lib/uniconv/u16-strconv-to-enc.c: Include <stdcountof.h>.
(SIZEOF): Remove macro.
* lib/uniconv/u32-strconv-to-enc.c: Include <stdcountof.h>.
(SIZEOF): Remove macro.
* lib/uniconv/u-strconv-to-enc.h (FUNC): Use countof instead.
* lib/uniname/uniname.c: Include <stdcountof.h>.
(SIZEOF): Remove macro.
(unicode_name_word, unicode_name_word_lookup, unicode_code_to_index,
unicode_index_to_code, unicode_character_name, unicode_name_character):
Use countof instead.
* lib/uniwidth/width.c: Include <stdcountof.h>.
(SIZEOF): Remove macro.
(uc_width): Use countof instead.
* lib/wait-process.c: Include <stdcountof.h>.
(SIZEOF): Remove macro.
(slaves_allocated): Use countof instead.
* lib/gen-uni-tables.c (countof): Renamed from SIZEOF.
* modules/boot-time (Depends-on): Add stdcountof-h.
* modules/readutmp (Depends-on): Likewise.
* modules/duplocale (Depends-on): Likewise.
* modules/fatal-signal (Depends-on): Likewise.
* modules/iconv_open (Depends-on): Likewise.
* modules/term-style-control (Depends-on): Likewise.
* modules/uniconv/u16-conv-to-enc (Depends-on): Likewise.
* modules/uniconv/u32-conv-to-enc (Depends-on): Likewise.
* modules/uniconv/u16-strconv-to-enc (Depends-on): Likewise.
* modules/uniconv/u32-strconv-to-enc (Depends-on): Likewise.
* modules/uniname/uniname (Depends-on): Likewise.
* modules/uniwidth/width (Depends-on): Likewise.
* modules/wait-process (Depends-on): Likewise.
* tests/macros.h (SIZEOF): Remove macro.
* tests/**/*.[hc]: Use countof instead of SIZEOF. Include <stdcountof.h>
as needed.
* modules/**/*-tests (Depends-on): Add stdcountof-h if needed.
2026-03-02 14:35:26 +01:00

96 lines
3.2 KiB
C

/* Determine display width of Unicode character.
Copyright (C) 2001-2002, 2006-2026 Free Software Foundation, Inc.
Written by Bruno Haible <bruno@clisp.org>, 2002.
This file is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation; either version 2.1 of the
License, or (at your option) any later version.
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.
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/>. */
#include <config.h>
/* Specification. */
#include "uniwidth.h"
#include <stdcountof.h>
#include "cjk.h"
/* The non-spacing attribute table consists of:
* Non-spacing characters; generated from PropList.txt or
"grep '^[^;]*;[^;]*;[^;]*;[^;]*;NSM;' UnicodeData.txt"
* Format control characters; generated from
"grep '^[^;]*;[^;]*;Cf;' UnicodeData.txt"
* Zero width characters; generated from
"grep '^[^;]*;ZERO WIDTH ' UnicodeData.txt"
* Hangul Jamo characters that have conjoining behaviour:
- jungseong = syllable-middle vowels
- jongseong = syllable-final consonants
Rationale:
1) These characters act like combining characters. They have no
equivalent in legacy character sets. Therefore the EastAsianWidth.txt
file does not really matter for them; UAX #11 East Asian Width
<https://www.unicode.org/reports/tr11/> makes it clear that it focus
is on compatibility with traditional Japanese layout.
By contrast, the same glyphs without conjoining behaviour are available
in the U+3130..U+318F block, and these characters are mapped to legacy
character sets, and traditional Japanese layout matters for them.
2) glibc does the same thing, see
<https://sourceware.org/PR21750>
<https://sourceware.org/PR26120>
*/
#include "uniwidth/width0.h"
#include "uniwidth/width2.h"
#include "unictype/bitmap.h"
/* Determine number of column positions required for UC. */
int
uc_width (ucs4_t uc, const char *encoding)
{
/* Test for non-spacing or control character. */
if ((uc >> 9) < countof (nonspacing_table_ind))
{
int ind = nonspacing_table_ind[uc >> 9];
if (ind >= 0)
if ((nonspacing_table_data[64*ind + ((uc >> 3) & 63)] >> (uc & 7)) & 1)
{
if (uc > 0 && uc < 0xa0)
return -1;
else
return 0;
}
}
else if ((uc >> 9) == (0xe0000 >> 9))
{
if (uc >= 0xe0100)
{
if (uc <= 0xe01ef)
return 0;
}
else
{
if (uc >= 0xe0020 ? uc <= 0xe007f : uc == 0xe0001)
return 0;
}
}
/* Test for double-width character. */
if (bitmap_lookup (&u_width2, uc))
return 2;
/* In ancient CJK encodings, Cyrillic and most other characters are
double-width as well. */
if (uc >= 0x00A1 && uc < 0xFF61 && uc != 0x20A9
&& is_cjk_encoding (encoding))
return 2;
return 1;
}