Skip to content

Commit f5cff56

Browse files
author
Victor Stinner
committed
Issue #13088: Add shared Py_hexdigits constant to format a number into base 16
1 parent e506437 commit f5cff56

File tree

16 files changed

+118
-135
lines changed

16 files changed

+118
-135
lines changed

Include/codecs.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,8 @@ PyAPI_FUNC(PyObject *) PyCodec_XMLCharRefReplaceErrors(PyObject *exc);
174174
/* replace the unicode encode error with backslash escapes (\x, \u and \U) */
175175
PyAPI_FUNC(PyObject *) PyCodec_BackslashReplaceErrors(PyObject *exc);
176176

177+
extern const char *Py_hexdigits;
178+
177179
#ifdef __cplusplus
178180
}
179181
#endif

Modules/_codecsmodule.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,6 @@ static PyObject *
162162
escape_encode(PyObject *self,
163163
PyObject *args)
164164
{
165-
static const char *hexdigits = "0123456789abcdef";
166165
PyObject *str;
167166
Py_ssize_t size;
168167
Py_ssize_t newsize;
@@ -205,8 +204,8 @@ escape_encode(PyObject *self,
205204
else if (c < ' ' || c >= 0x7f) {
206205
*p++ = '\\';
207206
*p++ = 'x';
208-
*p++ = hexdigits[(c & 0xf0) >> 4];
209-
*p++ = hexdigits[c & 0xf];
207+
*p++ = Py_hexdigits[(c & 0xf0) >> 4];
208+
*p++ = Py_hexdigits[c & 0xf];
210209
}
211210
else
212211
*p++ = c;

Modules/_hashopenssl.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -201,13 +201,11 @@ EVP_hexdigest(EVPobject *self, PyObject *unused)
201201

202202
/* Make hex version of the digest */
203203
for(i=j=0; i<digest_size; i++) {
204-
char c;
204+
unsigned char c;
205205
c = (digest[i] >> 4) & 0xf;
206-
c = (c>9) ? c+'a'-10 : c + '0';
207-
hex_digest[j++] = c;
206+
hex_digest[j++] = Py_hexdigits[c];
208207
c = (digest[i] & 0xf);
209-
c = (c>9) ? c+'a'-10 : c + '0';
210-
hex_digest[j++] = c;
208+
hex_digest[j++] = Py_hexdigits[c];
211209
}
212210
retval = PyUnicode_FromStringAndSize(hex_digest, digest_size * 2);
213211
PyMem_Free(hex_digest);

Modules/_json.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -175,18 +175,18 @@ ascii_escape_unichar(Py_UCS4 c, unsigned char *output, Py_ssize_t chars)
175175
Py_UCS4 v = c - 0x10000;
176176
c = 0xd800 | ((v >> 10) & 0x3ff);
177177
output[chars++] = 'u';
178-
output[chars++] = "0123456789abcdef"[(c >> 12) & 0xf];
179-
output[chars++] = "0123456789abcdef"[(c >> 8) & 0xf];
180-
output[chars++] = "0123456789abcdef"[(c >> 4) & 0xf];
181-
output[chars++] = "0123456789abcdef"[(c ) & 0xf];
178+
output[chars++] = Py_hexdigits[(c >> 12) & 0xf];
179+
output[chars++] = Py_hexdigits[(c >> 8) & 0xf];
180+
output[chars++] = Py_hexdigits[(c >> 4) & 0xf];
181+
output[chars++] = Py_hexdigits[(c ) & 0xf];
182182
c = 0xdc00 | (v & 0x3ff);
183183
output[chars++] = '\\';
184184
}
185185
output[chars++] = 'u';
186-
output[chars++] = "0123456789abcdef"[(c >> 12) & 0xf];
187-
output[chars++] = "0123456789abcdef"[(c >> 8) & 0xf];
188-
output[chars++] = "0123456789abcdef"[(c >> 4) & 0xf];
189-
output[chars++] = "0123456789abcdef"[(c ) & 0xf];
186+
output[chars++] = Py_hexdigits[(c >> 12) & 0xf];
187+
output[chars++] = Py_hexdigits[(c >> 8) & 0xf];
188+
output[chars++] = Py_hexdigits[(c >> 4) & 0xf];
189+
output[chars++] = Py_hexdigits[(c ) & 0xf];
190190
}
191191
return chars;
192192
}

Modules/_pickle.c

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1776,7 +1776,6 @@ save_bytes(PicklerObject *self, PyObject *obj)
17761776
static PyObject *
17771777
raw_unicode_escape(PyObject *obj)
17781778
{
1779-
static const char *hexdigits = "0123456789abcdef";
17801779
PyObject *repr, *result;
17811780
char *p;
17821781
Py_ssize_t i, size, expandsize;
@@ -1809,23 +1808,23 @@ raw_unicode_escape(PyObject *obj)
18091808
if (ch >= 0x10000) {
18101809
*p++ = '\\';
18111810
*p++ = 'U';
1812-
*p++ = hexdigits[(ch >> 28) & 0xf];
1813-
*p++ = hexdigits[(ch >> 24) & 0xf];
1814-
*p++ = hexdigits[(ch >> 20) & 0xf];
1815-
*p++ = hexdigits[(ch >> 16) & 0xf];
1816-
*p++ = hexdigits[(ch >> 12) & 0xf];
1817-
*p++ = hexdigits[(ch >> 8) & 0xf];
1818-
*p++ = hexdigits[(ch >> 4) & 0xf];
1819-
*p++ = hexdigits[ch & 15];
1811+
*p++ = Py_hexdigits[(ch >> 28) & 0xf];
1812+
*p++ = Py_hexdigits[(ch >> 24) & 0xf];
1813+
*p++ = Py_hexdigits[(ch >> 20) & 0xf];
1814+
*p++ = Py_hexdigits[(ch >> 16) & 0xf];
1815+
*p++ = Py_hexdigits[(ch >> 12) & 0xf];
1816+
*p++ = Py_hexdigits[(ch >> 8) & 0xf];
1817+
*p++ = Py_hexdigits[(ch >> 4) & 0xf];
1818+
*p++ = Py_hexdigits[ch & 15];
18201819
}
18211820
/* Map 16-bit characters to '\uxxxx' */
18221821
else if (ch >= 256 || ch == '\\' || ch == '\n') {
18231822
*p++ = '\\';
18241823
*p++ = 'u';
1825-
*p++ = hexdigits[(ch >> 12) & 0xf];
1826-
*p++ = hexdigits[(ch >> 8) & 0xf];
1827-
*p++ = hexdigits[(ch >> 4) & 0xf];
1828-
*p++ = hexdigits[ch & 15];
1824+
*p++ = Py_hexdigits[(ch >> 12) & 0xf];
1825+
*p++ = Py_hexdigits[(ch >> 8) & 0xf];
1826+
*p++ = Py_hexdigits[(ch >> 4) & 0xf];
1827+
*p++ = Py_hexdigits[ch & 15];
18291828
}
18301829
/* Copy everything else as-is */
18311830
else

Modules/binascii.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1078,13 +1078,11 @@ binascii_hexlify(PyObject *self, PyObject *args)
10781078

10791079
/* make hex version of string, taken from shamodule.c */
10801080
for (i=j=0; i < arglen; i++) {
1081-
char c;
1081+
unsigned char c;
10821082
c = (argbuf[i] >> 4) & 0xf;
1083-
c = (c>9) ? c+'a'-10 : c + '0';
1084-
retbuf[j++] = c;
1083+
retbuf[j++] = Py_hexdigits[c];
10851084
c = argbuf[i] & 0xf;
1086-
c = (c>9) ? c+'a'-10 : c + '0';
1087-
retbuf[j++] = c;
1085+
retbuf[j++] = Py_hexdigits[c];
10881086
}
10891087
PyBuffer_Release(&parg);
10901088
return retval;

Modules/md5module.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -391,13 +391,11 @@ MD5_hexdigest(MD5object *self, PyObject *unused)
391391

392392
/* Make hex version of the digest */
393393
for(i=j=0; i<MD5_DIGESTSIZE; i++) {
394-
char c;
394+
unsigned char c;
395395
c = (digest[i] >> 4) & 0xf;
396-
c = (c>9) ? c+'a'-10 : c + '0';
397-
hex_digest[j++] = c;
396+
hex_digest[j++] = Py_hexdigits[c];
398397
c = (digest[i] & 0xf);
399-
c = (c>9) ? c+'a'-10 : c + '0';
400-
hex_digest[j++] = c;
398+
hex_digest[j++] = Py_hexdigits[c];
401399
}
402400
return retval;
403401
}

Modules/sha1module.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -367,13 +367,11 @@ SHA1_hexdigest(SHA1object *self, PyObject *unused)
367367

368368
/* Make hex version of the digest */
369369
for(i=j=0; i<SHA1_DIGESTSIZE; i++) {
370-
char c;
370+
unsigned char c;
371371
c = (digest[i] >> 4) & 0xf;
372-
c = (c>9) ? c+'a'-10 : c + '0';
373-
hex_digest[j++] = c;
372+
hex_digest[j++] = Py_hexdigits[c];
374373
c = (digest[i] & 0xf);
375-
c = (c>9) ? c+'a'-10 : c + '0';
376-
hex_digest[j++] = c;
374+
hex_digest[j++] = Py_hexdigits[c];
377375
}
378376
return retval;
379377
}

Modules/sha256module.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -460,13 +460,11 @@ SHA256_hexdigest(SHAobject *self, PyObject *unused)
460460

461461
/* Make hex version of the digest */
462462
for(i=j=0; i<self->digestsize; i++) {
463-
char c;
463+
unsigned char c;
464464
c = (digest[i] >> 4) & 0xf;
465-
c = (c>9) ? c+'a'-10 : c + '0';
466-
hex_digest[j++] = c;
465+
hex_digest[j++] = Py_hexdigits[c];
467466
c = (digest[i] & 0xf);
468-
c = (c>9) ? c+'a'-10 : c + '0';
469-
hex_digest[j++] = c;
467+
hex_digest[j++] = Py_hexdigits[c];
470468
}
471469
return retval;
472470
}

Modules/sha512module.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -526,13 +526,11 @@ SHA512_hexdigest(SHAobject *self, PyObject *unused)
526526

527527
/* Make hex version of the digest */
528528
for (i=j=0; i<self->digestsize; i++) {
529-
char c;
529+
unsigned char c;
530530
c = (digest[i] >> 4) & 0xf;
531-
c = (c>9) ? c+'a'-10 : c + '0';
532-
hex_digest[j++] = c;
531+
hex_digest[j++] = Py_hexdigits[c];
533532
c = (digest[i] & 0xf);
534-
c = (c>9) ? c+'a'-10 : c + '0';
535-
hex_digest[j++] = c;
533+
hex_digest[j++] = Py_hexdigits[c];
536534
}
537535
return retval;
538536
}

0 commit comments

Comments
 (0)