OpenCoverage

mbutil.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/bash/src/lib/readline/mbutil.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* mbutil.c -- readline multibyte character utility functions */-
2-
3/* Copyright (C) 2001-2017 Free Software Foundation, Inc.-
4-
5 This file is part of the GNU Readline Library (Readline), a library-
6 for reading lines of text with interactive input and history editing. -
7-
8 Readline is free software: you can redistribute it and/or modify-
9 it under the terms of the GNU General Public License as published by-
10 the Free Software Foundation, either version 3 of the License, or-
11 (at your option) any later version.-
12-
13 Readline is distributed in the hope that it will be useful,-
14 but WITHOUT ANY WARRANTY; without even the implied warranty of-
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the-
16 GNU General Public License for more details.-
17-
18 You should have received a copy of the GNU General Public License-
19 along with Readline. If not, see <http://www.gnu.org/licenses/>.-
20*/-
21-
22#define READLINE_LIBRARY-
23-
24#if defined (HAVE_CONFIG_H)-
25# include <config.h>-
26#endif-
27-
28#include <sys/types.h>-
29#include <fcntl.h>-
30#include "posixjmp.h"-
31-
32#if defined (HAVE_UNISTD_H)-
33# include <unistd.h> /* for _POSIX_VERSION */-
34#endif /* HAVE_UNISTD_H */-
35-
36#if defined (HAVE_STDLIB_H)-
37# include <stdlib.h>-
38#else-
39# include "ansi_stdlib.h"-
40#endif /* HAVE_STDLIB_H */-
41-
42#include <stdio.h>-
43#include <ctype.h>-
44-
45/* System-specific feature definitions and include files. */-
46#include "rldefs.h"-
47#include "rlmbutil.h"-
48-
49#if defined (TIOCSTAT_IN_SYS_IOCTL)-
50# include <sys/ioctl.h>-
51#endif /* TIOCSTAT_IN_SYS_IOCTL */-
52-
53/* Some standard library routines. */-
54#include "readline.h"-
55-
56#include "rlprivate.h"-
57#include "xmalloc.h"-
58-
59/* Declared here so it can be shared between the readline and history-
60 libraries. */-
61#if defined (HANDLE_MULTIBYTE)-
62int rl_byte_oriented = 0;-
63#else-
64int rl_byte_oriented = 1;-
65#endif-
66-
67/* Ditto */-
68int _rl_utf8locale = 0;-
69-
70/* **************************************************************** */-
71/* */-
72/* Multibyte Character Utility Functions */-
73/* */-
74/* **************************************************************** */-
75-
76#if defined(HANDLE_MULTIBYTE)-
77-
78static int-
79_rl_find_next_mbchar_internal (char *string, int seed, int count, int find_non_zero)-
80{-
81 size_t tmp, len;-
82 mbstate_t ps;-
83 int point;-
84 wchar_t wc;-
85-
86 tmp = 0;-
87-
88 memset(&ps, 0, sizeof (mbstate_t));-
89 if (seed < 0)
seed < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
90 seed = 0;
never executed: seed = 0;
0
91 if (count <= 0)
count <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
92 return seed;
never executed: return seed;
0
93-
94 point = seed + _rl_adjust_point (string, seed, &ps);-
95 /* if _rl_adjust_point returns -1, the character or string is invalid.-
96 treat as a byte. */-
97 if (point == seed - 1) /* invalid */
point == seed - 1Description
TRUEnever evaluated
FALSEnever evaluated
0
98 return seed + 1;
never executed: return seed + 1;
0
99 -
100 /* if this is true, means that seed was not pointing to a byte indicating-
101 the beginning of a multibyte character. Correct the point and consume-
102 one char. */-
103 if (seed < point)
seed < pointDescription
TRUEnever evaluated
FALSEnever evaluated
0
104 count--;
never executed: count--;
0
105-
106 while (count > 0)
count > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
107 {-
108 len = strlen (string + point);-
109 if (len == 0)
len == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
110 break;
never executed: break;
0
111 if (_rl_utf8locale && UTF8_SINGLEBYTE(string[point]))
_rl_utf8localeDescription
TRUEnever evaluated
FALSEnever evaluated
(((string[poin... & 0x80) == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
112 {-
113 tmp = 1;-
114 wc = (wchar_t) string[point];-
115 memset(&ps, 0, sizeof(mbstate_t));-
116 }
never executed: end of block
0
117 else-
118 tmp = mbrtowc (&wc, string+point, len, &ps);
never executed: tmp = mbrtowc (&wc, string+point, len, &ps);
0
119 if (MB_INVALIDCH ((size_t)tmp))
((size_t)tmp) == (size_t)-1Description
TRUEnever evaluated
FALSEnever evaluated
((size_t)tmp) == (size_t)-2Description
TRUEnever evaluated
FALSEnever evaluated
0
120 {-
121 /* invalid bytes. assume a byte represents a character */-
122 point++;-
123 count--;-
124 /* reset states. */-
125 memset(&ps, 0, sizeof(mbstate_t));-
126 }
never executed: end of block
0
127 else if (MB_NULLWCH (tmp))
((tmp) == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
128 break; /* found wide '\0' */
never executed: break;
0
129 else-
130 {-
131 /* valid bytes */-
132 point += tmp;-
133 if (find_non_zero)
find_non_zeroDescription
TRUEnever evaluated
FALSEnever evaluated
0
134 {-
135 if (WCWIDTH (wc) == 0)
_rl_wcwidth(wc) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
136 continue;
never executed: continue;
0
137 else-
138 count--;
never executed: count--;
0
139 }-
140 else-
141 count--;
never executed: count--;
0
142 }-
143 }-
144-
145 if (find_non_zero)
find_non_zeroDescription
TRUEnever evaluated
FALSEnever evaluated
0
146 {-
147 tmp = mbrtowc (&wc, string + point, strlen (string + point), &ps);-
148 while (MB_NULLWCH (tmp) == 0 && MB_INVALIDCH (tmp) == 0 && WCWIDTH (wc) == 0)
((tmp) == 0) == 0Description
TRUEnever evaluated
FALSEnever evaluated
((tmp) == (siz...ize_t)-2) == 0Description
TRUEnever evaluated
FALSEnever evaluated
(tmp) == (size_t)-1Description
TRUEnever evaluated
FALSEnever evaluated
(tmp) == (size_t)-2Description
TRUEnever evaluated
FALSEnever evaluated
_rl_wcwidth(wc) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
149 {-
150 point += tmp;-
151 tmp = mbrtowc (&wc, string + point, strlen (string + point), &ps);-
152 }
never executed: end of block
0
153 }
never executed: end of block
0
154-
155 return point;
never executed: return point;
0
156}-
157-
158/*static*/ int-
159_rl_find_prev_mbchar_internal (char *string, int seed, int find_non_zero)-
160{-
161 mbstate_t ps;-
162 int prev, non_zero_prev, point, length;-
163 size_t tmp;-
164 wchar_t wc;-
165-
166 memset(&ps, 0, sizeof(mbstate_t));-
167 length = strlen(string);-
168 -
169 if (seed < 0)
seed < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
170 return 0;
never executed: return 0;
0
171 else if (length < seed)
length < seedDescription
TRUEnever evaluated
FALSEnever evaluated
0
172 return length;
never executed: return length;
0
173-
174 prev = non_zero_prev = point = 0;-
175 while (point < seed)
point < seedDescription
TRUEnever evaluated
FALSEnever evaluated
0
176 {-
177 if (_rl_utf8locale && UTF8_SINGLEBYTE(string[point]))
_rl_utf8localeDescription
TRUEnever evaluated
FALSEnever evaluated
(((string[poin... & 0x80) == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
178 {-
179 tmp = 1;-
180 wc = (wchar_t) string[point];-
181 memset(&ps, 0, sizeof(mbstate_t));-
182 }
never executed: end of block
0
183 else-
184 tmp = mbrtowc (&wc, string + point, length - point, &ps);
never executed: tmp = mbrtowc (&wc, string + point, length - point, &ps);
0
185 if (MB_INVALIDCH ((size_t)tmp))
((size_t)tmp) == (size_t)-1Description
TRUEnever evaluated
FALSEnever evaluated
((size_t)tmp) == (size_t)-2Description
TRUEnever evaluated
FALSEnever evaluated
0
186 {-
187 /* in this case, bytes are invalid or too short to compose-
188 multibyte char, so assume that the first byte represents-
189 a single character anyway. */-
190 tmp = 1;-
191 /* clear the state of the byte sequence, because-
192 in this case effect of mbstate is undefined */-
193 memset(&ps, 0, sizeof (mbstate_t));-
194-
195 /* Since we're assuming that this byte represents a single-
196 non-zero-width character, don't forget about it. */-
197 prev = point;-
198 }
never executed: end of block
0
199 else if (MB_NULLWCH (tmp))
((tmp) == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
200 break; /* Found '\0' char. Can this happen? */
never executed: break;
0
201 else-
202 {-
203 if (find_non_zero)
find_non_zeroDescription
TRUEnever evaluated
FALSEnever evaluated
0
204 {-
205 if (WCWIDTH (wc) != 0)
_rl_wcwidth(wc) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
206 prev = point;
never executed: prev = point;
0
207 }
never executed: end of block
0
208 else-
209 prev = point;
never executed: prev = point;
0
210 }-
211-
212 point += tmp;-
213 }
never executed: end of block
0
214-
215 return prev;
never executed: return prev;
0
216}-
217-
218/* return the number of bytes parsed from the multibyte sequence starting-
219 at src, if a non-L'\0' wide character was recognized. It returns 0, -
220 if a L'\0' wide character was recognized. It returns (size_t)(-1), -
221 if an invalid multibyte sequence was encountered. It returns (size_t)(-2) -
222 if it couldn't parse a complete multibyte character. */-
223int-
224_rl_get_char_len (char *src, mbstate_t *ps)-
225{-
226 size_t tmp, l;-
227 int mb_cur_max;-
228-
229 /* Look at no more than MB_CUR_MAX characters */-
230 l = (size_t)strlen (src);-
231 mb_cur_max = MB_CUR_MAX;-
232 tmp = mbrlen((const char *)src, (l < mb_cur_max) ? l : mb_cur_max, ps);-
233 if (tmp == (size_t)(-2))
tmp == (size_t)(-2)Description
TRUEnever evaluated
FALSEevaluated 26 times by 1 test
Evaluated by:
  • Self test
0-26
234 {-
235 /* shorted to compose multibyte char */-
236 if (ps)
psDescription
TRUEnever evaluated
FALSEnever evaluated
0
237 memset (ps, 0, sizeof(mbstate_t));
never executed: memset (ps, 0, sizeof(mbstate_t));
0
238 return -2;
never executed: return -2;
0
239 }-
240 else if (tmp == (size_t)(-1))
tmp == (size_t)(-1)Description
TRUEnever evaluated
FALSEevaluated 26 times by 1 test
Evaluated by:
  • Self test
0-26
241 {-
242 /* invalid to compose multibyte char */-
243 /* initialize the conversion state */-
244 if (ps)
psDescription
TRUEnever evaluated
FALSEnever evaluated
0
245 memset (ps, 0, sizeof(mbstate_t));
never executed: memset (ps, 0, sizeof(mbstate_t));
0
246 return -1;
never executed: return -1;
0
247 }-
248 else if (tmp == (size_t)0)
tmp == (size_t)0Description
TRUEnever evaluated
FALSEevaluated 26 times by 1 test
Evaluated by:
  • Self test
0-26
249 return 0;
never executed: return 0;
0
250 else-
251 return (int)tmp;
executed 26 times by 1 test: return (int)tmp;
Executed by:
  • Self test
26
252}-
253-
254/* compare the specified two characters. If the characters matched,-
255 return 1. Otherwise return 0. */-
256int-
257_rl_compare_chars (char *buf1, int pos1, mbstate_t *ps1, char *buf2, int pos2, mbstate_t *ps2)-
258{-
259 int i, w1, w2;-
260-
261 if ((w1 = _rl_get_char_len (&buf1[pos1], ps1)) <= 0 ||
(w1 = _rl_get_...1], ps1)) <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
262 (w2 = _rl_get_char_len (&buf2[pos2], ps2)) <= 0 ||
(w2 = _rl_get_...2], ps2)) <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
263 (w1 != w2) ||
(w1 != w2)Description
TRUEnever evaluated
FALSEnever evaluated
0
264 (buf1[pos1] != buf2[pos2]))
(buf1[pos1] != buf2[pos2])Description
TRUEnever evaluated
FALSEnever evaluated
0
265 return 0;
never executed: return 0;
0
266-
267 for (i = 1; i < w1; i++)
i < w1Description
TRUEnever evaluated
FALSEnever evaluated
0
268 if (buf1[pos1+i] != buf2[pos2+i])
buf1[pos1+i] != buf2[pos2+i]Description
TRUEnever evaluated
FALSEnever evaluated
0
269 return 0;
never executed: return 0;
0
270-
271 return 1;
never executed: return 1;
0
272}-
273-
274/* adjust pointed byte and find mbstate of the point of string.-
275 adjusted point will be point <= adjusted_point, and returns-
276 differences of the byte(adjusted_point - point).-
277 if point is invalid (point < 0 || more than string length),-
278 it returns -1 */-
279int-
280_rl_adjust_point (char *string, int point, mbstate_t *ps)-
281{-
282 size_t tmp;-
283 int length, pos;-
284-
285 tmp = 0;-
286 pos = 0;-
287 length = strlen(string);-
288 if (point < 0)
point < 0Description
TRUEnever evaluated
FALSEevaluated 12 times by 1 test
Evaluated by:
  • Self test
0-12
289 return -1;
never executed: return -1;
0
290 if (length < point)
length < pointDescription
TRUEnever evaluated
FALSEevaluated 12 times by 1 test
Evaluated by:
  • Self test
0-12
291 return -1;
never executed: return -1;
0
292 -
293 while (pos < point)
pos < pointDescription
TRUEevaluated 78 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 12 times by 1 test
Evaluated by:
  • Self test
12-78
294 {-
295 if (_rl_utf8locale && UTF8_SINGLEBYTE(string[pos]))
_rl_utf8localeDescription
TRUEnever evaluated
FALSEevaluated 78 times by 1 test
Evaluated by:
  • Self test
(((string[pos]) & 0x80) == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0-78
296 tmp = 1;
never executed: tmp = 1;
0
297 else-
298 tmp = mbrlen (string + pos, length - pos, ps);
executed 78 times by 1 test: tmp = mbrlen (string + pos, length - pos, ps);
Executed by:
  • Self test
78
299 if (MB_INVALIDCH ((size_t)tmp))
((size_t)tmp) == (size_t)-1Description
TRUEnever evaluated
FALSEevaluated 78 times by 1 test
Evaluated by:
  • Self test
((size_t)tmp) == (size_t)-2Description
TRUEnever evaluated
FALSEevaluated 78 times by 1 test
Evaluated by:
  • Self test
0-78
300 {-
301 /* in this case, bytes are invalid or too short to compose-
302 multibyte char, so assume that the first byte represents-
303 a single character anyway. */-
304 pos++;-
305 /* clear the state of the byte sequence, because-
306 in this case effect of mbstate is undefined */-
307 if (ps)
psDescription
TRUEnever evaluated
FALSEnever evaluated
0
308 memset (ps, 0, sizeof (mbstate_t));
never executed: memset (ps, 0, sizeof (mbstate_t));
0
309 }
never executed: end of block
0
310 else if (MB_NULLWCH (tmp))
((tmp) == 0)Description
TRUEnever evaluated
FALSEevaluated 78 times by 1 test
Evaluated by:
  • Self test
0-78
311 pos++;
never executed: pos++;
0
312 else-
313 pos += tmp;
executed 78 times by 1 test: pos += tmp;
Executed by:
  • Self test
78
314 }-
315-
316 return (pos - point);
executed 12 times by 1 test: return (pos - point);
Executed by:
  • Self test
12
317}-
318-
319int-
320_rl_is_mbchar_matched (char *string, int seed, int end, char *mbchar, int length)-
321{-
322 int i;-
323-
324 if ((end - seed) < length)
(end - seed) < lengthDescription
TRUEnever evaluated
FALSEnever evaluated
0
325 return 0;
never executed: return 0;
0
326-
327 for (i = 0; i < length; i++)
i < lengthDescription
TRUEnever evaluated
FALSEnever evaluated
0
328 if (string[seed + i] != mbchar[i])
string[seed + i] != mbchar[i]Description
TRUEnever evaluated
FALSEnever evaluated
0
329 return 0;
never executed: return 0;
0
330 return 1;
never executed: return 1;
0
331}-
332-
333wchar_t-
334_rl_char_value (char *buf, int ind)-
335{-
336 size_t tmp;-
337 wchar_t wc;-
338 mbstate_t ps;-
339 int l;-
340-
341 if (MB_LEN_MAX == 1 || rl_byte_oriented)
16 == 1Description
TRUEnever evaluated
FALSEnever evaluated
rl_byte_orientedDescription
TRUEnever evaluated
FALSEnever evaluated
0
342 return ((wchar_t) buf[ind]);
never executed: return ((wchar_t) buf[ind]);
0
343 if (_rl_utf8locale && UTF8_SINGLEBYTE(buf[ind]))
_rl_utf8localeDescription
TRUEnever evaluated
FALSEnever evaluated
(((buf[ind]) & 0x80) == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
344 return ((wchar_t) buf[ind]);
never executed: return ((wchar_t) buf[ind]);
0
345 l = strlen (buf);-
346 if (ind >= l - 1)
ind >= l - 1Description
TRUEnever evaluated
FALSEnever evaluated
0
347 return ((wchar_t) buf[ind]);
never executed: return ((wchar_t) buf[ind]);
0
348 if (l < ind) /* Sanity check */
l < indDescription
TRUEnever evaluated
FALSEnever evaluated
0
349 l = strlen (buf+ind);
never executed: l = strlen (buf+ind);
0
350 memset (&ps, 0, sizeof (mbstate_t));-
351 tmp = mbrtowc (&wc, buf + ind, l - ind, &ps);-
352 if (MB_INVALIDCH (tmp) || MB_NULLWCH (tmp))
(tmp) == (size_t)-1Description
TRUEnever evaluated
FALSEnever evaluated
(tmp) == (size_t)-2Description
TRUEnever evaluated
FALSEnever evaluated
((tmp) == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
353 return ((wchar_t) buf[ind]);
never executed: return ((wchar_t) buf[ind]);
0
354 return wc;
never executed: return wc;
0
355}-
356#endif /* HANDLE_MULTIBYTE */-
357-
358/* Find next `count' characters started byte point of the specified seed.-
359 If flags is MB_FIND_NONZERO, we look for non-zero-width multibyte-
360 characters. */-
361#undef _rl_find_next_mbchar-
362int-
363_rl_find_next_mbchar (char *string, int seed, int count, int flags)-
364{-
365#if defined (HANDLE_MULTIBYTE)-
366 return _rl_find_next_mbchar_internal (string, seed, count, flags);
never executed: return _rl_find_next_mbchar_internal (string, seed, count, flags);
0
367#else-
368 return (seed + count);-
369#endif-
370}-
371-
372/* Find previous character started byte point of the specified seed.-
373 Returned point will be point <= seed. If flags is MB_FIND_NONZERO,-
374 we look for non-zero-width multibyte characters. */-
375#undef _rl_find_prev_mbchar-
376int-
377_rl_find_prev_mbchar (char *string, int seed, int flags)-
378{-
379#if defined (HANDLE_MULTIBYTE)-
380 return _rl_find_prev_mbchar_internal (string, seed, flags);
never executed: return _rl_find_prev_mbchar_internal (string, seed, flags);
0
381#else-
382 return ((seed == 0) ? seed : seed - 1);-
383#endif-
384}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2