1 /* Determine number of screen columns needed for a size-bounded wide string.
2    Copyright (C) 1999, 2011-2018 Free Software Foundation, Inc.
3    Written by Bruno Haible <bruno@clisp.org>, 1999.
4 
5    This program is free software: you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 3 of the License, or
8    (at your option) any later version.
9 
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14 
15    You should have received a copy of the GNU General Public License
16    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
17 
18 int
wcswidth(const wchar_t * s,size_t n)19 wcswidth (const wchar_t *s, size_t n)
20 {
21   int count = 0;
22   for (; n > 0; s++, n--)
23     {
24       wchar_t c = *s;
25       if (c == (wchar_t)'\0')
26         break;
27       {
28         int width = wcwidth (c);
29         if (width < 0)
30           goto found_nonprinting;
31         if (width > INT_MAX - count)
32           goto overflow;
33         count += width;
34       }
35     }
36   return count;
37 
38  found_nonprinting:
39   return -1;
40 
41  overflow:
42   return INT_MAX;
43 }
44