OpenCoverage

tr.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/coreutils/src/src/tr.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* tr -- a filter to translate characters-
2 Copyright (C) 1991-2018 Free Software Foundation, Inc.-
3-
4 This program is free software: you can redistribute it and/or modify-
5 it under the terms of the GNU General Public License as published by-
6 the Free Software Foundation, either version 3 of the License, or-
7 (at your option) any later version.-
8-
9 This program is distributed in the hope that it will be useful,-
10 but WITHOUT ANY WARRANTY; without even the implied warranty of-
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the-
12 GNU General Public License for more details.-
13-
14 You should have received a copy of the GNU General Public License-
15 along with this program. If not, see <https://www.gnu.org/licenses/>. */-
16-
17/* Written by Jim Meyering */-
18-
19#include <config.h>-
20-
21#include <stdio.h>-
22#include <assert.h>-
23#include <sys/types.h>-
24#include <getopt.h>-
25-
26#include "system.h"-
27#include "die.h"-
28#include "error.h"-
29#include "fadvise.h"-
30#include "quote.h"-
31#include "safe-read.h"-
32#include "xbinary-io.h"-
33#include "xstrtol.h"-
34-
35/* The official name of this program (e.g., no 'g' prefix). */-
36#define PROGRAM_NAME "tr"-
37-
38#define AUTHORS proper_name ("Jim Meyering")-
39-
40enum { N_CHARS = UCHAR_MAX + 1 };-
41-
42/* An unsigned integer type big enough to hold a repeat count or an-
43 unsigned character. POSIX requires support for repeat counts as-
44 high as 2**31 - 1. Since repeat counts might need to expand to-
45 match the length of an argument string, we need at least size_t to-
46 avoid arbitrary internal limits. It doesn't cost much to use-
47 uintmax_t, though. */-
48typedef uintmax_t count;-
49-
50/* The value for Spec_list->state that indicates to-
51 get_next that it should initialize the tail pointer.-
52 Its value should be as large as possible to avoid conflict-
53 a valid value for the state field -- and that may be as-
54 large as any valid repeat_count. */-
55#define BEGIN_STATE (UINTMAX_MAX - 1)-
56-
57/* The value for Spec_list->state that indicates to-
58 get_next that the element pointed to by Spec_list->tail is-
59 being considered for the first time on this pass through the-
60 list -- it indicates that get_next should make any necessary-
61 initializations. */-
62#define NEW_ELEMENT (BEGIN_STATE + 1)-
63-
64/* The maximum possible repeat count. Due to how the states are-
65 implemented, it can be as much as BEGIN_STATE. */-
66#define REPEAT_COUNT_MAXIMUM BEGIN_STATE-
67-
68/* The following (but not CC_NO_CLASS) are indices into the array of-
69 valid character class strings. */-
70enum Char_class-
71 {-
72 CC_ALNUM = 0, CC_ALPHA = 1, CC_BLANK = 2, CC_CNTRL = 3,-
73 CC_DIGIT = 4, CC_GRAPH = 5, CC_LOWER = 6, CC_PRINT = 7,-
74 CC_PUNCT = 8, CC_SPACE = 9, CC_UPPER = 10, CC_XDIGIT = 11,-
75 CC_NO_CLASS = 9999-
76 };-
77-
78/* Character class to which a character (returned by get_next) belonged;-
79 but it is set only if the construct from which the character was obtained-
80 was one of the character classes [:upper:] or [:lower:]. The value-
81 is used only when translating and then, only to make sure that upper-
82 and lower class constructs have the same relative positions in string1-
83 and string2. */-
84enum Upper_Lower_class-
85 {-
86 UL_LOWER,-
87 UL_UPPER,-
88 UL_NONE-
89 };-
90-
91/* The type of a List_element. See build_spec_list for more details. */-
92enum Range_element_type-
93 {-
94 RE_NORMAL_CHAR,-
95 RE_RANGE,-
96 RE_CHAR_CLASS,-
97 RE_EQUIV_CLASS,-
98 RE_REPEATED_CHAR-
99 };-
100-
101/* One construct in one of tr's argument strings.-
102 For example, consider the POSIX version of the classic tr command:-
103 tr -cs 'a-zA-Z_' '[\n*]'-
104 String1 has 3 constructs, two of which are ranges (a-z and A-Z),-
105 and a single normal character, '_'. String2 has one construct. */-
106struct List_element-
107 {-
108 enum Range_element_type type;-
109 struct List_element *next;-
110 union-
111 {-
112 unsigned char normal_char;-
113 struct /* unnamed */-
114 {-
115 unsigned char first_char;-
116 unsigned char last_char;-
117 }-
118 range;-
119 enum Char_class char_class;-
120 unsigned char equiv_code;-
121 struct /* unnamed */-
122 {-
123 unsigned char the_repeated_char;-
124 count repeat_count;-
125 }-
126 repeated_char;-
127 }-
128 u;-
129 };-
130-
131/* Each of tr's argument strings is parsed into a form that is easier-
132 to work with: a linked list of constructs (struct List_element).-
133 Each Spec_list structure also encapsulates various attributes of-
134 the corresponding argument string. The attributes are used mainly-
135 to verify that the strings are valid in the context of any options-
136 specified (like -s, -d, or -c). The main exception is the member-
137 'tail', which is first used to construct the list. After construction,-
138 it is used by get_next to save its state when traversing the list.-
139 The member 'state' serves a similar function. */-
140struct Spec_list-
141 {-
142 /* Points to the head of the list of range elements.-
143 The first struct is a dummy; its members are never used. */-
144 struct List_element *head;-
145-
146 /* When appending, points to the last element. When traversing via-
147 get_next(), points to the element to process next. Setting-
148 Spec_list.state to the value BEGIN_STATE before calling get_next-
149 signals get_next to initialize tail to point to head->next. */-
150 struct List_element *tail;-
151-
152 /* Used to save state between calls to get_next. */-
153 count state;-
154-
155 /* Length, in the sense that length ('a-z[:digit:]123abc')-
156 is 42 ( = 26 + 10 + 6). */-
157 count length;-
158-
159 /* The number of [c*] and [c*0] constructs that appear in this spec. */-
160 size_t n_indefinite_repeats;-
161-
162 /* If n_indefinite_repeats is nonzero, this points to the List_element-
163 corresponding to the last [c*] or [c*0] construct encountered in-
164 this spec. Otherwise it is undefined. */-
165 struct List_element *indefinite_repeat_element;-
166-
167 /* True if this spec contains at least one equivalence-
168 class construct e.g. [=c=]. */-
169 bool has_equiv_class;-
170-
171 /* True if this spec contains at least one character class-
172 construct. E.g. [:digit:]. */-
173 bool has_char_class;-
174-
175 /* True if this spec contains at least one of the character class-
176 constructs (all but upper and lower) that aren't allowed in s2. */-
177 bool has_restricted_char_class;-
178 };-
179-
180/* A representation for escaped string1 or string2. As a string is parsed,-
181 any backslash-escaped characters (other than octal or \a, \b, \f, \n,-
182 etc.) are marked as such in this structure by setting the corresponding-
183 entry in the ESCAPED vector. */-
184struct E_string-
185{-
186 char *s;-
187 bool *escaped;-
188 size_t len;-
189};-
190-
191/* Return nonzero if the Ith character of escaped string ES matches C-
192 and is not escaped itself. */-
193static inline bool-
194es_match (struct E_string const *es, size_t i, char c)-
195{-
196 return es->s[i] == c && !es->escaped[i];
executed 796 times by 1 test: return es->s[i] == c && !es->escaped[i];
Executed by:
  • tr
796
197}-
198-
199/* When true, each sequence in the input of a repeated character-
200 (call it c) is replaced (in the output) by a single occurrence of c-
201 for every c in the squeeze set. */-
202static bool squeeze_repeats = false;-
203-
204/* When true, removes characters in the delete set from input. */-
205static bool delete = false;-
206-
207/* Use the complement of set1 in place of set1. */-
208static bool complement = false;-
209-
210/* When tr is performing translation and string1 is longer than string2,-
211 POSIX says that the result is unspecified. That gives the implementor-
212 of a POSIX conforming version of tr two reasonable choices for the-
213 semantics of this case.-
214-
215 * The BSD tr pads string2 to the length of string1 by-
216 repeating the last character in string2.-
217-
218 * System V tr ignores characters in string1 that have no-
219 corresponding character in string2. That is, string1 is effectively-
220 truncated to the length of string2.-
221-
222 When nonzero, this flag causes GNU tr to imitate the behavior-
223 of System V tr when translating with string1 longer than string2.-
224 The default is to emulate BSD tr. This flag is ignored in modes where-
225 no translation is performed. Emulating the System V tr-
226 in this exceptional case causes the relatively common BSD idiom:-
227-
228 tr -cs A-Za-z0-9 '\012'-
229-
230 to break (it would convert only zero bytes, rather than all-
231 non-alphanumerics, to newlines).-
232-
233 WARNING: This switch does not provide general BSD or System V-
234 compatibility. For example, it doesn't disable the interpretation-
235 of the POSIX constructs [:alpha:], [=c=], and [c*10], so if by-
236 some unfortunate coincidence you use such constructs in scripts-
237 expecting to use some other version of tr, the scripts will break. */-
238static bool truncate_set1 = false;-
239-
240/* An alias for (!delete && non_option_args == 2).-
241 It is set in main and used there and in validate(). */-
242static bool translating;-
243-
244static char io_buf[BUFSIZ];-
245-
246static char const *const char_class_name[] =-
247{-
248 "alnum", "alpha", "blank", "cntrl", "digit", "graph",-
249 "lower", "print", "punct", "space", "upper", "xdigit"-
250};-
251-
252/* Array of boolean values. A character 'c' is a member of the-
253 squeeze set if and only if in_squeeze_set[c] is true. The squeeze-
254 set is defined by the last (possibly, the only) string argument-
255 on the command line when the squeeze option is given. */-
256static bool in_squeeze_set[N_CHARS];-
257-
258/* Array of boolean values. A character 'c' is a member of the-
259 delete set if and only if in_delete_set[c] is true. The delete-
260 set is defined by the first (or only) string argument on the-
261 command line when the delete option is given. */-
262static bool in_delete_set[N_CHARS];-
263-
264/* Array of character values defining the translation (if any) that-
265 tr is to perform. Translation is performed only when there are-
266 two specification strings and the delete switch is not given. */-
267static char xlate[N_CHARS];-
268-
269static struct option const long_options[] =-
270{-
271 {"complement", no_argument, NULL, 'c'},-
272 {"delete", no_argument, NULL, 'd'},-
273 {"squeeze-repeats", no_argument, NULL, 's'},-
274 {"truncate-set1", no_argument, NULL, 't'},-
275 {GETOPT_HELP_OPTION_DECL},-
276 {GETOPT_VERSION_OPTION_DECL},-
277 {NULL, 0, NULL, 0}-
278};-
279-
280void-
281usage (int status)-
282{-
283 if (status != EXIT_SUCCESS)
status != 0Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 12 times by 1 test
Evaluated by:
  • tr
3-12
284 emit_try_help ();
executed 3 times by 1 test: end of block
Executed by:
  • tr
3
285 else-
286 {-
287 printf (_("\-
288Usage: %s [OPTION]... SET1 [SET2]\n\-
289"),-
290 program_name);-
291 fputs (_("\-
292Translate, squeeze, and/or delete characters from standard input,\n\-
293writing to standard output.\n\-
294\n\-
295 -c, -C, --complement use the complement of SET1\n\-
296 -d, --delete delete characters in SET1, do not translate\n\-
297 -s, --squeeze-repeats replace each sequence of a repeated character\n\-
298 that is listed in the last specified SET,\n\-
299 with a single occurrence of that character\n\-
300 -t, --truncate-set1 first truncate SET1 to length of SET2\n\-
301"), stdout);-
302 fputs (HELP_OPTION_DESCRIPTION, stdout);-
303 fputs (VERSION_OPTION_DESCRIPTION, stdout);-
304 fputs (_("\-
305\n\-
306SETs are specified as strings of characters. Most represent themselves.\n\-
307Interpreted sequences are:\n\-
308\n\-
309 \\NNN character with octal value NNN (1 to 3 octal digits)\n\-
310 \\\\ backslash\n\-
311 \\a audible BEL\n\-
312 \\b backspace\n\-
313 \\f form feed\n\-
314 \\n new line\n\-
315 \\r return\n\-
316 \\t horizontal tab\n\-
317"), stdout);-
318 fputs (_("\-
319 \\v vertical tab\n\-
320 CHAR1-CHAR2 all characters from CHAR1 to CHAR2 in ascending order\n\-
321 [CHAR*] in SET2, copies of CHAR until length of SET1\n\-
322 [CHAR*REPEAT] REPEAT copies of CHAR, REPEAT octal if starting with 0\n\-
323 [:alnum:] all letters and digits\n\-
324 [:alpha:] all letters\n\-
325 [:blank:] all horizontal whitespace\n\-
326 [:cntrl:] all control characters\n\-
327 [:digit:] all digits\n\-
328"), stdout);-
329 fputs (_("\-
330 [:graph:] all printable characters, not including space\n\-
331 [:lower:] all lower case letters\n\-
332 [:print:] all printable characters, including space\n\-
333 [:punct:] all punctuation characters\n\-
334 [:space:] all horizontal or vertical whitespace\n\-
335 [:upper:] all upper case letters\n\-
336 [:xdigit:] all hexadecimal digits\n\-
337 [=CHAR=] all characters which are equivalent to CHAR\n\-
338"), stdout);-
339 fputs (_("\-
340\n\-
341Translation occurs if -d is not given and both SET1 and SET2 appear.\n\-
342-t may be used only when translating. SET2 is extended to length of\n\-
343SET1 by repeating its last character as necessary. Excess characters\n\-
344of SET2 are ignored. Only [:lower:] and [:upper:] are guaranteed to\n\-
345expand in ascending order; used in SET2 while translating, they may\n\-
346only be used in pairs to specify case conversion. -s uses the last\n\-
347specified SET, and occurs after translation or deletion.\n\-
348"), stdout);-
349 emit_ancillary_info (PROGRAM_NAME);-
350 }
executed 12 times by 1 test: end of block
Executed by:
  • tr
12
351 exit (status);
executed 15 times by 1 test: exit (status);
Executed by:
  • tr
15
352}-
353-
354/* Return nonzero if the character C is a member of the-
355 equivalence class containing the character EQUIV_CLASS. */-
356-
357static inline bool-
358is_equiv_class_member (unsigned char equiv_class, unsigned char c)-
359{-
360 return (equiv_class == c);
executed 1536 times by 1 test: return (equiv_class == c);
Executed by:
  • tr
1536
361}-
362-
363/* Return true if the character C is a member of the-
364 character class CHAR_CLASS. */-
365-
366static bool _GL_ATTRIBUTE_PURE-
367is_char_class_member (enum Char_class char_class, unsigned char c)-
368{-
369 int result;-
370-
371 switch (char_class)-
372 {-
373 case CC_ALNUM:
executed 9944 times by 1 test: case CC_ALNUM:
Executed by:
  • tr
9944
374 result = isalnum (c);-
375 break;
executed 9944 times by 1 test: break;
Executed by:
  • tr
9944
376 case CC_ALPHA:
executed 1128 times by 1 test: case CC_ALPHA:
Executed by:
  • tr
1128
377 result = isalpha (c);-
378 break;
executed 1128 times by 1 test: break;
Executed by:
  • tr
1128
379 case CC_BLANK:
never executed: case CC_BLANK:
0
380 result = isblank (c);-
381 break;
never executed: break;
0
382 case CC_CNTRL:
executed 1090 times by 1 test: case CC_CNTRL:
Executed by:
  • tr
1090
383 result = iscntrl (c);-
384 break;
executed 1090 times by 1 test: break;
Executed by:
  • tr
1090
385 case CC_DIGIT:
executed 5752 times by 1 test: case CC_DIGIT:
Executed by:
  • tr
5752
386 result = isdigit (c);-
387 break;
executed 5752 times by 1 test: break;
Executed by:
  • tr
5752
388 case CC_GRAPH:
never executed: case CC_GRAPH:
0
389 result = isgraph (c);-
390 break;
never executed: break;
0
391 case CC_LOWER:
executed 13628 times by 1 test: case CC_LOWER:
Executed by:
  • tr
13628
392 result = islower (c);-
393 break;
executed 13628 times by 1 test: break;
Executed by:
  • tr
13628
394 case CC_PRINT:
never executed: case CC_PRINT:
0
395 result = isprint (c);-
396 break;
never executed: break;
0
397 case CC_PUNCT:
never executed: case CC_PUNCT:
0
398 result = ispunct (c);-
399 break;
never executed: break;
0
400 case CC_SPACE:
never executed: case CC_SPACE:
0
401 result = isspace (c);-
402 break;
never executed: break;
0
403 case CC_UPPER:
executed 15124 times by 1 test: case CC_UPPER:
Executed by:
  • tr
15124
404 result = isupper (c);-
405 break;
executed 15124 times by 1 test: break;
Executed by:
  • tr
15124
406 case CC_XDIGIT:
executed 4272 times by 1 test: case CC_XDIGIT:
Executed by:
  • tr
4272
407 result = isxdigit (c);-
408 break;
executed 4272 times by 1 test: break;
Executed by:
  • tr
4272
409 default:
never executed: default:
0
410 abort ();
never executed: abort ();
0
411 }-
412-
413 return !! result;
executed 50938 times by 1 test: return !! result;
Executed by:
  • tr
50938
414}-
415-
416static void-
417es_free (struct E_string *es)-
418{-
419 free (es->s);-
420 free (es->escaped);-
421}
executed 8573 times by 1 test: end of block
Executed by:
  • tr
8573
422-
423/* Perform the first pass over each range-spec argument S, converting all-
424 \c and \ddd escapes to their one-byte representations. If an invalid-
425 quote sequence is found print an error message and return false;-
426 Otherwise set *ES to the resulting string and return true.-
427 The resulting array of characters may contain zero-bytes;-
428 however, on input, S is assumed to be null-terminated, and hence-
429 cannot contain actual (non-escaped) zero bytes. */-
430-
431static bool-
432unquote (char const *s, struct E_string *es)-
433{-
434 size_t len = strlen (s);-
435-
436 es->s = xmalloc (len);-
437 es->escaped = xcalloc (len, sizeof es->escaped[0]);-
438-
439 unsigned int j = 0;-
440 for (unsigned int i = 0; s[i]; i++)
s[i]Description
TRUEevaluated 17386 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 8573 times by 1 test
Evaluated by:
  • tr
8573-17386
441 {-
442 unsigned char c;-
443 int oct_digit;-
444-
445 switch (s[i])-
446 {-
447 case '\\':
executed 315 times by 1 test: case '\\':
Executed by:
  • tr
315
448 es->escaped[j] = true;-
449 switch (s[i + 1])-
450 {-
451 case '\\':
never executed: case '\\':
0
452 c = '\\';-
453 break;
never executed: break;
0
454 case 'a':
never executed: case 'a':
0
455 c = '\a';-
456 break;
never executed: break;
0
457 case 'b':
never executed: case 'b':
0
458 c = '\b';-
459 break;
never executed: break;
0
460 case 'f':
never executed: case 'f':
0
461 c = '\f';-
462 break;
never executed: break;
0
463 case 'n':
executed 265 times by 1 test: case 'n':
Executed by:
  • tr
265
464 c = '\n';-
465 break;
executed 265 times by 1 test: break;
Executed by:
  • tr
265
466 case 'r':
never executed: case 'r':
0
467 c = '\r';-
468 break;
never executed: break;
0
469 case 't':
never executed: case 't':
0
470 c = '\t';-
471 break;
never executed: break;
0
472 case 'v':
never executed: case 'v':
0
473 c = '\v';-
474 break;
never executed: break;
0
475 case '0':
executed 28 times by 1 test: case '0':
Executed by:
  • tr
28
476 case '1':
executed 1 time by 1 test: case '1':
Executed by:
  • tr
1
477 case '2':
executed 1 time by 1 test: case '2':
Executed by:
  • tr
1
478 case '3':
executed 11 times by 1 test: case '3':
Executed by:
  • tr
11
479 case '4':
executed 1 time by 1 test: case '4':
Executed by:
  • tr
1
480 case '5':
executed 2 times by 1 test: case '5':
Executed by:
  • tr
2
481 case '6':
never executed: case '6':
0
482 case '7':
never executed: case '7':
0
483 c = s[i + 1] - '0';-
484 oct_digit = s[i + 2] - '0';-
485 if (0 <= oct_digit && oct_digit <= 7)
0 <= oct_digitDescription
TRUEevaluated 19 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 25 times by 1 test
Evaluated by:
  • tr
oct_digit <= 7Description
TRUEevaluated 16 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 3 times by 1 test
Evaluated by:
  • tr
3-25
486 {-
487 c = 8 * c + oct_digit;-
488 ++i;-
489 oct_digit = s[i + 2] - '0';-
490 if (0 <= oct_digit && oct_digit <= 7)
0 <= oct_digitDescription
TRUEevaluated 15 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 1 time by 1 test
Evaluated by:
  • tr
oct_digit <= 7Description
TRUEevaluated 15 times by 1 test
Evaluated by:
  • tr
FALSEnever evaluated
0-15
491 {-
492 if (8 * c + oct_digit < N_CHARS)
8 * c + oct_digit < N_CHARSDescription
TRUEevaluated 15 times by 1 test
Evaluated by:
  • tr
FALSEnever evaluated
0-15
493 {-
494 c = 8 * c + oct_digit;-
495 ++i;-
496 }
executed 15 times by 1 test: end of block
Executed by:
  • tr
15
497 else-
498 {-
499 /* A 3-digit octal number larger than \377 won't-
500 fit in 8 bits. So we stop when adding the-
501 next digit would put us over the limit and-
502 give a warning about the ambiguity. POSIX-
503 isn't clear on this, and we interpret this-
504 lack of clarity as meaning the resulting behavior-
505 is undefined, which means we're allowed to issue-
506 a warning. */-
507 error (0, 0, _("warning: the ambiguous octal escape\-
508 \\%c%c%c is being\n\tinterpreted as the 2-byte sequence \\0%c%c, %c"),-
509 s[i], s[i + 1], s[i + 2],-
510 s[i], s[i + 1], s[i + 2]);-
511 }
never executed: end of block
0
512 }-
513 }
executed 16 times by 1 test: end of block
Executed by:
  • tr
16
514 break;
executed 44 times by 1 test: break;
Executed by:
  • tr
44
515 case '\0':
executed 2 times by 1 test: case '\0':
Executed by:
  • tr
2
516 error (0, 0, _("warning: an unescaped backslash "-
517 "at end of string is not portable"));-
518 /* POSIX is not clear about this. */-
519 es->escaped[j] = false;-
520 i--;-
521 c = '\\';-
522 break;
executed 2 times by 1 test: break;
Executed by:
  • tr
2
523 default:
executed 4 times by 1 test: default:
Executed by:
  • tr
4
524 c = s[i + 1];-
525 break;
executed 4 times by 1 test: break;
Executed by:
  • tr
4
526 }-
527 ++i;-
528 es->s[j++] = c;-
529 break;
executed 315 times by 1 test: break;
Executed by:
  • tr
315
530 default:
executed 17071 times by 1 test: default:
Executed by:
  • tr
17071
531 es->s[j++] = s[i];-
532 break;
executed 17071 times by 1 test: break;
Executed by:
  • tr
17071
533 }-
534 }-
535 es->len = j;-
536 return true;
executed 8573 times by 1 test: return 1 ;
Executed by:
  • tr
8573
537}-
538-
539/* If CLASS_STR is a valid character class string, return its index-
540 in the global char_class_name array. Otherwise, return CC_NO_CLASS. */-
541-
542static enum Char_class _GL_ATTRIBUTE_PURE-
543look_up_char_class (char const *class_str, size_t len)-
544{-
545 enum Char_class i;-
546-
547 for (i = 0; i < ARRAY_CARDINALITY (char_class_name); i++)
i < (sizeof (c...r_class_name))Description
TRUEevaluated 704 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 2 times by 1 test
Evaluated by:
  • tr
2-704
548 if (STREQ_LEN (class_str, char_class_name[i], len)
never executed: __result = (((const unsigned char *) (const char *) ( class_str ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( char_class_name[i] ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
( (__extension... len ))) == 0)Description
TRUEevaluated 92 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 612 times by 1 test
Evaluated by:
  • tr
__builtin_constant_p ( len )Description
TRUEnever evaluated
FALSEevaluated 704 times by 1 test
Evaluated by:
  • tr
__builtin_cons... ( class_str )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( class...ze_t) ( len ))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons...lass_name[i] )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( char_...ze_t) ( len ))Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-704
549 && strlen (char_class_name[i]) == len)
strlen (char_c...ame[i]) == lenDescription
TRUEevaluated 92 times by 1 test
Evaluated by:
  • tr
FALSEnever evaluated
0-92
550 return i;
executed 92 times by 1 test: return i;
Executed by:
  • tr
92
551 return CC_NO_CLASS;
executed 2 times by 1 test: return CC_NO_CLASS;
Executed by:
  • tr
2
552}-
553-
554/* Return a newly allocated string with a printable version of C.-
555 This function is used solely for formatting error messages. */-
556-
557static char *-
558make_printable_char (unsigned char c)-
559{-
560 char *buf = xmalloc (5);-
561-
562 if (isprint (c))
((*__ctype_b_l...int) _ISprint)Description
TRUEnever evaluated
FALSEnever evaluated
0
563 {-
564 buf[0] = c;-
565 buf[1] = '\0';-
566 }
never executed: end of block
0
567 else-
568 {-
569 sprintf (buf, "\\%03o", c);-
570 }
never executed: end of block
0
571 return buf;
never executed: return buf;
0
572}-
573-
574/* Return a newly allocated copy of S which is suitable for printing.-
575 LEN is the number of characters in S. Most non-printing-
576 (isprint) characters are represented by a backslash followed by-
577 3 octal digits. However, the characters represented by \c escapes-
578 where c is one of [abfnrtv] are represented by their 2-character \c-
579 sequences. This function is used solely for printing error messages. */-
580-
581static char *-
582make_printable_str (char const *s, size_t len)-
583{-
584 /* Worst case is that every character expands to a backslash-
585 followed by a 3-character octal escape sequence. */-
586 char *printable_buf = xnmalloc (len + 1, 4);-
587 char *p = printable_buf;-
588-
589 for (size_t i = 0; i < len; i++)
i < lenDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 2 times by 1 test
Evaluated by:
  • tr
2-4
590 {-
591 char buf[5];-
592 char const *tmp = NULL;-
593 unsigned char c = s[i];-
594-
595 switch (c)-
596 {-
597 case '\\':
never executed: case '\\':
0
598 tmp = "\\";-
599 break;
never executed: break;
0
600 case '\a':
never executed: case '\a':
0
601 tmp = "\\a";-
602 break;
never executed: break;
0
603 case '\b':
never executed: case '\b':
0
604 tmp = "\\b";-
605 break;
never executed: break;
0
606 case '\f':
never executed: case '\f':
0
607 tmp = "\\f";-
608 break;
never executed: break;
0
609 case '\n':
never executed: case '\n':
0
610 tmp = "\\n";-
611 break;
never executed: break;
0
612 case '\r':
never executed: case '\r':
0
613 tmp = "\\r";-
614 break;
never executed: break;
0
615 case '\t':
never executed: case '\t':
0
616 tmp = "\\t";-
617 break;
never executed: break;
0
618 case '\v':
never executed: case '\v':
0
619 tmp = "\\v";-
620 break;
never executed: break;
0
621 default:
executed 4 times by 1 test: default:
Executed by:
  • tr
4
622 if (isprint (c))
((*__ctype_b_l...int) _ISprint)Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • tr
FALSEnever evaluated
0-4
623 {-
624 buf[0] = c;-
625 buf[1] = '\0';-
626 }
executed 4 times by 1 test: end of block
Executed by:
  • tr
4
627 else-
628 sprintf (buf, "\\%03o", c);
never executed: sprintf (buf, "\\%03o", c);
0
629 tmp = buf;-
630 break;
executed 4 times by 1 test: break;
Executed by:
  • tr
4
631 }-
632 p = stpcpy (p, tmp);-
633 }
executed 4 times by 1 test: end of block
Executed by:
  • tr
4
634 return printable_buf;
executed 2 times by 1 test: return printable_buf;
Executed by:
  • tr
2
635}-
636-
637/* Append a newly allocated structure representing a-
638 character C to the specification list LIST. */-
639-
640static void-
641append_normal_char (struct Spec_list *list, unsigned char c)-
642{-
643 struct List_element *new = xmalloc (sizeof *new);-
644 new->next = NULL;-
645 new->type = RE_NORMAL_CHAR;-
646 new->u.normal_char = c;-
647 assert (list->tail);-
648 list->tail->next = new;-
649 list->tail = new;-
650}
executed 16022 times by 1 test: end of block
Executed by:
  • tr
16022
651-
652/* Append a newly allocated structure representing the range-
653 of characters from FIRST to LAST to the specification list LIST.-
654 Return false if LAST precedes FIRST in the collating sequence,-
655 true otherwise. This means that '[c-c]' is acceptable. */-
656-
657static bool-
658append_range (struct Spec_list *list, unsigned char first, unsigned char last)-
659{-
660 if (last < first)
last < firstDescription
TRUEnever evaluated
FALSEevaluated 44 times by 1 test
Evaluated by:
  • tr
0-44
661 {-
662 char *tmp1 = make_printable_char (first);-
663 char *tmp2 = make_printable_char (last);-
664-
665 error (0, 0,-
666 _("range-endpoints of '%s-%s' are in reverse collating sequence order"),-
667 tmp1, tmp2);-
668 free (tmp1);-
669 free (tmp2);-
670 return false;
never executed: return 0 ;
0
671 }-
672 struct List_element *new = xmalloc (sizeof *new);-
673 new->next = NULL;-
674 new->type = RE_RANGE;-
675 new->u.range.first_char = first;-
676 new->u.range.last_char = last;-
677 assert (list->tail);-
678 list->tail->next = new;-
679 list->tail = new;-
680 return true;
executed 44 times by 1 test: return 1 ;
Executed by:
  • tr
44
681}-
682-
683/* If CHAR_CLASS_STR is a valid character class string, append a-
684 newly allocated structure representing that character class to the end-
685 of the specification list LIST and return true. If CHAR_CLASS_STR is not-
686 a valid string return false. */-
687-
688static bool-
689append_char_class (struct Spec_list *list,-
690 char const *char_class_str, size_t len)-
691{-
692 enum Char_class char_class = look_up_char_class (char_class_str, len);-
693 if (char_class == CC_NO_CLASS)
char_class == CC_NO_CLASSDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 92 times by 1 test
Evaluated by:
  • tr
2-92
694 return false;
executed 2 times by 1 test: return 0 ;
Executed by:
  • tr
2
695 struct List_element *new = xmalloc (sizeof *new);-
696 new->next = NULL;-
697 new->type = RE_CHAR_CLASS;-
698 new->u.char_class = char_class;-
699 assert (list->tail);-
700 list->tail->next = new;-
701 list->tail = new;-
702 return true;
executed 92 times by 1 test: return 1 ;
Executed by:
  • tr
92
703}-
704-
705/* Append a newly allocated structure representing a [c*n]-
706 repeated character construct to the specification list LIST.-
707 THE_CHAR is the single character to be repeated, and REPEAT_COUNT-
708 is a non-negative repeat count. */-
709-
710static void-
711append_repeated_char (struct Spec_list *list, unsigned char the_char,-
712 count repeat_count)-
713{-
714 struct List_element *new = xmalloc (sizeof *new);-
715 new->next = NULL;-
716 new->type = RE_REPEATED_CHAR;-
717 new->u.repeated_char.the_repeated_char = the_char;-
718 new->u.repeated_char.repeat_count = repeat_count;-
719 assert (list->tail);-
720 list->tail->next = new;-
721 list->tail = new;-
722}
executed 69 times by 1 test: end of block
Executed by:
  • tr
69
723-
724/* Given a string, EQUIV_CLASS_STR, from a [=str=] context and-
725 the length of that string, LEN, if LEN is exactly one, append-
726 a newly allocated structure representing the specified-
727 equivalence class to the specification list, LIST and return true.-
728 If LEN is not 1, return false. */-
729-
730static bool-
731append_equiv_class (struct Spec_list *list,-
732 char const *equiv_class_str, size_t len)-
733{-
734 if (len != 1)
len != 1Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 6 times by 1 test
Evaluated by:
  • tr
2-6
735 return false;
executed 2 times by 1 test: return 0 ;
Executed by:
  • tr
2
736-
737 struct List_element *new = xmalloc (sizeof *new);-
738 new->next = NULL;-
739 new->type = RE_EQUIV_CLASS;-
740 new->u.equiv_code = *equiv_class_str;-
741 assert (list->tail);-
742 list->tail->next = new;-
743 list->tail = new;-
744 return true;
executed 6 times by 1 test: return 1 ;
Executed by:
  • tr
6
745}-
746-
747/* Search forward starting at START_IDX for the 2-char sequence-
748 (PRE_BRACKET_CHAR,']') in the string P of length P_LEN. If such-
749 a sequence is found, set *RESULT_IDX to the index of the first-
750 character and return true. Otherwise return false. P may contain-
751 zero bytes. */-
752-
753static bool-
754find_closing_delim (const struct E_string *es, size_t start_idx,-
755 char pre_bracket_char, size_t *result_idx)-
756{-
757 for (size_t i = start_idx; i < es->len - 1; i++)
i < es->len - 1Description
TRUEevaluated 620 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 2 times by 1 test
Evaluated by:
  • tr
2-620
758 if (es->s[i] == pre_bracket_char && es->s[i + 1] == ']'
es->s[i] == pre_bracket_charDescription
TRUEevaluated 110 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 510 times by 1 test
Evaluated by:
  • tr
es->s[i + 1] == ']'Description
TRUEevaluated 106 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 4 times by 1 test
Evaluated by:
  • tr
4-510
759 && !es->escaped[i] && !es->escaped[i + 1])
!es->escaped[i]Description
TRUEevaluated 106 times by 1 test
Evaluated by:
  • tr
FALSEnever evaluated
!es->escaped[i + 1]Description
TRUEevaluated 106 times by 1 test
Evaluated by:
  • tr
FALSEnever evaluated
0-106
760 {-
761 *result_idx = i;-
762 return true;
executed 106 times by 1 test: return 1 ;
Executed by:
  • tr
106
763 }-
764 return false;
executed 2 times by 1 test: return 0 ;
Executed by:
  • tr
2
765}-
766-
767/* Parse the bracketed repeat-char syntax. If the P_LEN characters-
768 beginning with P[ START_IDX ] comprise a valid [c*n] construct,-
769 then set *CHAR_TO_REPEAT, *REPEAT_COUNT, and *CLOSING_BRACKET_IDX-
770 and return zero. If the second character following-
771 the opening bracket is not '*' or if no closing bracket can be-
772 found, return -1. If a closing bracket is found and the-
773 second char is '*', but the string between the '*' and ']' isn't-
774 empty, an octal number, or a decimal number, print an error message-
775 and return -2. */-
776-
777static int-
778find_bracketed_repeat (const struct E_string *es, size_t start_idx,-
779 unsigned char *char_to_repeat, count *repeat_count,-
780 size_t *closing_bracket_idx)-
781{-
782 assert (start_idx + 1 < es->len);-
783 if (!es_match (es, start_idx + 1, '*'))
!es_match (es,..._idx + 1, '*')Description
TRUEevaluated 10 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 64 times by 1 test
Evaluated by:
  • tr
10-64
784 return -1;
executed 10 times by 1 test: return -1;
Executed by:
  • tr
10
785-
786 for (size_t i = start_idx + 2; i < es->len && !es->escaped[i]; i++)
i < es->lenDescription
TRUEevaluated 166 times by 1 test
Evaluated by:
  • tr
FALSEnever evaluated
!es->escaped[i]Description
TRUEevaluated 164 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 2 times by 1 test
Evaluated by:
  • tr
0-166
787 {-
788 if (es->s[i] == ']')
es->s[i] == ']'Description
TRUEevaluated 62 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 102 times by 1 test
Evaluated by:
  • tr
62-102
789 {-
790 size_t digit_str_len = i - start_idx - 2;-
791-
792 *char_to_repeat = es->s[start_idx];-
793 if (digit_str_len == 0)
digit_str_len == 0Description
TRUEevaluated 36 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 26 times by 1 test
Evaluated by:
  • tr
26-36
794 {-
795 /* We've matched [c*] -- no explicit repeat count. */-
796 *repeat_count = 0;-
797 }
executed 36 times by 1 test: end of block
Executed by:
  • tr
36
798 else-
799 {-
800 /* Here, we have found [c*s] where s should be a string-
801 of octal (if it starts with '0') or decimal digits. */-
802 char const *digit_str = &es->s[start_idx + 2];-
803 char *d_end;-
804 if ((xstrtoumax (digit_str, &d_end, *digit_str == '0' ? 8 : 10,
(xstrtoumax (d...!= LONGINT_OK)Description
TRUEnever evaluated
FALSEevaluated 26 times by 1 test
Evaluated by:
  • tr
0-26
805 repeat_count, NULL)
(xstrtoumax (d...!= LONGINT_OK)Description
TRUEnever evaluated
FALSEevaluated 26 times by 1 test
Evaluated by:
  • tr
0-26
806 != LONGINT_OK)
(xstrtoumax (d...!= LONGINT_OK)Description
TRUEnever evaluated
FALSEevaluated 26 times by 1 test
Evaluated by:
  • tr
0-26
807 || REPEAT_COUNT_MAXIMUM < *repeat_count
( (18446744073... *repeat_countDescription
TRUEnever evaluated
FALSEevaluated 26 times by 1 test
Evaluated by:
  • tr
0-26
808 || digit_str + digit_str_len != d_end)
digit_str + di...r_len != d_endDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 24 times by 1 test
Evaluated by:
  • tr
2-24
809 {-
810 char *tmp = make_printable_str (digit_str, digit_str_len);-
811 error (0, 0,-
812 _("invalid repeat count %s in [c*n] construct"),-
813 quote (tmp));-
814 free (tmp);-
815 return -2;
executed 2 times by 1 test: return -2;
Executed by:
  • tr
2
816 }-
817 }
executed 24 times by 1 test: end of block
Executed by:
  • tr
24
818 *closing_bracket_idx = i;-
819 return 0;
executed 60 times by 1 test: return 0;
Executed by:
  • tr
60
820 }-
821 }
executed 102 times by 1 test: end of block
Executed by:
  • tr
102
822 return -1; /* No bracket found. */
executed 2 times by 1 test: return -1;
Executed by:
  • tr
2
823}-
824-
825/* Return true if the string at ES->s[IDX] matches the regular-
826 expression '\*[0-9]*\]', false otherwise. The string does not-
827 match if any of its characters are escaped. */-
828-
829static bool _GL_ATTRIBUTE_PURE-
830star_digits_closebracket (const struct E_string *es, size_t idx)-
831{-
832 if (!es_match (es, idx, '*'))
!es_match (es, idx, '*')Description
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • tr
0-4
833 return false;
never executed: return 0 ;
0
834-
835 for (size_t i = idx + 1; i < es->len; i++)
i < es->lenDescription
TRUEevaluated 8 times by 1 test
Evaluated by:
  • tr
FALSEnever evaluated
0-8
836 if (!ISDIGIT (to_uchar (es->s[i])) || es->escaped[i])
!((unsigned in...)) - '0' <= 9)Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 4 times by 1 test
Evaluated by:
  • tr
es->escaped[i]Description
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • tr
0-4
837 return es_match (es, i, ']');
executed 4 times by 1 test: return es_match (es, i, ']');
Executed by:
  • tr
4
838 return false;
never executed: return 0 ;
0
839}-
840-
841/* Convert string UNESCAPED_STRING (which has been preprocessed to-
842 convert backslash-escape sequences) of length LEN characters into-
843 a linked list of the following 5 types of constructs:-
844 - [:str:] Character class where 'str' is one of the 12 valid strings.-
845 - [=c=] Equivalence class where 'c' is any single character.-
846 - [c*n] Repeat the single character 'c' 'n' times. n may be omitted.-
847 However, if 'n' is present, it must be a non-negative octal or-
848 decimal integer.-
849 - r-s Range of characters from 'r' to 's'. The second endpoint must-
850 not precede the first in the current collating sequence.-
851 - c Any other character is interpreted as itself. */-
852-
853static bool-
854build_spec_list (const struct E_string *es, struct Spec_list *result)-
855{-
856 char const *p = es->s;-
857-
858 /* The main for-loop below recognizes the 4 multi-character constructs.-
859 A character that matches (in its context) none of the multi-character-
860 constructs is classified as 'normal'. Since all multi-character-
861 constructs have at least 3 characters, any strings of length 2 or-
862 less are composed solely of normal characters. Hence, the index of-
863 the outer for-loop runs only as far as LEN-2. */-
864 size_t i;-
865 for (i = 0; i + 2 < es->len; /* empty */)
i + 2 < es->lenDescription
TRUEevaluated 312 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 8567 times by 1 test
Evaluated by:
  • tr
312-8567
866 {-
867 if (es_match (es, i, '['))
es_match (es, i, '[')Description
TRUEevaluated 176 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 136 times by 1 test
Evaluated by:
  • tr
136-176
868 {-
869 bool matched_multi_char_construct;-
870 size_t closing_bracket_idx;-
871 unsigned char char_to_repeat;-
872 count repeat_count;-
873 int err;-
874-
875 matched_multi_char_construct = true;-
876 if (es_match (es, i + 1, ':') || es_match (es, i + 1, '='))
es_match (es, i + 1, ':')Description
TRUEevaluated 98 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 78 times by 1 test
Evaluated by:
  • tr
es_match (es, i + 1, '=')Description
TRUEevaluated 10 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 68 times by 1 test
Evaluated by:
  • tr
10-98
877 {-
878 size_t closing_delim_idx;-
879-
880 if (find_closing_delim (es, i + 2, p[i + 1], &closing_delim_idx))
find_closing_d...ing_delim_idx)Description
TRUEevaluated 106 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 2 times by 1 test
Evaluated by:
  • tr
2-106
881 {-
882 size_t opnd_str_len = closing_delim_idx - 1 - (i + 2) + 1;-
883 char const *opnd_str = p + i + 2;-
884-
885 if (opnd_str_len == 0)
opnd_str_len == 0Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 102 times by 1 test
Evaluated by:
  • tr
4-102
886 {-
887 if (p[i + 1] == ':')
p[i + 1] == ':'Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 2 times by 1 test
Evaluated by:
  • tr
2
888 error (0, 0, _("missing character class name '[::]'"));
executed 2 times by 1 test: error (0, 0, dcgettext (((void *)0), "missing character class name '[::]'" , 5) );
Executed by:
  • tr
2
889 else-
890 error (0, 0,
executed 2 times by 1 test: error (0, 0, dcgettext (((void *)0), "missing equivalence class character '[==]'" , 5) );
Executed by:
  • tr
2
891 _("missing equivalence class character '[==]'"));
executed 2 times by 1 test: error (0, 0, dcgettext (((void *)0), "missing equivalence class character '[==]'" , 5) );
Executed by:
  • tr
2
892 return false;
executed 4 times by 1 test: return 0 ;
Executed by:
  • tr
4
893 }-
894-
895 if (p[i + 1] == ':')
p[i + 1] == ':'Description
TRUEevaluated 94 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 8 times by 1 test
Evaluated by:
  • tr
8-94
896 {-
897 /* FIXME: big comment. */-
898 if (!append_char_class (result, opnd_str, opnd_str_len))
!append_char_c... opnd_str_len)Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 92 times by 1 test
Evaluated by:
  • tr
2-92
899 {-
900 if (star_digits_closebracket (es, i + 2))
star_digits_cl...et (es, i + 2)Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • tr
FALSEnever evaluated
0-2
901 goto try_bracketed_repeat;
executed 2 times by 1 test: goto try_bracketed_repeat;
Executed by:
  • tr
2
902 else-
903 {-
904 char *tmp = make_printable_str (opnd_str,-
905 opnd_str_len);-
906 error (0, 0, _("invalid character class %s"),-
907 quote (tmp));-
908 free (tmp);-
909 return false;
never executed: return 0 ;
0
910 }-
911 }-
912 }
executed 92 times by 1 test: end of block
Executed by:
  • tr
92
913 else-
914 {-
915 /* FIXME: big comment. */-
916 if (!append_equiv_class (result, opnd_str, opnd_str_len))
!append_equiv_... opnd_str_len)Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 6 times by 1 test
Evaluated by:
  • tr
2-6
917 {-
918 if (star_digits_closebracket (es, i + 2))
star_digits_cl...et (es, i + 2)Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • tr
FALSEnever evaluated
0-2
919 goto try_bracketed_repeat;
executed 2 times by 1 test: goto try_bracketed_repeat;
Executed by:
  • tr
2
920 else-
921 {-
922 char *tmp = make_printable_str (opnd_str,-
923 opnd_str_len);-
924 error (0, 0,-
925 _("%s: equivalence class operand must be a single character"),-
926 tmp);-
927 free (tmp);-
928 return false;
never executed: return 0 ;
0
929 }-
930 }-
931 }
executed 6 times by 1 test: end of block
Executed by:
  • tr
6
932-
933 i = closing_delim_idx + 2;-
934 continue;
executed 98 times by 1 test: continue;
Executed by:
  • tr
98
935 }-
936 /* Else fall through. This could be [:*] or [=*]. */-
937 }
executed 2 times by 1 test: end of block
Executed by:
  • tr
2
938-
939 try_bracketed_repeat:
code before this statement executed 70 times by 1 test: try_bracketed_repeat:
Executed by:
  • tr
70
940-
941 /* Determine whether this is a bracketed repeat range-
942 matching the RE \[.\*(dec_or_oct_number)?\]. */-
943 err = find_bracketed_repeat (es, i + 1, &char_to_repeat,-
944 &repeat_count,-
945 &closing_bracket_idx);-
946 if (err == 0)
err == 0Description
TRUEevaluated 60 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 14 times by 1 test
Evaluated by:
  • tr
14-60
947 {-
948 append_repeated_char (result, char_to_repeat, repeat_count);-
949 i = closing_bracket_idx + 1;-
950 }
executed 60 times by 1 test: end of block
Executed by:
  • tr
60
951 else if (err == -1)
err == -1Description
TRUEevaluated 12 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 2 times by 1 test
Evaluated by:
  • tr
2-12
952 {-
953 matched_multi_char_construct = false;-
954 }
executed 12 times by 1 test: end of block
Executed by:
  • tr
12
955 else-
956 {-
957 /* Found a string that looked like [c*n] but the-
958 numeric part was invalid. */-
959 return false;
executed 2 times by 1 test: return 0 ;
Executed by:
  • tr
2
960 }-
961-
962 if (matched_multi_char_construct)
matched_multi_char_constructDescription
TRUEevaluated 60 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 12 times by 1 test
Evaluated by:
  • tr
12-60
963 continue;
executed 60 times by 1 test: continue;
Executed by:
  • tr
60
964-
965 /* We reach this point if P does not match [:str:], [=c=],-
966 [c*n], or [c*]. Now, see if P looks like a range '[-c'-
967 (from '[' to 'c'). */-
968 }
executed 12 times by 1 test: end of block
Executed by:
  • tr
12
969-
970 /* Look ahead one char for ranges like a-z. */-
971 if (es_match (es, i + 1, '-'))
es_match (es, i + 1, '-')Description
TRUEevaluated 44 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 104 times by 1 test
Evaluated by:
  • tr
44-104
972 {-
973 if (!append_range (result, p[i], p[i + 2]))
!append_range ...[i], p[i + 2])Description
TRUEnever evaluated
FALSEevaluated 44 times by 1 test
Evaluated by:
  • tr
0-44
974 return false;
never executed: return 0 ;
0
975 i += 3;-
976 }
executed 44 times by 1 test: end of block
Executed by:
  • tr
44
977 else-
978 {-
979 append_normal_char (result, p[i]);-
980 ++i;-
981 }
executed 104 times by 1 test: end of block
Executed by:
  • tr
104
982 }-
983-
984 /* Now handle the (2 or fewer) remaining characters p[i]..p[es->len - 1]. */-
985 for (; i < es->len; i++)
i < es->lenDescription
TRUEevaluated 15918 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 8567 times by 1 test
Evaluated by:
  • tr
8567-15918
986 append_normal_char (result, p[i]);
executed 15918 times by 1 test: append_normal_char (result, p[i]);
Executed by:
  • tr
15918
987-
988 return true;
executed 8567 times by 1 test: return 1 ;
Executed by:
  • tr
8567
989}-
990-
991/* Advance past the current construct.-
992 S->tail must be non-NULL. */-
993static void-
994skip_construct (struct Spec_list *s)-
995{-
996 s->tail = s->tail->next;-
997 s->state = NEW_ELEMENT;-
998}
executed 34 times by 1 test: end of block
Executed by:
  • tr
34
999-
1000/* Given a Spec_list S (with its saved state implicit in the values-
1001 of its members 'tail' and 'state'), return the next single character-
1002 in the expansion of S's constructs. If the last character of S was-
1003 returned on the previous call or if S was empty, this function-
1004 returns -1. For example, successive calls to get_next where S-
1005 represents the spec-string 'a-d[y*3]' will return the sequence-
1006 of values a, b, c, d, y, y, y, -1. Finally, if the construct from-
1007 which the returned character comes is [:upper:] or [:lower:], the-
1008 parameter CLASS is given a value to indicate which it was. Otherwise-
1009 CLASS is set to UL_NONE. This value is used only when constructing-
1010 the translation table to verify that any occurrences of upper and-
1011 lower class constructs in the spec-strings appear in the same relative-
1012 positions. */-
1013-
1014static int-
1015get_next (struct Spec_list *s, enum Upper_Lower_class *class)-
1016{-
1017 struct List_element *p;-
1018 int return_val;-
1019 int i;-
1020-
1021 if (class)
classDescription
TRUEevaluated 29378 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 534509 times by 1 test
Evaluated by:
  • tr
29378-534509
1022 *class = UL_NONE;
executed 29378 times by 1 test: *class = UL_NONE;
Executed by:
  • tr
29378
1023-
1024 if (s->state == BEGIN_STATE)
s->state == ( ...551615UL) - 1)Description
TRUEevaluated 8627 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 555260 times by 1 test
Evaluated by:
  • tr
8627-555260
1025 {-
1026 s->tail = s->head->next;-
1027 s->state = NEW_ELEMENT;-
1028 }
executed 8627 times by 1 test: end of block
Executed by:
  • tr
8627
1029-
1030 p = s->tail;-
1031 if (p == NULL)
p == ((void *)0)Description
TRUEevaluated 8590 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 555297 times by 1 test
Evaluated by:
  • tr
8590-555297
1032 return -1;
executed 8590 times by 1 test: return -1;
Executed by:
  • tr
8590
1033-
1034 switch (p->type)-
1035 {-
1036 case RE_NORMAL_CHAR:
executed 16038 times by 1 test: case RE_NORMAL_CHAR:
Executed by:
  • tr
16038
1037 return_val = p->u.normal_char;-
1038 s->state = NEW_ELEMENT;-
1039 s->tail = p->next;-
1040 break;
executed 16038 times by 1 test: break;
Executed by:
  • tr
16038
1041-
1042 case RE_RANGE:
executed 623 times by 1 test: case RE_RANGE:
Executed by:
  • tr
623
1043 if (s->state == NEW_ELEMENT)
s->state == ((...5UL) - 1) + 1)Description
TRUEevaluated 46 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 577 times by 1 test
Evaluated by:
  • tr
46-577
1044 s->state = p->u.range.first_char;
executed 46 times by 1 test: s->state = p->u.range.first_char;
Executed by:
  • tr
46
1045 else-
1046 ++(s->state);
executed 577 times by 1 test: ++(s->state);
Executed by:
  • tr
577
1047 return_val = s->state;-
1048 if (s->state == p->u.range.last_char)
s->state == p-...ange.last_charDescription
TRUEevaluated 42 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 581 times by 1 test
Evaluated by:
  • tr
42-581
1049 {-
1050 s->tail = p->next;-
1051 s->state = NEW_ELEMENT;-
1052 }
executed 42 times by 1 test: end of block
Executed by:
  • tr
42
1053 break;
executed 623 times by 1 test: break;
Executed by:
  • tr
623
1054-
1055 case RE_CHAR_CLASS:
executed 2772 times by 1 test: case RE_CHAR_CLASS:
Executed by:
  • tr
2772
1056 if (class)
classDescription
TRUEevaluated 306 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 2466 times by 1 test
Evaluated by:
  • tr
306-2466
1057 {-
1058 switch (p->u.char_class)-
1059 {-
1060 case CC_LOWER:
executed 160 times by 1 test: case CC_LOWER:
Executed by:
  • tr
160
1061 *class = UL_LOWER;-
1062 break;
executed 160 times by 1 test: break;
Executed by:
  • tr
160
1063 case CC_UPPER:
executed 126 times by 1 test: case CC_UPPER:
Executed by:
  • tr
126
1064 *class = UL_UPPER;-
1065 break;
executed 126 times by 1 test: break;
Executed by:
  • tr
126
1066 default:
executed 20 times by 1 test: default:
Executed by:
  • tr
20
1067 break;
executed 20 times by 1 test: break;
Executed by:
  • tr
20
1068 }-
1069 }-
1070-
1071 if (s->state == NEW_ELEMENT)
s->state == ((...5UL) - 1) + 1)Description
TRUEevaluated 124 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 2648 times by 1 test
Evaluated by:
  • tr
124-2648
1072 {-
1073 for (i = 0; i < N_CHARS; i++)
i < N_CHARSDescription
TRUEevaluated 8526 times by 1 test
Evaluated by:
  • tr
FALSEnever evaluated
0-8526
1074 if (is_char_class_member (p->u.char_class, i))
is_char_class_...char_class, i)Description
TRUEevaluated 124 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 8402 times by 1 test
Evaluated by:
  • tr
124-8402
1075 break;
executed 124 times by 1 test: break;
Executed by:
  • tr
124
1076 assert (i < N_CHARS);-
1077 s->state = i;-
1078 }
executed 124 times by 1 test: end of block
Executed by:
  • tr
124
1079 assert (is_char_class_member (p->u.char_class, s->state));-
1080 return_val = s->state;-
1081 for (i = s->state + 1; i < N_CHARS; i++)
i < N_CHARSDescription
TRUEevaluated 16088 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 83 times by 1 test
Evaluated by:
  • tr
83-16088
1082 if (is_char_class_member (p->u.char_class, i))
is_char_class_...char_class, i)Description
TRUEevaluated 2689 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 13399 times by 1 test
Evaluated by:
  • tr
2689-13399
1083 break;
executed 2689 times by 1 test: break;
Executed by:
  • tr
2689
1084 if (i < N_CHARS)
i < N_CHARSDescription
TRUEevaluated 2689 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 83 times by 1 test
Evaluated by:
  • tr
83-2689
1085 s->state = i;
executed 2689 times by 1 test: s->state = i;
Executed by:
  • tr
2689
1086 else-
1087 {-
1088 s->tail = p->next;-
1089 s->state = NEW_ELEMENT;-
1090 }
executed 83 times by 1 test: end of block
Executed by:
  • tr
83
1091 break;
executed 2772 times by 1 test: break;
Executed by:
  • tr
2772
1092-
1093 case RE_EQUIV_CLASS:
executed 6 times by 1 test: case RE_EQUIV_CLASS:
Executed by:
  • tr
6
1094 /* FIXME: this assumes that each character is alone in its own-
1095 equivalence class (which appears to be correct for my-
1096 LC_COLLATE. But I don't know of any function that allows-
1097 one to determine a character's equivalence class. */-
1098-
1099 return_val = p->u.equiv_code;-
1100 s->state = NEW_ELEMENT;-
1101 s->tail = p->next;-
1102 break;
executed 6 times by 1 test: break;
Executed by:
  • tr
6
1103-
1104 case RE_REPEATED_CHAR:
executed 535858 times by 1 test: case RE_REPEATED_CHAR:
Executed by:
  • tr
535858
1105 /* Here, a repeat count of n == 0 means don't repeat at all. */-
1106 if (p->u.repeated_char.repeat_count == 0)
p->u.repeated_...eat_count == 0Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 535854 times by 1 test
Evaluated by:
  • tr
4-535854
1107 {-
1108 s->tail = p->next;-
1109 s->state = NEW_ELEMENT;-
1110 return_val = get_next (s, class);-
1111 }
executed 4 times by 1 test: end of block
Executed by:
  • tr
4
1112 else-
1113 {-
1114 if (s->state == NEW_ELEMENT)
s->state == ((...5UL) - 1) + 1)Description
TRUEevaluated 94 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 535760 times by 1 test
Evaluated by:
  • tr
94-535760
1115 {-
1116 s->state = 0;-
1117 }
executed 94 times by 1 test: end of block
Executed by:
  • tr
94
1118 ++(s->state);-
1119 return_val = p->u.repeated_char.the_repeated_char;-
1120 if (s->state == p->u.repeated_char.repeat_count)
s->state == p-...r.repeat_countDescription
TRUEevaluated 88 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 535766 times by 1 test
Evaluated by:
  • tr
88-535766
1121 {-
1122 s->tail = p->next;-
1123 s->state = NEW_ELEMENT;-
1124 }
executed 88 times by 1 test: end of block
Executed by:
  • tr
88
1125 }
executed 535854 times by 1 test: end of block
Executed by:
  • tr
535854
1126 break;
executed 535858 times by 1 test: break;
Executed by:
  • tr
535858
1127-
1128 default:
never executed: default:
0
1129 abort ();
never executed: abort ();
0
1130 }-
1131-
1132 return return_val;
executed 555297 times by 1 test: return return_val;
Executed by:
  • tr
555297
1133}-
1134-
1135/* This is a minor kludge. This function is called from-
1136 get_spec_stats to determine the cardinality of a set derived-
1137 from a complemented string. It's a kludge in that some of the-
1138 same operations are (duplicated) performed in set_initialize. */-
1139-
1140static int-
1141card_of_complement (struct Spec_list *s)-
1142{-
1143 int c;-
1144 int cardinality = N_CHARS;-
1145 bool in_set[N_CHARS] = { 0, };-
1146-
1147 s->state = BEGIN_STATE;-
1148 while ((c = get_next (s, NULL)) != -1)
(c = get_next ... *)0) )) != -1Description
TRUEevaluated 262921 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 27 times by 1 test
Evaluated by:
  • tr
27-262921
1149 {-
1150 cardinality -= (!in_set[c]);-
1151 in_set[c] = true;-
1152 }
executed 262921 times by 1 test: end of block
Executed by:
  • tr
262921
1153 return cardinality;
executed 27 times by 1 test: return cardinality;
Executed by:
  • tr
27
1154}-
1155-
1156/* Discard the lengths associated with a case conversion,-
1157 as using the actual number of upper or lower case characters-
1158 is problematic when they don't match in some locales.-
1159 Also ensure the case conversion classes in string2 are-
1160 aligned correctly with those in string1.-
1161 Note POSIX says the behavior of 'tr "[:upper:]" "[:upper:]"'-
1162 is undefined. Therefore we allow it (unlike Solaris)-
1163 and treat it as a no-op. */-
1164-
1165static void-
1166validate_case_classes (struct Spec_list *s1, struct Spec_list *s2)-
1167{-
1168 size_t n_upper = 0;-
1169 size_t n_lower = 0;-
1170 int c1 = 0;-
1171 int c2 = 0;-
1172 count old_s1_len = s1->length;-
1173 count old_s2_len = s2->length;-
1174 struct List_element *s1_tail = s1->tail;-
1175 struct List_element *s2_tail = s2->tail;-
1176 bool s1_new_element = true;-
1177 bool s2_new_element = true;-
1178-
1179 if (!s2->has_char_class)
!s2->has_char_classDescription
TRUEevaluated 4194 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 14 times by 1 test
Evaluated by:
  • tr
14-4194
1180 return;
executed 4194 times by 1 test: return;
Executed by:
  • tr
4194
1181-
1182 for (int i = 0; i < N_CHARS; i++)
i < N_CHARSDescription
TRUEevaluated 3584 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 14 times by 1 test
Evaluated by:
  • tr
14-3584
1183 {-
1184 if (isupper (i))
((*__ctype_b_l...int) _ISupper)Description
TRUEevaluated 364 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 3220 times by 1 test
Evaluated by:
  • tr
364-3220
1185 n_upper++;
executed 364 times by 1 test: n_upper++;
Executed by:
  • tr
364
1186 if (islower (i))
((*__ctype_b_l...int) _ISlower)Description
TRUEevaluated 364 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 3220 times by 1 test
Evaluated by:
  • tr
364-3220
1187 n_lower++;
executed 364 times by 1 test: n_lower++;
Executed by:
  • tr
364
1188 }
executed 3584 times by 1 test: end of block
Executed by:
  • tr
3584
1189-
1190 s1->state = BEGIN_STATE;-
1191 s2->state = BEGIN_STATE;-
1192-
1193 while (c1 != -1 && c2 != -1)
c1 != -1Description
TRUEevaluated 164 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 7 times by 1 test
Evaluated by:
  • tr
c2 != -1Description
TRUEevaluated 162 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 2 times by 1 test
Evaluated by:
  • tr
2-164
1194 {-
1195 enum Upper_Lower_class class_s1, class_s2;-
1196-
1197 c1 = get_next (s1, &class_s1);-
1198 c2 = get_next (s2, &class_s2);-
1199-
1200 /* If c2 transitions to a new case class, then-
1201 c1 must also transition at the same time. */-
1202 if (s2_new_element && class_s2 != UL_NONE
s2_new_elementDescription
TRUEevaluated 30 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 132 times by 1 test
Evaluated by:
  • tr
class_s2 != UL_NONEDescription
TRUEevaluated 14 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 16 times by 1 test
Evaluated by:
  • tr
14-132
1203 && !(s1_new_element && class_s1 != UL_NONE))
s1_new_elementDescription
TRUEevaluated 11 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 3 times by 1 test
Evaluated by:
  • tr
class_s1 != UL_NONEDescription
TRUEevaluated 9 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 2 times by 1 test
Evaluated by:
  • tr
2-11
1204 die (EXIT_FAILURE, 0,
executed 5 times by 1 test: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"misaligned [:upper:] and/or [:lower:] construct\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgettext (((void *)0), "misaligned [:upper:] and/or [:lower:] construct" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "misaligned [:upper:] and/or [:lower:] construct" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
Executed by:
  • tr
5
1205 _("misaligned [:upper:] and/or [:lower:] construct"));
executed 5 times by 1 test: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"misaligned [:upper:] and/or [:lower:] construct\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgettext (((void *)0), "misaligned [:upper:] and/or [:lower:] construct" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "misaligned [:upper:] and/or [:lower:] construct" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
Executed by:
  • tr
5
1206-
1207 /* If case converting, quickly skip over the elements. */-
1208 if (class_s2 != UL_NONE)
class_s2 != UL_NONEDescription
TRUEevaluated 9 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 148 times by 1 test
Evaluated by:
  • tr
9-148
1209 {-
1210 skip_construct (s1);-
1211 skip_construct (s2);-
1212 /* Discount insignificant/problematic lengths. */-
1213 s1->length -= (class_s1 == UL_UPPER ? n_upper : n_lower) - 1;
class_s1 == UL_UPPERDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 5 times by 1 test
Evaluated by:
  • tr
4-5
1214 s2->length -= (class_s2 == UL_UPPER ? n_upper : n_lower) - 1;
class_s2 == UL_UPPERDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 3 times by 1 test
Evaluated by:
  • tr
3-6
1215 }
executed 9 times by 1 test: end of block
Executed by:
  • tr
9
1216-
1217 s1_new_element = s1->state == NEW_ELEMENT; /* Next element is new. */-
1218 s2_new_element = s2->state == NEW_ELEMENT; /* Next element is new. */-
1219 }
executed 157 times by 1 test: end of block
Executed by:
  • tr
157
1220-
1221 assert (old_s1_len >= s1->length && old_s2_len >= s2->length);-
1222-
1223 s1->tail = s1_tail;-
1224 s2->tail = s2_tail;-
1225}
executed 9 times by 1 test: end of block
Executed by:
  • tr
9
1226-
1227/* Gather statistics about the spec-list S in preparation for the tests-
1228 in validate that determine the consistency of the specs. This function-
1229 is called at most twice; once for string1, and again for any string2.-
1230 LEN_S1 < 0 indicates that this is the first call and that S represents-
1231 string1. When LEN_S1 >= 0, it is the length of the expansion of the-
1232 constructs in string1, and we can use its value to resolve any-
1233 indefinite repeat construct in S (which represents string2). Hence,-
1234 this function has the side-effect that it converts a valid [c*]-
1235 construct in string2 to [c*n] where n is large enough (or 0) to give-
1236 string2 the same length as string1. For example, with the command-
1237 tr a-z 'A[\n*]Z' on the second call to get_spec_stats, LEN_S1 would-
1238 be 26 and S (representing string2) would be converted to 'A[\n*24]Z'. */-
1239-
1240static void-
1241get_spec_stats (struct Spec_list *s)-
1242{-
1243 struct List_element *p;-
1244 count length = 0;-
1245-
1246 s->n_indefinite_repeats = 0;-
1247 s->has_equiv_class = false;-
1248 s->has_restricted_char_class = false;-
1249 s->has_char_class = false;-
1250 for (p = s->head->next; p; p = p->next)
pDescription
TRUEevaluated 16224 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 8567 times by 1 test
Evaluated by:
  • tr
8567-16224
1251 {-
1252 count len = 0;-
1253 count new_length;-
1254-
1255 switch (p->type)-
1256 {-
1257 case RE_NORMAL_CHAR:
executed 16022 times by 1 test: case RE_NORMAL_CHAR:
Executed by:
  • tr
16022
1258 len = 1;-
1259 break;
executed 16022 times by 1 test: break;
Executed by:
  • tr
16022
1260-
1261 case RE_RANGE:
executed 44 times by 1 test: case RE_RANGE:
Executed by:
  • tr
44
1262 assert (p->u.range.last_char >= p->u.range.first_char);-
1263 len = p->u.range.last_char - p->u.range.first_char + 1;-
1264 break;
executed 44 times by 1 test: break;
Executed by:
  • tr
44
1265-
1266 case RE_CHAR_CLASS:
executed 92 times by 1 test: case RE_CHAR_CLASS:
Executed by:
  • tr
92
1267 s->has_char_class = true;-
1268 for (int i = 0; i < N_CHARS; i++)
i < N_CHARSDescription
TRUEevaluated 23552 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 92 times by 1 test
Evaluated by:
  • tr
92-23552
1269 if (is_char_class_member (p->u.char_class, i))
is_char_class_...char_class, i)Description
TRUEevaluated 2770 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 20782 times by 1 test
Evaluated by:
  • tr
2770-20782
1270 ++len;
executed 2770 times by 1 test: ++len;
Executed by:
  • tr
2770
1271 switch (p->u.char_class)-
1272 {-
1273 case CC_UPPER:
executed 29 times by 1 test: case CC_UPPER:
Executed by:
  • tr
29
1274 case CC_LOWER:
executed 27 times by 1 test: case CC_LOWER:
Executed by:
  • tr
27
1275 break;
executed 56 times by 1 test: break;
Executed by:
  • tr
56
1276 default:
executed 36 times by 1 test: default:
Executed by:
  • tr
36
1277 s->has_restricted_char_class = true;-
1278 break;
executed 36 times by 1 test: break;
Executed by:
  • tr
36
1279 }-
1280 break;
executed 92 times by 1 test: break;
Executed by:
  • tr
92
1281-
1282 case RE_EQUIV_CLASS:
executed 6 times by 1 test: case RE_EQUIV_CLASS:
Executed by:
  • tr
6
1283 for (int i = 0; i < N_CHARS; i++)
i < N_CHARSDescription
TRUEevaluated 1536 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 6 times by 1 test
Evaluated by:
  • tr
6-1536
1284 if (is_equiv_class_member (p->u.equiv_code, i))
is_equiv_class...equiv_code, i)Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 1530 times by 1 test
Evaluated by:
  • tr
6-1530
1285 ++len;
executed 6 times by 1 test: ++len;
Executed by:
  • tr
6
1286 s->has_equiv_class = true;-
1287 break;
executed 6 times by 1 test: break;
Executed by:
  • tr
6
1288-
1289 case RE_REPEATED_CHAR:
executed 60 times by 1 test: case RE_REPEATED_CHAR:
Executed by:
  • tr
60
1290 if (p->u.repeated_char.repeat_count > 0)
p->u.repeated_...peat_count > 0Description
TRUEevaluated 20 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 40 times by 1 test
Evaluated by:
  • tr
20-40
1291 len = p->u.repeated_char.repeat_count;
executed 20 times by 1 test: len = p->u.repeated_char.repeat_count;
Executed by:
  • tr
20
1292 else-
1293 {-
1294 s->indefinite_repeat_element = p;-
1295 ++(s->n_indefinite_repeats);-
1296 }
executed 40 times by 1 test: end of block
Executed by:
  • tr
40
1297 break;
executed 60 times by 1 test: break;
Executed by:
  • tr
60
1298-
1299 default:
never executed: default:
0
1300 abort ();
never executed: abort ();
0
1301 }-
1302-
1303 /* Check for arithmetic overflow in computing length. Also, reject-
1304 any length greater than the maximum repeat count, in case the-
1305 length is later used to compute the repeat count for an-
1306 indefinite element. */-
1307 new_length = length + len;-
1308 if (! (length <= new_length && new_length <= REPEAT_COUNT_MAXIMUM))
length <= new_lengthDescription
TRUEevaluated 16224 times by 1 test
Evaluated by:
  • tr
FALSEnever evaluated
new_length <= ...551615UL) - 1)Description
TRUEevaluated 16224 times by 1 test
Evaluated by:
  • tr
FALSEnever evaluated
0-16224
1309 die (EXIT_FAILURE, 0, _("too many characters in set"));
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"too many characters in set\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgettext (((void *)0), "too many characters in set" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "too many characters in set" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))));
0
1310 length = new_length;-
1311 }
executed 16224 times by 1 test: end of block
Executed by:
  • tr
16224
1312-
1313 s->length = length;-
1314}
executed 8567 times by 1 test: end of block
Executed by:
  • tr
8567
1315-
1316static void-
1317get_s1_spec_stats (struct Spec_list *s1)-
1318{-
1319 get_spec_stats (s1);-
1320 if (complement)
complementDescription
TRUEevaluated 27 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 4316 times by 1 test
Evaluated by:
  • tr
27-4316
1321 s1->length = card_of_complement (s1);
executed 27 times by 1 test: s1->length = card_of_complement (s1);
Executed by:
  • tr
27
1322}
executed 4343 times by 1 test: end of block
Executed by:
  • tr
4343
1323-
1324static void-
1325get_s2_spec_stats (struct Spec_list *s2, count len_s1)-
1326{-
1327 get_spec_stats (s2);-
1328 if (len_s1 >= s2->length && s2->n_indefinite_repeats == 1)
len_s1 >= s2->lengthDescription
TRUEevaluated 4215 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 9 times by 1 test
Evaluated by:
  • tr
s2->n_indefinite_repeats == 1Description
TRUEevaluated 40 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 4175 times by 1 test
Evaluated by:
  • tr
9-4215
1329 {-
1330 s2->indefinite_repeat_element->u.repeated_char.repeat_count =-
1331 len_s1 - s2->length;-
1332 s2->length = len_s1;-
1333 }
executed 40 times by 1 test: end of block
Executed by:
  • tr
40
1334}
executed 4224 times by 1 test: end of block
Executed by:
  • tr
4224
1335-
1336static void-
1337spec_init (struct Spec_list *spec_list)-
1338{-
1339 struct List_element *new = xmalloc (sizeof *new);-
1340 spec_list->head = spec_list->tail = new;-
1341 spec_list->head->next = NULL;-
1342}
executed 8573 times by 1 test: end of block
Executed by:
  • tr
8573
1343-
1344/* This function makes two passes over the argument string S. The first-
1345 one converts all \c and \ddd escapes to their one-byte representations.-
1346 The second constructs a linked specification list, SPEC_LIST, of the-
1347 characters and constructs that comprise the argument string. If either-
1348 of these passes detects an error, this function returns false. */-
1349-
1350static bool-
1351parse_str (char const *s, struct Spec_list *spec_list)-
1352{-
1353 struct E_string es;-
1354 bool ok = unquote (s, &es) && build_spec_list (&es, spec_list);
unquote (s, &es)Description
TRUEevaluated 8573 times by 1 test
Evaluated by:
  • tr
FALSEnever evaluated
build_spec_lis...es, spec_list)Description
TRUEevaluated 8567 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 6 times by 1 test
Evaluated by:
  • tr
0-8573
1355 es_free (&es);-
1356 return ok;
executed 8573 times by 1 test: return ok;
Executed by:
  • tr
8573
1357}-
1358-
1359/* Given two specification lists, S1 and S2, and assuming that-
1360 S1->length > S2->length, append a single [c*n] element to S2 where c-
1361 is the last character in the expansion of S2 and n is the difference-
1362 between the two lengths.-
1363 Upon successful completion, S2->length is set to S1->length. The only-
1364 way this function can fail to make S2 as long as S1 is when S2 has-
1365 zero-length, since in that case, there is no last character to repeat.-
1366 So S2->length is required to be at least 1. */-
1367-
1368static void-
1369string2_extend (const struct Spec_list *s1, struct Spec_list *s2)-
1370{-
1371 struct List_element *p;-
1372 unsigned char char_to_repeat;-
1373-
1374 assert (translating);-
1375 assert (s1->length > s2->length);-
1376 assert (s2->length > 0);-
1377-
1378 p = s2->tail;-
1379 switch (p->type)-
1380 {-
1381 case RE_NORMAL_CHAR:
executed 7 times by 1 test: case RE_NORMAL_CHAR:
Executed by:
  • tr
7
1382 char_to_repeat = p->u.normal_char;-
1383 break;
executed 7 times by 1 test: break;
Executed by:
  • tr
7
1384 case RE_RANGE:
executed 2 times by 1 test: case RE_RANGE:
Executed by:
  • tr
2
1385 char_to_repeat = p->u.range.last_char;-
1386 break;
executed 2 times by 1 test: break;
Executed by:
  • tr
2
1387 case RE_CHAR_CLASS:
executed 1 time by 1 test: case RE_CHAR_CLASS:
Executed by:
  • tr
1
1388 /* Note BSD allows extending of classes in string2. For example:-
1389 tr '[:upper:]0-9' '[:lower:]'-
1390 That's not portable however, contradicts POSIX and is dependent-
1391 on your collating sequence. */-
1392 die (EXIT_FAILURE, 0,-
1393 _("when translating with string1 longer than string2,\nthe\-
1394 latter string must not end with a character class"));-
1395-
1396 case RE_REPEATED_CHAR:
code before this statement never executed: case RE_REPEATED_CHAR:
never executed: case RE_REPEATED_CHAR:
0
1397 char_to_repeat = p->u.repeated_char.the_repeated_char;-
1398 break;
never executed: break;
0
1399-
1400 case RE_EQUIV_CLASS:
never executed: case RE_EQUIV_CLASS:
0
1401 /* This shouldn't happen, because validate exits with an error-
1402 if it finds an equiv class in string2 when translating. */-
1403 abort ();
never executed: abort ();
0
1404-
1405 default:
code before this statement never executed: default:
never executed: default:
0
1406 abort ();
never executed: abort ();
0
1407 }-
1408-
1409 append_repeated_char (s2, char_to_repeat, s1->length - s2->length);-
1410 s2->length = s1->length;-
1411}
executed 9 times by 1 test: end of block
Executed by:
  • tr
9
1412-
1413/* Return true if S is a non-empty list in which exactly one-
1414 character (but potentially, many instances of it) appears.-
1415 E.g., [X*] or xxxxxxxx. */-
1416-
1417static bool-
1418homogeneous_spec_list (struct Spec_list *s)-
1419{-
1420 int b, c;-
1421-
1422 s->state = BEGIN_STATE;-
1423-
1424 if ((b = get_next (s, NULL)) == -1)
(b = get_next ... *)0) )) == -1Description
TRUEnever evaluated
FALSEevaluated 12 times by 1 test
Evaluated by:
  • tr
0-12
1425 return false;
never executed: return 0 ;
0
1426-
1427 while ((c = get_next (s, NULL)) != -1)
(c = get_next ... *)0) )) != -1Description
TRUEevaluated 1672 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 8 times by 1 test
Evaluated by:
  • tr
8-1672
1428 if (c != b)
c != bDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 1668 times by 1 test
Evaluated by:
  • tr
4-1668
1429 return false;
executed 4 times by 1 test: return 0 ;
Executed by:
  • tr
4
1430-
1431 return true;
executed 8 times by 1 test: return 1 ;
Executed by:
  • tr
8
1432}-
1433-
1434/* Die with an error message if S1 and S2 describe strings that-
1435 are not valid with the given command line switches.-
1436 A side effect of this function is that if a valid [c*] or-
1437 [c*0] construct appears in string2, it is converted to [c*n]-
1438 with a value for n that makes s2->length == s1->length. By-
1439 the same token, if the --truncate-set1 option is not-
1440 given, S2 may be extended. */-
1441-
1442static void-
1443validate (struct Spec_list *s1, struct Spec_list *s2)-
1444{-
1445 get_s1_spec_stats (s1);-
1446 if (s1->n_indefinite_repeats > 0)
s1->n_indefinite_repeats > 0Description
TRUEnever evaluated
FALSEevaluated 4343 times by 1 test
Evaluated by:
  • tr
0-4343
1447 {-
1448 die (EXIT_FAILURE, 0,-
1449 _("the [c*] repeat construct may not appear in string1"));-
1450 }
never executed: end of block
0
1451-
1452 if (s2)
s2Description
TRUEevaluated 4224 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 119 times by 1 test
Evaluated by:
  • tr
119-4224
1453 {-
1454 get_s2_spec_stats (s2, s1->length);-
1455-
1456 if (s2->n_indefinite_repeats > 1)
s2->n_indefinite_repeats > 1Description
TRUEnever evaluated
FALSEevaluated 4224 times by 1 test
Evaluated by:
  • tr
0-4224
1457 {-
1458 die (EXIT_FAILURE, 0,-
1459 _("only one [c*] repeat construct may appear in string2"));-
1460 }
never executed: end of block
0
1461-
1462 if (translating)
translatingDescription
TRUEevaluated 4208 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 16 times by 1 test
Evaluated by:
  • tr
16-4208
1463 {-
1464 if (s2->has_equiv_class)
s2->has_equiv_classDescription
TRUEnever evaluated
FALSEevaluated 4208 times by 1 test
Evaluated by:
  • tr
0-4208
1465 {-
1466 die (EXIT_FAILURE, 0,-
1467 _("[=c=] expressions may not appear in string2\-
1468 when translating"));-
1469 }
never executed: end of block
0
1470-
1471 if (s2->has_restricted_char_class)
s2->has_restricted_char_classDescription
TRUEnever evaluated
FALSEevaluated 4208 times by 1 test
Evaluated by:
  • tr
0-4208
1472 {-
1473 die (EXIT_FAILURE, 0,-
1474 _("when translating, the only character classes that may\-
1475 appear in\nstring2 are 'upper' and 'lower'"));-
1476 }
never executed: end of block
0
1477-
1478 validate_case_classes (s1, s2);-
1479-
1480 if (s1->length > s2->length)
s1->length > s2->lengthDescription
TRUEevaluated 14 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 4189 times by 1 test
Evaluated by:
  • tr
14-4189
1481 {-
1482 if (!truncate_set1)
!truncate_set1Description
TRUEevaluated 12 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 2 times by 1 test
Evaluated by:
  • tr
2-12
1483 {-
1484 /* string2 must be non-empty unless --truncate-set1 is-
1485 given or string1 is empty. */-
1486-
1487 if (s2->length == 0)
s2->length == 0Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 10 times by 1 test
Evaluated by:
  • tr
2-10
1488 die (EXIT_FAILURE, 0,
executed 2 times by 1 test: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"when not truncating set1, string2 must be non-empty\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgettext (((void *)0), "w...truncating set1, string2 must be non-empty" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "when not truncating set1, string2 must be non-empty" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
Executed by:
  • tr
2
1489 _("when not truncating set1, string2 must be non-empty"));
executed 2 times by 1 test: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"when not truncating set1, string2 must be non-empty\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgettext (((void *)0), "w...truncating set1, string2 must be non-empty" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "when not truncating set1, string2 must be non-empty" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
Executed by:
  • tr
2
1490 string2_extend (s1, s2);-
1491 }
executed 9 times by 1 test: end of block
Executed by:
  • tr
9
1492 }
executed 11 times by 1 test: end of block
Executed by:
  • tr
11
1493-
1494 if (complement && s1->has_char_class
complementDescription
TRUEevaluated 19 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 4181 times by 1 test
Evaluated by:
  • tr
s1->has_char_classDescription
TRUEevaluated 12 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 7 times by 1 test
Evaluated by:
  • tr
7-4181
1495 && ! (s2->length == s1->length && homogeneous_spec_list (s2)))
s2->length == s1->lengthDescription
TRUEevaluated 12 times by 1 test
Evaluated by:
  • tr
FALSEnever evaluated
homogeneous_spec_list (s2)Description
TRUEevaluated 8 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 4 times by 1 test
Evaluated by:
  • tr
0-12
1496 {-
1497 die (EXIT_FAILURE, 0,-
1498 _("when translating with complemented character classes,\-
1499\nstring2 must map all characters in the domain to one"));-
1500 }
never executed: end of block
0
1501 }
executed 4196 times by 1 test: end of block
Executed by:
  • tr
4196
1502 else-
1503 /* Not translating. */-
1504 {-
1505 if (s2->n_indefinite_repeats > 0)
s2->n_indefinite_repeats > 0Description
TRUEnever evaluated
FALSEevaluated 16 times by 1 test
Evaluated by:
  • tr
0-16
1506 die (EXIT_FAILURE, 0,
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"the [c*] construct may appear in string2 only when translating\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgettext (((vo...n string2 only when translating" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "the [c*] construct may appear in string2 only when translating" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
0
1507 _("the [c*] construct may appear in string2 only\
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"the [c*] construct may appear in string2 only when translating\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgettext (((vo...n string2 only when translating" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "the [c*] construct may appear in string2 only when translating" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
0
1508 when translating"
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"the [c*] construct may appear in string2 only when translating\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgettext (((vo...n string2 only when translating" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "the [c*] construct may appear in string2 only when translating" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
));
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"the [c*] construct may appear in string2 only when translating\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgettext (((vo...n string2 only when translating" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "the [c*] construct may appear in string2 only when translating" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
0
1509 }
executed 16 times by 1 test: end of block
Executed by:
  • tr
16
1510 }-
1511}
executed 4331 times by 1 test: end of block
Executed by:
  • tr
4331
1512-
1513/* Read buffers of SIZE bytes via the function READER (if READER is-
1514 NULL, read from stdin) until EOF. When non-NULL, READER is either-
1515 read_and_delete or read_and_xlate. After each buffer is read, it is-
1516 processed and written to stdout. The buffers are processed so that-
1517 multiple consecutive occurrences of the same character in the input-
1518 stream are replaced by a single occurrence of that character if the-
1519 character is in the squeeze set. */-
1520-
1521static void-
1522squeeze_filter (char *buf, size_t size, size_t (*reader) (char *, size_t))-
1523{-
1524 /* A value distinct from any character that may have been stored in a-
1525 buffer as the result of a block-read in the function squeeze_filter. */-
1526 const int NOT_A_CHAR = INT_MAX;-
1527-
1528 int char_to_squeeze = NOT_A_CHAR;-
1529 size_t i = 0;-
1530 size_t nr = 0;-
1531-
1532 while (true)-
1533 {-
1534 if (i >= nr)
i >= nrDescription
TRUEevaluated 82 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 198 times by 1 test
Evaluated by:
  • tr
82-198
1535 {-
1536 nr = reader (buf, size);-
1537 if (nr == 0)
nr == 0Description
TRUEevaluated 43 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 39 times by 1 test
Evaluated by:
  • tr
39-43
1538 break;
executed 43 times by 1 test: break;
Executed by:
  • tr
43
1539 i = 0;-
1540 }
executed 39 times by 1 test: end of block
Executed by:
  • tr
39
1541-
1542 size_t begin = i;-
1543-
1544 if (char_to_squeeze == NOT_A_CHAR)
char_to_squeeze == NOT_A_CHARDescription
TRUEevaluated 237 times by 1 test
Evaluated by:
  • tr
FALSEnever evaluated
0-237
1545 {-
1546 size_t out_len;-
1547 /* Here, by being a little tricky, we can get a significant-
1548 performance increase in most cases when the input is-
1549 reasonably large. Since tr will modify the input only-
1550 if two consecutive (and identical) input characters are-
1551 in the squeeze set, we can step by two through the data-
1552 when searching for a character in the squeeze set. This-
1553 means there may be a little more work in a few cases and-
1554 perhaps twice as much work in the worst cases where most-
1555 of the input is removed by squeezing repeats. But most-
1556 uses of this functionality seem to remove less than 20-30%-
1557 of the input. */-
1558 for (; i < nr && !in_squeeze_set[to_uchar (buf[i])]; i += 2)
i < nrDescription
TRUEevaluated 490 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 13 times by 1 test
Evaluated by:
  • tr
!in_squeeze_se...char (buf[i])]Description
TRUEevaluated 266 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 224 times by 1 test
Evaluated by:
  • tr
13-490
1559 continue;
executed 266 times by 1 test: continue;
Executed by:
  • tr
266
1560-
1561 /* There is a special case when i == nr and we've just-
1562 skipped a character (the last one in buf) that is in-
1563 the squeeze set. */-
1564 if (i == nr && in_squeeze_set[to_uchar (buf[i - 1])])
i == nrDescription
TRUEevaluated 8 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 229 times by 1 test
Evaluated by:
  • tr
in_squeeze_set... (buf[i - 1])]Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 4 times by 1 test
Evaluated by:
  • tr
4-229
1565 --i;
executed 4 times by 1 test: --i;
Executed by:
  • tr
4
1566-
1567 if (i >= nr)
i >= nrDescription
TRUEevaluated 9 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 228 times by 1 test
Evaluated by:
  • tr
9-228
1568 out_len = nr - begin;
executed 9 times by 1 test: out_len = nr - begin;
Executed by:
  • tr
9
1569 else-
1570 {-
1571 char_to_squeeze = buf[i];-
1572 /* We're about to output buf[begin..i]. */-
1573 out_len = i - begin + 1;-
1574-
1575 /* But since we stepped by 2 in the loop above,-
1576 out_len may be one too large. */-
1577 if (i > 0 && buf[i - 1] == char_to_squeeze)
i > 0Description
TRUEevaluated 203 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 25 times by 1 test
Evaluated by:
  • tr
buf[i - 1] == char_to_squeezeDescription
TRUEevaluated 157 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 46 times by 1 test
Evaluated by:
  • tr
25-203
1578 --out_len;
executed 157 times by 1 test: --out_len;
Executed by:
  • tr
157
1579-
1580 /* Advance i to the index of first character to be-
1581 considered when looking for a char different from-
1582 char_to_squeeze. */-
1583 ++i;-
1584 }
executed 228 times by 1 test: end of block
Executed by:
  • tr
228
1585 if (out_len > 0
out_len > 0Description
TRUEevaluated 237 times by 1 test
Evaluated by:
  • tr
FALSEnever evaluated
0-237
1586 && fwrite (&buf[begin], 1, out_len, stdout) != out_len)
never executed: break;
(__builtin_exp...r++))) == (-1)Description
TRUEnever evaluated
FALSEnever evaluated
__cnt > 0Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_expe...write_end), 0)Description
TRUEnever evaluated
FALSEnever evaluated
(__extension__...))) != out_lenDescription
TRUEnever evaluated
FALSEevaluated 237 times by 1 test
Evaluated by:
  • tr
__builtin_constant_p ( 1 )Description
TRUEevaluated 237 times by 1 test
Evaluated by:
  • tr
FALSEnever evaluated
__builtin_cons..._p ( out_len )Description
TRUEnever evaluated
FALSEevaluated 237 times by 1 test
Evaluated by:
  • tr
(size_t) ( 1 )...out_len ) <= 8Description
TRUEnever evaluated
FALSEnever evaluated
(size_t) ( 1 ) != 0Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( 1 )Description
TRUEevaluated 237 times by 1 test
Evaluated by:
  • tr
FALSEnever evaluated
(size_t) ( 1 ) == 0Description
TRUEnever evaluated
FALSEevaluated 237 times by 1 test
Evaluated by:
  • tr
__builtin_cons..._p ( out_len )Description
TRUEnever evaluated
FALSEevaluated 237 times by 1 test
Evaluated by:
  • tr
(size_t) ( out_len ) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-237
1587 die (EXIT_FAILURE, errno, _("write error"));
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, (*__errno_location ()), dcgettext (((void *)0), \"write error\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "write error" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "write error" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))));
0
1588 }
executed 237 times by 1 test: end of block
Executed by:
  • tr
237
1589-
1590 if (char_to_squeeze != NOT_A_CHAR)
char_to_squeeze != NOT_A_CHARDescription
TRUEevaluated 228 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 9 times by 1 test
Evaluated by:
  • tr
9-228
1591 {-
1592 /* Advance i to index of first char != char_to_squeeze-
1593 (or to nr if all the rest of the characters in this-
1594 buffer are the same as char_to_squeeze). */-
1595 for (; i < nr && buf[i] == char_to_squeeze; i++)
i < nrDescription
TRUEevaluated 425 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 30 times by 1 test
Evaluated by:
  • tr
buf[i] == char_to_squeezeDescription
TRUEevaluated 227 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 198 times by 1 test
Evaluated by:
  • tr
30-425
1596 continue;
executed 227 times by 1 test: continue;
Executed by:
  • tr
227
1597 if (i < nr)
i < nrDescription
TRUEevaluated 198 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 30 times by 1 test
Evaluated by:
  • tr
30-198
1598 char_to_squeeze = NOT_A_CHAR;
executed 198 times by 1 test: char_to_squeeze = NOT_A_CHAR;
Executed by:
  • tr
198
1599 /* If (i >= nr) we've squeezed the last character in this buffer.-
1600 So now we have to read a new buffer and continue comparing-
1601 characters against char_to_squeeze. */-
1602 }
executed 228 times by 1 test: end of block
Executed by:
  • tr
228
1603 }
executed 237 times by 1 test: end of block
Executed by:
  • tr
237
1604}
executed 43 times by 1 test: end of block
Executed by:
  • tr
43
1605-
1606static size_t-
1607plain_read (char *buf, size_t size)-
1608{-
1609 size_t nr = safe_read (STDIN_FILENO, buf, size);-
1610 if (nr == SAFE_READ_ERROR)
nr == ((size_t) -1)Description
TRUEnever evaluated
FALSEevaluated 8917 times by 1 test
Evaluated by:
  • tr
0-8917
1611 die (EXIT_FAILURE, errno, _("read error"));
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, (*__errno_location ()), dcgettext (((void *)0), \"read error\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "read error" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "read error" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))));
0
1612 return nr;
executed 8917 times by 1 test: return nr;
Executed by:
  • tr
8917
1613}-
1614-
1615/* Read buffers of SIZE bytes from stdin until one is found that-
1616 contains at least one character not in the delete set. Store-
1617 in the array BUF, all characters from that buffer that are not-
1618 in the delete set, and return the number of characters saved-
1619 or 0 upon EOF. */-
1620-
1621static size_t-
1622read_and_delete (char *buf, size_t size)-
1623{-
1624 size_t n_saved;-
1625-
1626 /* This enclosing do-while loop is to make sure that-
1627 we don't return zero (indicating EOF) when we've-
1628 just deleted all the characters in a buffer. */-
1629 do-
1630 {-
1631 size_t nr = plain_read (buf, size);-
1632-
1633 if (nr == 0)
nr == 0Description
TRUEevaluated 125 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 179 times by 1 test
Evaluated by:
  • tr
125-179
1634 return 0;
executed 125 times by 1 test: return 0;
Executed by:
  • tr
125
1635-
1636 /* This first loop may be a waste of code, but gives much-
1637 better performance when no characters are deleted in-
1638 the beginning of a buffer. It just avoids the copying-
1639 of buf[i] into buf[n_saved] when it would be a NOP. */-
1640-
1641 size_t i;-
1642 for (i = 0; i < nr && !in_delete_set[to_uchar (buf[i])]; i++)
i < nrDescription
TRUEevaluated 4515 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 2 times by 1 test
Evaluated by:
  • tr
!in_delete_set...char (buf[i])]Description
TRUEevaluated 4338 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 177 times by 1 test
Evaluated by:
  • tr
2-4515
1643 continue;
executed 4338 times by 1 test: continue;
Executed by:
  • tr
4338
1644 n_saved = i;-
1645-
1646 for (++i; i < nr; i++)
i < nrDescription
TRUEevaluated 4124 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 179 times by 1 test
Evaluated by:
  • tr
179-4124
1647 if (!in_delete_set[to_uchar (buf[i])])
!in_delete_set...char (buf[i])]Description
TRUEevaluated 3060 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 1064 times by 1 test
Evaluated by:
  • tr
1064-3060
1648 buf[n_saved++] = buf[i];
executed 3060 times by 1 test: buf[n_saved++] = buf[i];
Executed by:
  • tr
3060
1649 }
executed 179 times by 1 test: end of block
Executed by:
  • tr
179
1650 while (n_saved == 0);
n_saved == 0Description
TRUEevaluated 14 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 165 times by 1 test
Evaluated by:
  • tr
14-165
1651-
1652 return n_saved;
executed 165 times by 1 test: return n_saved;
Executed by:
  • tr
165
1653}-
1654-
1655/* Read at most SIZE bytes from stdin into the array BUF. Then-
1656 perform the in-place and one-to-one mapping specified by the global-
1657 array 'xlate'. Return the number of characters read, or 0 upon EOF. */-
1658-
1659static size_t-
1660read_and_xlate (char *buf, size_t size)-
1661{-
1662 size_t bytes_read = plain_read (buf, size);-
1663-
1664 for (size_t i = 0; i < bytes_read; i++)
i < bytes_readDescription
TRUEevaluated 1153035 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 8593 times by 1 test
Evaluated by:
  • tr
8593-1153035
1665 buf[i] = xlate[to_uchar (buf[i])];
executed 1153035 times by 1 test: buf[i] = xlate[to_uchar (buf[i])];
Executed by:
  • tr
1153035
1666-
1667 return bytes_read;
executed 8593 times by 1 test: return bytes_read;
Executed by:
  • tr
8593
1668}-
1669-
1670/* Initialize a boolean membership set, IN_SET, with the character-
1671 values obtained by traversing the linked list of constructs S-
1672 using the function 'get_next'. IN_SET is expected to have been-
1673 initialized to all zeros by the caller. If COMPLEMENT_THIS_SET-
1674 is true the resulting set is complemented. */-
1675-
1676static void-
1677set_initialize (struct Spec_list *s, bool complement_this_set, bool *in_set)-
1678{-
1679 int c;-
1680-
1681 s->state = BEGIN_STATE;-
1682 while ((c = get_next (s, NULL)) != -1)
(c = get_next ... *)0) )) != -1Description
TRUEevaluated 266229 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 183 times by 1 test
Evaluated by:
  • tr
183-266229
1683 in_set[c] = true;
executed 266229 times by 1 test: in_set[c] = 1 ;
Executed by:
  • tr
266229
1684 if (complement_this_set)
complement_this_setDescription
TRUEevaluated 8 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 175 times by 1 test
Evaluated by:
  • tr
8-175
1685 for (size_t i = 0; i < N_CHARS; i++)
i < N_CHARSDescription
TRUEevaluated 2048 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 8 times by 1 test
Evaluated by:
  • tr
8-2048
1686 in_set[i] = (!in_set[i]);
executed 2048 times by 1 test: in_set[i] = (!in_set[i]);
Executed by:
  • tr
2048
1687}
executed 183 times by 1 test: end of block
Executed by:
  • tr
183
1688-
1689int-
1690main (int argc, char **argv)-
1691{-
1692 int c;-
1693 int non_option_args;-
1694 int min_operands;-
1695 int max_operands;-
1696 struct Spec_list buf1, buf2;-
1697 struct Spec_list *s1 = &buf1;-
1698 struct Spec_list *s2 = &buf2;-
1699-
1700 initialize_main (&argc, &argv);-
1701 set_program_name (argv[0]);-
1702 setlocale (LC_ALL, "");-
1703 bindtextdomain (PACKAGE, LOCALEDIR);-
1704 textdomain (PACKAGE);-
1705-
1706 atexit (close_stdout);-
1707-
1708 while ((c = getopt_long (argc, argv, "+AcCdst", long_options, NULL)) != -1)
(c = getopt_lo... *)0) )) != -1Description
TRUEevaluated 230 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 4349 times by 1 test
Evaluated by:
  • tr
230-4349
1709 {-
1710 switch (c)-
1711 {-
1712 case 'A':
never executed: case 'A':
0
1713 /* Undocumented option, for compatibility with AIX. */-
1714 setlocale (LC_COLLATE, "C");-
1715 setlocale (LC_CTYPE, "C");-
1716 break;
never executed: break;
0
1717-
1718 case 'c':
executed 27 times by 1 test: case 'c':
Executed by:
  • tr
27
1719 case 'C':
executed 3 times by 1 test: case 'C':
Executed by:
  • tr
3
1720 complement = true;-
1721 break;
executed 30 times by 1 test: break;
Executed by:
  • tr
30
1722-
1723 case 'd':
executed 127 times by 1 test: case 'd':
Executed by:
  • tr
127
1724 delete = true;-
1725 break;
executed 127 times by 1 test: break;
Executed by:
  • tr
127
1726-
1727 case 's':
executed 49 times by 1 test: case 's':
Executed by:
  • tr
49
1728 squeeze_repeats = true;-
1729 break;
executed 49 times by 1 test: break;
Executed by:
  • tr
49
1730-
1731 case 't':
executed 4 times by 1 test: case 't':
Executed by:
  • tr
4
1732 truncate_set1 = true;-
1733 break;
executed 4 times by 1 test: break;
Executed by:
  • tr
4
1734-
1735 case_GETOPT_HELP_CHAR;
never executed: break;
executed 12 times by 1 test: case GETOPT_HELP_CHAR:
Executed by:
  • tr
0-12
1736-
1737 case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
executed 5 times by 1 test: exit ( 0 );
Executed by:
  • tr
never executed: break;
executed 5 times by 1 test: case GETOPT_VERSION_CHAR:
Executed by:
  • tr
0-5
1738-
1739 default:
executed 3 times by 1 test: default:
Executed by:
  • tr
3
1740 usage (EXIT_FAILURE);-
1741 break;
never executed: break;
0
1742 }-
1743 }-
1744-
1745 non_option_args = argc - optind;-
1746 translating = (non_option_args == 2 && !delete);
non_option_args == 2Description
TRUEevaluated 4230 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 119 times by 1 test
Evaluated by:
  • tr
!deleteDescription
TRUEevaluated 4214 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 16 times by 1 test
Evaluated by:
  • tr
16-4230
1747 min_operands = 1 + (delete == squeeze_repeats);-
1748 max_operands = 1 + (delete <= squeeze_repeats);-
1749-
1750 if (non_option_args < min_operands)
non_option_args < min_operandsDescription
TRUEnever evaluated
FALSEevaluated 4349 times by 1 test
Evaluated by:
  • tr
0-4349
1751 {-
1752 if (non_option_args == 0)
non_option_args == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1753 error (0, 0, _("missing operand"));
never executed: error (0, 0, dcgettext (((void *)0), "missing operand" , 5) );
0
1754 else-
1755 {-
1756 error (0, 0, _("missing operand after %s"), quote (argv[argc - 1]));-
1757 fprintf (stderr, "%s\n",-
1758 _(squeeze_repeats-
1759 ? N_("Two strings must be given when "-
1760 "both deleting and squeezing repeats.")-
1761 : N_("Two strings must be given when translating.")));-
1762 }
never executed: end of block
0
1763 usage (EXIT_FAILURE);-
1764 }
never executed: end of block
0
1765-
1766 if (max_operands < non_option_args)
max_operands < non_option_argsDescription
TRUEnever evaluated
FALSEevaluated 4349 times by 1 test
Evaluated by:
  • tr
0-4349
1767 {-
1768 error (0, 0, _("extra operand %s"), quote (argv[optind + max_operands]));-
1769 if (non_option_args == 2)
non_option_args == 2Description
TRUEnever evaluated
FALSEnever evaluated
0
1770 fprintf (stderr, "%s\n",
never executed: fprintf ( stderr , "%s\n", dcgettext (((void *)0), "Only one string may be given when " "deleting without squeezing repeats." , 5) );
0
1771 _("Only one string may be given when "
never executed: fprintf ( stderr , "%s\n", dcgettext (((void *)0), "Only one string may be given when " "deleting without squeezing repeats." , 5) );
0
1772 "deleting without squeezing repeats."));
never executed: fprintf ( stderr , "%s\n", dcgettext (((void *)0), "Only one string may be given when " "deleting without squeezing repeats." , 5) );
0
1773 usage (EXIT_FAILURE);-
1774 }
never executed: end of block
0
1775-
1776 spec_init (s1);-
1777 if (!parse_str (argv[optind], s1))
!parse_str (argv[optind], s1)Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 4343 times by 1 test
Evaluated by:
  • tr
6-4343
1778 return EXIT_FAILURE;
executed 6 times by 1 test: return 1 ;
Executed by:
  • tr
6
1779-
1780 if (non_option_args == 2)
non_option_args == 2Description
TRUEevaluated 4224 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 119 times by 1 test
Evaluated by:
  • tr
119-4224
1781 {-
1782 spec_init (s2);-
1783 if (!parse_str (argv[optind + 1], s2))
!parse_str (ar...tind + 1], s2)Description
TRUEnever evaluated
FALSEevaluated 4224 times by 1 test
Evaluated by:
  • tr
0-4224
1784 return EXIT_FAILURE;
never executed: return 1 ;
0
1785 }
executed 4224 times by 1 test: end of block
Executed by:
  • tr
4224
1786 else-
1787 s2 = NULL;
executed 119 times by 1 test: s2 = ((void *)0) ;
Executed by:
  • tr
119
1788-
1789 validate (s1, s2);-
1790-
1791 /* Use binary I/O, since 'tr' is sometimes used to transliterate-
1792 non-printable characters, or characters which are stripped away-
1793 by text-mode reads (like CR and ^Z). */-
1794 xset_binary_mode (STDIN_FILENO, O_BINARY);-
1795 xset_binary_mode (STDOUT_FILENO, O_BINARY);-
1796 fadvise (stdin, FADVISE_SEQUENTIAL);-
1797-
1798 if (squeeze_repeats && non_option_args == 1)
squeeze_repeatsDescription
TRUEevaluated 43 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 4288 times by 1 test
Evaluated by:
  • tr
non_option_args == 1Description
TRUEevaluated 10 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 33 times by 1 test
Evaluated by:
  • tr
10-4288
1799 {-
1800 set_initialize (s1, complement, in_squeeze_set);-
1801 squeeze_filter (io_buf, sizeof io_buf, plain_read);-
1802 }
executed 10 times by 1 test: end of block
Executed by:
  • tr
10
1803 else if (delete && non_option_args == 1)
deleteDescription
TRUEevaluated 125 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 4196 times by 1 test
Evaluated by:
  • tr
non_option_args == 1Description
TRUEevaluated 109 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 16 times by 1 test
Evaluated by:
  • tr
16-4196
1804 {-
1805 set_initialize (s1, complement, in_delete_set);-
1806-
1807 while (true)-
1808 {-
1809 size_t nr = read_and_delete (io_buf, sizeof io_buf);-
1810 if (nr == 0)
nr == 0Description
TRUEevaluated 109 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 151 times by 1 test
Evaluated by:
  • tr
109-151
1811 break;
executed 109 times by 1 test: break;
Executed by:
  • tr
109
1812 if (fwrite (io_buf, 1, nr, stdout) != nr)
never executed: break;
(__extension__...dout)))) != nrDescription
TRUEnever evaluated
FALSEevaluated 151 times by 1 test
Evaluated by:
  • tr
(__builtin_exp...r++))) == (-1)Description
TRUEnever evaluated
FALSEnever evaluated
__cnt > 0Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_expe...write_end), 0)Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( 1 )Description
TRUEevaluated 151 times by 1 test
Evaluated by:
  • tr
FALSEnever evaluated
__builtin_constant_p ( nr )Description
TRUEnever evaluated
FALSEevaluated 151 times by 1 test
Evaluated by:
  • tr
(size_t) ( 1 )...t) ( nr ) <= 8Description
TRUEnever evaluated
FALSEnever evaluated
(size_t) ( 1 ) != 0Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( 1 )Description
TRUEevaluated 151 times by 1 test
Evaluated by:
  • tr
FALSEnever evaluated
(size_t) ( 1 ) == 0Description
TRUEnever evaluated
FALSEevaluated 151 times by 1 test
Evaluated by:
  • tr
__builtin_constant_p ( nr )Description
TRUEnever evaluated
FALSEevaluated 151 times by 1 test
Evaluated by:
  • tr
(size_t) ( nr ) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-151
1813 die (EXIT_FAILURE, errno, _("write error"));
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, (*__errno_location ()), dcgettext (((void *)0), \"write error\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "write error" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "write error" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))));
0
1814 }
executed 151 times by 1 test: end of block
Executed by:
  • tr
151
1815 }
executed 109 times by 1 test: end of block
Executed by:
  • tr
109
1816 else if (squeeze_repeats && delete && non_option_args == 2)
squeeze_repeatsDescription
TRUEevaluated 33 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 4179 times by 1 test
Evaluated by:
  • tr
deleteDescription
TRUEevaluated 16 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 17 times by 1 test
Evaluated by:
  • tr
non_option_args == 2Description
TRUEevaluated 16 times by 1 test
Evaluated by:
  • tr
FALSEnever evaluated
0-4179
1817 {-
1818 set_initialize (s1, complement, in_delete_set);-
1819 set_initialize (s2, false, in_squeeze_set);-
1820 squeeze_filter (io_buf, sizeof io_buf, read_and_delete);-
1821 }
executed 16 times by 1 test: end of block
Executed by:
  • tr
16
1822 else if (translating)
translatingDescription
TRUEevaluated 4196 times by 1 test
Evaluated by:
  • tr
FALSEnever evaluated
0-4196
1823 {-
1824 if (complement)
complementDescription
TRUEevaluated 15 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 4181 times by 1 test
Evaluated by:
  • tr
15-4181
1825 {-
1826 bool *in_s1 = in_delete_set;-
1827-
1828 set_initialize (s1, false, in_s1);-
1829 s2->state = BEGIN_STATE;-
1830 for (int i = 0; i < N_CHARS; i++)
i < N_CHARSDescription
TRUEevaluated 3840 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 15 times by 1 test
Evaluated by:
  • tr
15-3840
1831 xlate[i] = i;
executed 3840 times by 1 test: xlate[i] = i;
Executed by:
  • tr
3840
1832 for (int i = 0; i < N_CHARS; i++)
i < N_CHARSDescription
TRUEevaluated 3840 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 15 times by 1 test
Evaluated by:
  • tr
15-3840
1833 {-
1834 if (!in_s1[i])
!in_s1[i]Description
TRUEevaluated 3457 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 383 times by 1 test
Evaluated by:
  • tr
383-3457
1835 {-
1836 int ch = get_next (s2, NULL);-
1837 assert (ch != -1 || truncate_set1);-
1838 if (ch == -1)
ch == -1Description
TRUEnever evaluated
FALSEevaluated 3457 times by 1 test
Evaluated by:
  • tr
0-3457
1839 {-
1840 /* This will happen when tr is invoked like e.g.-
1841 tr -cs A-Za-z0-9 '\012'. */-
1842 break;
never executed: break;
0
1843 }-
1844 xlate[i] = ch;-
1845 }
executed 3457 times by 1 test: end of block
Executed by:
  • tr
3457
1846 }
executed 3840 times by 1 test: end of block
Executed by:
  • tr
3840
1847 }
executed 15 times by 1 test: end of block
Executed by:
  • tr
15
1848 else-
1849 {-
1850 int c1, c2;-
1851 enum Upper_Lower_class class_s1;-
1852 enum Upper_Lower_class class_s2;-
1853-
1854 for (int i = 0; i < N_CHARS; i++)
i < N_CHARSDescription
TRUEevaluated 1070336 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 4181 times by 1 test
Evaluated by:
  • tr
4181-1070336
1855 xlate[i] = i;
executed 1070336 times by 1 test: xlate[i] = i;
Executed by:
  • tr
1070336
1856 s1->state = BEGIN_STATE;-
1857 s2->state = BEGIN_STATE;-
1858 while (true)-
1859 {-
1860 c1 = get_next (s1, &class_s1);-
1861 c2 = get_next (s2, &class_s2);-
1862-
1863 if (class_s1 == UL_LOWER && class_s2 == UL_UPPER)
class_s1 == UL_LOWERDescription
TRUEevaluated 109 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 14416 times by 1 test
Evaluated by:
  • tr
class_s2 == UL_UPPERDescription
TRUEevaluated 5 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 104 times by 1 test
Evaluated by:
  • tr
5-14416
1864 {-
1865 for (int i = 0; i < N_CHARS; i++)
i < N_CHARSDescription
TRUEevaluated 1280 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 5 times by 1 test
Evaluated by:
  • tr
5-1280
1866 if (islower (i))
((*__ctype_b_l...int) _ISlower)Description
TRUEevaluated 130 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 1150 times by 1 test
Evaluated by:
  • tr
130-1150
1867 xlate[i] = toupper (i);
executed 130 times by 1 test: xlate[i] = (__extension__ ({ int __res; if (sizeof ( i ) > 1) { if (__builtin_constant_p ( i )) { int __c = ( i ); __res = __c < -128 || __c > 255 ? __c : (*__ctype_toupper_loc ())[__c]; } else __res = toupper ( i ); } else __res = (*__ctype_toupper_loc ())[(int) ( i )]; __res; })) ;
Executed by:
  • tr
never executed: end of block
executed 130 times by 1 test: __res = toupper ( i );
Executed by:
  • tr
never executed: __res = (*__ctype_toupper_loc ())[(int) ( i )];
sizeof ( i ) > 1Description
TRUEevaluated 130 times by 1 test
Evaluated by:
  • tr
FALSEnever evaluated
__builtin_constant_p ( i )Description
TRUEnever evaluated
FALSEevaluated 130 times by 1 test
Evaluated by:
  • tr
__c < -128Description
TRUEnever evaluated
FALSEnever evaluated
__c > 255Description
TRUEnever evaluated
FALSEnever evaluated
0-130
1868 }
executed 5 times by 1 test: end of block
Executed by:
  • tr
5
1869 else if (class_s1 == UL_UPPER && class_s2 == UL_LOWER)
class_s1 == UL_UPPERDescription
TRUEevaluated 55 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 14465 times by 1 test
Evaluated by:
  • tr
class_s2 == UL_LOWERDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 53 times by 1 test
Evaluated by:
  • tr
2-14465
1870 {-
1871 for (int i = 0; i < N_CHARS; i++)
i < N_CHARSDescription
TRUEevaluated 512 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 2 times by 1 test
Evaluated by:
  • tr
2-512
1872 if (isupper (i))
((*__ctype_b_l...int) _ISupper)Description
TRUEevaluated 52 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 460 times by 1 test
Evaluated by:
  • tr
52-460
1873 xlate[i] = tolower (i);
executed 52 times by 1 test: xlate[i] = (__extension__ ({ int __res; if (sizeof ( i ) > 1) { if (__builtin_constant_p ( i )) { int __c = ( i ); __res = __c < -128 || __c > 255 ? __c : (*__ctype_tolower_loc ())[__c]; } else __res = tolower ( i ); } else __res = (*__ctype_tolower_loc ())[(int) ( i )]; __res; })) ;
Executed by:
  • tr
never executed: end of block
executed 52 times by 1 test: __res = tolower ( i );
Executed by:
  • tr
never executed: __res = (*__ctype_tolower_loc ())[(int) ( i )];
sizeof ( i ) > 1Description
TRUEevaluated 52 times by 1 test
Evaluated by:
  • tr
FALSEnever evaluated
__builtin_constant_p ( i )Description
TRUEnever evaluated
FALSEevaluated 52 times by 1 test
Evaluated by:
  • tr
__c < -128Description
TRUEnever evaluated
FALSEnever evaluated
__c > 255Description
TRUEnever evaluated
FALSEnever evaluated
0-52
1874 }
executed 2 times by 1 test: end of block
Executed by:
  • tr
2
1875 else-
1876 {-
1877 /* The following should have been checked by validate... */-
1878 if (c1 == -1 || c2 == -1)
c1 == -1Description
TRUEevaluated 4179 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 10339 times by 1 test
Evaluated by:
  • tr
c2 == -1Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 10337 times by 1 test
Evaluated by:
  • tr
2-10339
1879 break;
executed 4181 times by 1 test: break;
Executed by:
  • tr
4181
1880 xlate[c1] = c2;-
1881 }
executed 10337 times by 1 test: end of block
Executed by:
  • tr
10337
1882-
1883 /* When case-converting, skip the elements as an optimization. */-
1884 if (class_s2 != UL_NONE)
class_s2 != UL_NONEDescription
TRUEevaluated 8 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 10336 times by 1 test
Evaluated by:
  • tr
8-10336
1885 {-
1886 skip_construct (s1);-
1887 skip_construct (s2);-
1888 }
executed 8 times by 1 test: end of block
Executed by:
  • tr
8
1889 }
executed 10344 times by 1 test: end of block
Executed by:
  • tr
10344
1890 assert (c1 == -1 || truncate_set1);-
1891 }
executed 4181 times by 1 test: end of block
Executed by:
  • tr
4181
1892 if (squeeze_repeats)
squeeze_repeatsDescription
TRUEevaluated 17 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 4179 times by 1 test
Evaluated by:
  • tr
17-4179
1893 {-
1894 set_initialize (s2, false, in_squeeze_set);-
1895 squeeze_filter (io_buf, sizeof io_buf, read_and_xlate);-
1896 }
executed 17 times by 1 test: end of block
Executed by:
  • tr
17
1897 else-
1898 {-
1899 while (true)-
1900 {-
1901 size_t bytes_read = read_and_xlate (io_buf, sizeof io_buf);-
1902 if (bytes_read == 0)
bytes_read == 0Description
TRUEevaluated 4179 times by 1 test
Evaluated by:
  • tr
FALSEevaluated 4382 times by 1 test
Evaluated by:
  • tr
4179-4382
1903 break;
executed 4179 times by 1 test: break;
Executed by:
  • tr
4179
1904 if (fwrite (io_buf, 1, bytes_read, stdout) != bytes_read)
never executed: break;
(__extension__... != bytes_readDescription
TRUEnever evaluated
FALSEevaluated 4382 times by 1 test
Evaluated by:
  • tr
(__builtin_exp...r++))) == (-1)Description
TRUEnever evaluated
FALSEnever evaluated
__cnt > 0Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_expe...write_end), 0)Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( 1 )Description
TRUEevaluated 4382 times by 1 test
Evaluated by:
  • tr
FALSEnever evaluated
__builtin_cons...( bytes_read )Description
TRUEnever evaluated
FALSEevaluated 4382 times by 1 test
Evaluated by:
  • tr
(size_t) ( 1 )...es_read ) <= 8Description
TRUEnever evaluated
FALSEnever evaluated
(size_t) ( 1 ) != 0Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( 1 )Description
TRUEevaluated 4382 times by 1 test
Evaluated by:
  • tr
FALSEnever evaluated
(size_t) ( 1 ) == 0Description
TRUEnever evaluated
FALSEevaluated 4382 times by 1 test
Evaluated by:
  • tr
__builtin_cons...( bytes_read )Description
TRUEnever evaluated
FALSEevaluated 4382 times by 1 test
Evaluated by:
  • tr
(size_t) ( bytes_read ) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-4382
1905 die (EXIT_FAILURE, errno, _("write error"));
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, (*__errno_location ()), dcgettext (((void *)0), \"write error\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "write error" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "write error" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))));
0
1906 }
executed 4382 times by 1 test: end of block
Executed by:
  • tr
4382
1907 }
executed 4179 times by 1 test: end of block
Executed by:
  • tr
4179
1908 }-
1909-
1910 if (close (STDIN_FILENO) != 0)
close ( 0 ) != 0Description
TRUEnever evaluated
FALSEevaluated 4331 times by 1 test
Evaluated by:
  • tr
0-4331
1911 die (EXIT_FAILURE, errno, _("standard input"));
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, (*__errno_location ()), dcgettext (((void *)0), \"standard input\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "standard input" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "standard input" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))));
0
1912-
1913 return EXIT_SUCCESS;
executed 4331 times by 1 test: return 0 ;
Executed by:
  • tr
4331
1914}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2