OpenCoverage

fmtulong.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/bash/src/lib/sh/fmtulong.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* fmtulong.c -- Convert unsigned long int to string. */-
2-
3/* Copyright (C) 1998-2011 Free Software Foundation, Inc.-
4-
5 This file is part of GNU Bash, the Bourne Again SHell.-
6-
7 Bash is free software: you can redistribute it and/or modify-
8 it under the terms of the GNU General Public License as published by-
9 the Free Software Foundation, either version 3 of the License, or-
10 (at your option) any later version.-
11-
12 Bash is distributed in the hope that it will be useful,-
13 but WITHOUT ANY WARRANTY; without even the implied warranty of-
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the-
15 GNU General Public License for more details.-
16-
17 You should have received a copy of the GNU General Public License-
18 along with Bash. If not, see <http://www.gnu.org/licenses/>.-
19*/-
20-
21#ifdef HAVE_CONFIG_H-
22# include <config.h>-
23#endif-
24-
25#if defined (HAVE_UNISTD_H)-
26# include <unistd.h>-
27#endif-
28-
29#if defined (HAVE_LIMITS_H)-
30# include <limits.h>-
31#endif-
32-
33#include <bashansi.h>-
34#ifdef HAVE_STDDEF_H-
35# include <stddef.h>-
36#endif-
37-
38#ifdef HAVE_STDINT_H-
39# include <stdint.h>-
40#endif-
41#ifdef HAVE_INTTYPES_H-
42# include <inttypes.h>-
43#endif-
44#include <chartypes.h>-
45#include <errno.h>-
46-
47#include <bashintl.h>-
48-
49#include "stdc.h"-
50-
51#include <typemax.h>-
52-
53#ifndef errno-
54extern int errno;-
55#endif-
56-
57#define x_digs "0123456789abcdef"-
58#define X_digs "0123456789ABCDEF"-
59-
60/* XXX -- assumes uppercase letters, lowercase letters, and digits are-
61 contiguous */-
62#define FMTCHAR(x) \-
63 ((x) < 10) ? (x) + '0' \-
64 : (((x) < 36) ? (x) - 10 + 'a' \-
65 : (((x) < 62) ? (x) - 36 + 'A' \-
66 : (((x) == 62) ? '@' : '_')))-
67-
68#ifndef FL_PREFIX-
69# define FL_PREFIX 0x01 /* add 0x, 0X, or 0 prefix as appropriate */-
70# define FL_ADDBASE 0x02 /* add base# prefix to converted value */-
71# define FL_HEXUPPER 0x04 /* use uppercase when converting to hex */-
72# define FL_UNSIGNED 0x08 /* don't add any sign */-
73#endif-
74-
75#ifndef LONG-
76# define LONG long-
77# define UNSIGNED_LONG unsigned long-
78#endif-
79-
80/* `unsigned long' (or unsigned long long) to string conversion for a given-
81 base. The caller passes the output buffer and the size. This should-
82 check for buffer underflow, but currently does not. */-
83char *-
84fmtulong (ui, base, buf, len, flags)-
85 UNSIGNED_LONG ui;-
86 int base;-
87 char *buf;-
88 size_t len;-
89 int flags;-
90{-
91 char *p;-
92 int sign;-
93 LONG si;-
94-
95 if (base == 0)
base == 0Description
TRUEnever evaluated
FALSEevaluated 95950340 times by 1 test
Evaluated by:
  • Self test
0-95950340
96 base = 10;
never executed: base = 10;
0
97-
98 if (base < 2 || base > 64)
base < 2Description
TRUEnever evaluated
FALSEevaluated 95950340 times by 1 test
Evaluated by:
  • Self test
base > 64Description
TRUEnever evaluated
FALSEevaluated 95950340 times by 1 test
Evaluated by:
  • Self test
0-95950340
99 {-
100#if 1-
101 /* XXX - truncation possible with long translation */-
102 strncpy (buf, _("invalid base"), len - 1);-
103 buf[len-1] = '\0';-
104 errno = EINVAL;-
105 return (p = buf);
never executed: return (p = buf);
0
106#else-
107 base = 10;-
108#endif-
109 }-
110-
111 sign = 0;-
112 if ((flags & FL_UNSIGNED) == 0 && (LONG)ui < 0)
(flags & 0x08) == 0Description
TRUEevaluated 95948465 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1875 times by 1 test
Evaluated by:
  • Self test
(long)ui < 0Description
TRUEevaluated 1267 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 95947198 times by 1 test
Evaluated by:
  • Self test
1267-95948465
113 {-
114 ui = -ui;-
115 sign = '-';-
116 }
executed 1267 times by 1 test: end of block
Executed by:
  • Self test
1267
117-
118 p = buf + len - 2;-
119 p[1] = '\0';-
120-
121 /* handle common cases explicitly */-
122 switch (base)-
123 {-
124 case 10:
executed 95948927 times by 1 test: case 10:
Executed by:
  • Self test
95948927
125 if (ui < 10)
ui < 10Description
TRUEevaluated 86453891 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 9495036 times by 1 test
Evaluated by:
  • Self test
9495036-86453891
126 {-
127 *p-- = TOCHAR (ui);-
128 break;
executed 86453891 times by 1 test: break;
Executed by:
  • Self test
86453891
129 }-
130 /* Favor signed arithmetic over unsigned arithmetic; it is faster on-
131 many machines. */-
132 if ((LONG)ui < 0)
(long)ui < 0Description
TRUEevaluated 12 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 9495024 times by 1 test
Evaluated by:
  • Self test
12-9495024
133 {-
134 *p-- = TOCHAR (ui % 10);-
135 si = ui / 10;-
136 }
executed 12 times by 1 test: end of block
Executed by:
  • Self test
12
137 else-
138 si = ui;
executed 9495024 times by 1 test: si = ui;
Executed by:
  • Self test
9495024
139 do-
140 *p-- = TOCHAR (si % 10);
executed 32688266 times by 1 test: *p-- = ((si % 10) + '0');
Executed by:
  • Self test
32688266
141 while (si /= 10);
si /= 10Description
TRUEevaluated 23193230 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 9495036 times by 1 test
Evaluated by:
  • Self test
9495036-23193230
142 break;
executed 9495036 times by 1 test: break;
Executed by:
  • Self test
9495036
143-
144 case 8:
executed 14 times by 1 test: case 8:
Executed by:
  • Self test
14
145 do-
146 *p-- = TOCHAR (ui & 7);
executed 38 times by 1 test: *p-- = ((ui & 7) + '0');
Executed by:
  • Self test
38
147 while (ui >>= 3);
ui >>= 3Description
TRUEevaluated 24 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 14 times by 1 test
Evaluated by:
  • Self test
14-24
148 break;
executed 14 times by 1 test: break;
Executed by:
  • Self test
14
149-
150 case 16:
executed 1399 times by 1 test: case 16:
Executed by:
  • Self test
1399
151 do-
152 *p-- = (flags & FL_HEXUPPER) ? X_digs[ui & 15] : x_digs[ui & 15];
executed 3498 times by 1 test: *p-- = (flags & 0x04) ? "0123456789ABCDEF"[ui & 15] : "0123456789abcdef"[ui & 15];
Executed by:
  • Self test
(flags & 0x04)Description
TRUEevaluated 20 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 3478 times by 1 test
Evaluated by:
  • Self test
20-3498
153 while (ui >>= 4);
ui >>= 4Description
TRUEevaluated 2099 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1399 times by 1 test
Evaluated by:
  • Self test
1399-2099
154 break;
executed 1399 times by 1 test: break;
Executed by:
  • Self test
1399
155-
156 case 2:
never executed: case 2:
0
157 do-
158 *p-- = TOCHAR (ui & 1);
never executed: *p-- = ((ui & 1) + '0');
0
159 while (ui >>= 1);
ui >>= 1Description
TRUEnever evaluated
FALSEnever evaluated
0
160 break;
never executed: break;
0
161-
162 default:
never executed: default:
0
163 do-
164 *p-- = FMTCHAR (ui % base);
never executed: *p-- = ((ui % base) < 10) ? (ui % base) + '0' : (((ui % base) < 36) ? (ui % base) - 10 + 'a' : (((ui % base) < 62) ? (ui % base) - 36 + 'A' : (((ui % base) == 62) ? '@' : '_')));
((ui % base) < 10)Description
TRUEnever evaluated
FALSEnever evaluated
((ui % base) < 36)Description
TRUEnever evaluated
FALSEnever evaluated
((ui % base) < 62)Description
TRUEnever evaluated
FALSEnever evaluated
((ui % base) == 62)Description
TRUEnever evaluated
FALSEnever evaluated
0
165 while (ui /= base);
ui /= baseDescription
TRUEnever evaluated
FALSEnever evaluated
0
166 break;
never executed: break;
0
167 }-
168-
169 if ((flags & FL_PREFIX) && (base == 8 || base == 16))
(flags & 0x01)Description
TRUEnever evaluated
FALSEevaluated 95950340 times by 1 test
Evaluated by:
  • Self test
base == 8Description
TRUEnever evaluated
FALSEnever evaluated
base == 16Description
TRUEnever evaluated
FALSEnever evaluated
0-95950340
170 {-
171 if (base == 16)
base == 16Description
TRUEnever evaluated
FALSEnever evaluated
0
172 {-
173 *p-- = (flags & FL_HEXUPPER) ? 'X' : 'x';
(flags & 0x04)Description
TRUEnever evaluated
FALSEnever evaluated
0
174 *p-- = '0';-
175 }
never executed: end of block
0
176 else if (p[1] != '0')
p[1] != '0'Description
TRUEnever evaluated
FALSEnever evaluated
0
177 *p-- = '0';
never executed: *p-- = '0';
0
178 }
never executed: end of block
0
179 else if ((flags & FL_ADDBASE) && base != 10)
(flags & 0x02)Description
TRUEnever evaluated
FALSEevaluated 95950340 times by 1 test
Evaluated by:
  • Self test
base != 10Description
TRUEnever evaluated
FALSEnever evaluated
0-95950340
180 {-
181 *p-- = '#';-
182 *p-- = TOCHAR (base % 10);-
183 if (base > 10)
base > 10Description
TRUEnever evaluated
FALSEnever evaluated
0
184 *p-- = TOCHAR (base / 10);
never executed: *p-- = ((base / 10) + '0');
0
185 }
never executed: end of block
0
186-
187 if (sign)
signDescription
TRUEevaluated 1267 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 95949073 times by 1 test
Evaluated by:
  • Self test
1267-95949073
188 *p-- = '-';
executed 1267 times by 1 test: *p-- = '-';
Executed by:
  • Self test
1267
189-
190 return (p + 1);
executed 95950340 times by 1 test: return (p + 1);
Executed by:
  • Self test
95950340
191}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2