Commit f5cff56a authored by Victor Stinner's avatar Victor Stinner

Issue #13088: Add shared Py_hexdigits constant to format a number into base 16

parent e506437b
...@@ -174,6 +174,8 @@ PyAPI_FUNC(PyObject *) PyCodec_XMLCharRefReplaceErrors(PyObject *exc); ...@@ -174,6 +174,8 @@ PyAPI_FUNC(PyObject *) PyCodec_XMLCharRefReplaceErrors(PyObject *exc);
/* replace the unicode encode error with backslash escapes (\x, \u and \U) */ /* replace the unicode encode error with backslash escapes (\x, \u and \U) */
PyAPI_FUNC(PyObject *) PyCodec_BackslashReplaceErrors(PyObject *exc); PyAPI_FUNC(PyObject *) PyCodec_BackslashReplaceErrors(PyObject *exc);
extern const char *Py_hexdigits;
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
......
...@@ -162,7 +162,6 @@ static PyObject * ...@@ -162,7 +162,6 @@ static PyObject *
escape_encode(PyObject *self, escape_encode(PyObject *self,
PyObject *args) PyObject *args)
{ {
static const char *hexdigits = "0123456789abcdef";
PyObject *str; PyObject *str;
Py_ssize_t size; Py_ssize_t size;
Py_ssize_t newsize; Py_ssize_t newsize;
...@@ -205,8 +204,8 @@ escape_encode(PyObject *self, ...@@ -205,8 +204,8 @@ escape_encode(PyObject *self,
else if (c < ' ' || c >= 0x7f) { else if (c < ' ' || c >= 0x7f) {
*p++ = '\\'; *p++ = '\\';
*p++ = 'x'; *p++ = 'x';
*p++ = hexdigits[(c & 0xf0) >> 4]; *p++ = Py_hexdigits[(c & 0xf0) >> 4];
*p++ = hexdigits[c & 0xf]; *p++ = Py_hexdigits[c & 0xf];
} }
else else
*p++ = c; *p++ = c;
......
...@@ -201,13 +201,11 @@ EVP_hexdigest(EVPobject *self, PyObject *unused) ...@@ -201,13 +201,11 @@ EVP_hexdigest(EVPobject *self, PyObject *unused)
/* Make hex version of the digest */ /* Make hex version of the digest */
for(i=j=0; i<digest_size; i++) { for(i=j=0; i<digest_size; i++) {
char c; unsigned char c;
c = (digest[i] >> 4) & 0xf; c = (digest[i] >> 4) & 0xf;
c = (c>9) ? c+'a'-10 : c + '0'; hex_digest[j++] = Py_hexdigits[c];
hex_digest[j++] = c;
c = (digest[i] & 0xf); c = (digest[i] & 0xf);
c = (c>9) ? c+'a'-10 : c + '0'; hex_digest[j++] = Py_hexdigits[c];
hex_digest[j++] = c;
} }
retval = PyUnicode_FromStringAndSize(hex_digest, digest_size * 2); retval = PyUnicode_FromStringAndSize(hex_digest, digest_size * 2);
PyMem_Free(hex_digest); PyMem_Free(hex_digest);
......
...@@ -175,18 +175,18 @@ ascii_escape_unichar(Py_UCS4 c, unsigned char *output, Py_ssize_t chars) ...@@ -175,18 +175,18 @@ ascii_escape_unichar(Py_UCS4 c, unsigned char *output, Py_ssize_t chars)
Py_UCS4 v = c - 0x10000; Py_UCS4 v = c - 0x10000;
c = 0xd800 | ((v >> 10) & 0x3ff); c = 0xd800 | ((v >> 10) & 0x3ff);
output[chars++] = 'u'; output[chars++] = 'u';
output[chars++] = "0123456789abcdef"[(c >> 12) & 0xf]; output[chars++] = Py_hexdigits[(c >> 12) & 0xf];
output[chars++] = "0123456789abcdef"[(c >> 8) & 0xf]; output[chars++] = Py_hexdigits[(c >> 8) & 0xf];
output[chars++] = "0123456789abcdef"[(c >> 4) & 0xf]; output[chars++] = Py_hexdigits[(c >> 4) & 0xf];
output[chars++] = "0123456789abcdef"[(c ) & 0xf]; output[chars++] = Py_hexdigits[(c ) & 0xf];
c = 0xdc00 | (v & 0x3ff); c = 0xdc00 | (v & 0x3ff);
output[chars++] = '\\'; output[chars++] = '\\';
} }
output[chars++] = 'u'; output[chars++] = 'u';
output[chars++] = "0123456789abcdef"[(c >> 12) & 0xf]; output[chars++] = Py_hexdigits[(c >> 12) & 0xf];
output[chars++] = "0123456789abcdef"[(c >> 8) & 0xf]; output[chars++] = Py_hexdigits[(c >> 8) & 0xf];
output[chars++] = "0123456789abcdef"[(c >> 4) & 0xf]; output[chars++] = Py_hexdigits[(c >> 4) & 0xf];
output[chars++] = "0123456789abcdef"[(c ) & 0xf]; output[chars++] = Py_hexdigits[(c ) & 0xf];
} }
return chars; return chars;
} }
......
...@@ -1776,7 +1776,6 @@ save_bytes(PicklerObject *self, PyObject *obj) ...@@ -1776,7 +1776,6 @@ save_bytes(PicklerObject *self, PyObject *obj)
static PyObject * static PyObject *
raw_unicode_escape(PyObject *obj) raw_unicode_escape(PyObject *obj)
{ {
static const char *hexdigits = "0123456789abcdef";
PyObject *repr, *result; PyObject *repr, *result;
char *p; char *p;
Py_ssize_t i, size, expandsize; Py_ssize_t i, size, expandsize;
...@@ -1809,23 +1808,23 @@ raw_unicode_escape(PyObject *obj) ...@@ -1809,23 +1808,23 @@ raw_unicode_escape(PyObject *obj)
if (ch >= 0x10000) { if (ch >= 0x10000) {
*p++ = '\\'; *p++ = '\\';
*p++ = 'U'; *p++ = 'U';
*p++ = hexdigits[(ch >> 28) & 0xf]; *p++ = Py_hexdigits[(ch >> 28) & 0xf];
*p++ = hexdigits[(ch >> 24) & 0xf]; *p++ = Py_hexdigits[(ch >> 24) & 0xf];
*p++ = hexdigits[(ch >> 20) & 0xf]; *p++ = Py_hexdigits[(ch >> 20) & 0xf];
*p++ = hexdigits[(ch >> 16) & 0xf]; *p++ = Py_hexdigits[(ch >> 16) & 0xf];
*p++ = hexdigits[(ch >> 12) & 0xf]; *p++ = Py_hexdigits[(ch >> 12) & 0xf];
*p++ = hexdigits[(ch >> 8) & 0xf]; *p++ = Py_hexdigits[(ch >> 8) & 0xf];
*p++ = hexdigits[(ch >> 4) & 0xf]; *p++ = Py_hexdigits[(ch >> 4) & 0xf];
*p++ = hexdigits[ch & 15]; *p++ = Py_hexdigits[ch & 15];
} }
/* Map 16-bit characters to '\uxxxx' */ /* Map 16-bit characters to '\uxxxx' */
else if (ch >= 256 || ch == '\\' || ch == '\n') { else if (ch >= 256 || ch == '\\' || ch == '\n') {
*p++ = '\\'; *p++ = '\\';
*p++ = 'u'; *p++ = 'u';
*p++ = hexdigits[(ch >> 12) & 0xf]; *p++ = Py_hexdigits[(ch >> 12) & 0xf];
*p++ = hexdigits[(ch >> 8) & 0xf]; *p++ = Py_hexdigits[(ch >> 8) & 0xf];
*p++ = hexdigits[(ch >> 4) & 0xf]; *p++ = Py_hexdigits[(ch >> 4) & 0xf];
*p++ = hexdigits[ch & 15]; *p++ = Py_hexdigits[ch & 15];
} }
/* Copy everything else as-is */ /* Copy everything else as-is */
else else
......
...@@ -1078,13 +1078,11 @@ binascii_hexlify(PyObject *self, PyObject *args) ...@@ -1078,13 +1078,11 @@ binascii_hexlify(PyObject *self, PyObject *args)
/* make hex version of string, taken from shamodule.c */ /* make hex version of string, taken from shamodule.c */
for (i=j=0; i < arglen; i++) { for (i=j=0; i < arglen; i++) {
char c; unsigned char c;
c = (argbuf[i] >> 4) & 0xf; c = (argbuf[i] >> 4) & 0xf;
c = (c>9) ? c+'a'-10 : c + '0'; retbuf[j++] = Py_hexdigits[c];
retbuf[j++] = c;
c = argbuf[i] & 0xf; c = argbuf[i] & 0xf;
c = (c>9) ? c+'a'-10 : c + '0'; retbuf[j++] = Py_hexdigits[c];
retbuf[j++] = c;
} }
PyBuffer_Release(&parg); PyBuffer_Release(&parg);
return retval; return retval;
......
...@@ -391,13 +391,11 @@ MD5_hexdigest(MD5object *self, PyObject *unused) ...@@ -391,13 +391,11 @@ MD5_hexdigest(MD5object *self, PyObject *unused)
/* Make hex version of the digest */ /* Make hex version of the digest */
for(i=j=0; i<MD5_DIGESTSIZE; i++) { for(i=j=0; i<MD5_DIGESTSIZE; i++) {
char c; unsigned char c;
c = (digest[i] >> 4) & 0xf; c = (digest[i] >> 4) & 0xf;
c = (c>9) ? c+'a'-10 : c + '0'; hex_digest[j++] = Py_hexdigits[c];
hex_digest[j++] = c;
c = (digest[i] & 0xf); c = (digest[i] & 0xf);
c = (c>9) ? c+'a'-10 : c + '0'; hex_digest[j++] = Py_hexdigits[c];
hex_digest[j++] = c;
} }
return retval; return retval;
} }
......
...@@ -367,13 +367,11 @@ SHA1_hexdigest(SHA1object *self, PyObject *unused) ...@@ -367,13 +367,11 @@ SHA1_hexdigest(SHA1object *self, PyObject *unused)
/* Make hex version of the digest */ /* Make hex version of the digest */
for(i=j=0; i<SHA1_DIGESTSIZE; i++) { for(i=j=0; i<SHA1_DIGESTSIZE; i++) {
char c; unsigned char c;
c = (digest[i] >> 4) & 0xf; c = (digest[i] >> 4) & 0xf;
c = (c>9) ? c+'a'-10 : c + '0'; hex_digest[j++] = Py_hexdigits[c];
hex_digest[j++] = c;
c = (digest[i] & 0xf); c = (digest[i] & 0xf);
c = (c>9) ? c+'a'-10 : c + '0'; hex_digest[j++] = Py_hexdigits[c];
hex_digest[j++] = c;
} }
return retval; return retval;
} }
......
...@@ -460,13 +460,11 @@ SHA256_hexdigest(SHAobject *self, PyObject *unused) ...@@ -460,13 +460,11 @@ SHA256_hexdigest(SHAobject *self, PyObject *unused)
/* Make hex version of the digest */ /* Make hex version of the digest */
for(i=j=0; i<self->digestsize; i++) { for(i=j=0; i<self->digestsize; i++) {
char c; unsigned char c;
c = (digest[i] >> 4) & 0xf; c = (digest[i] >> 4) & 0xf;
c = (c>9) ? c+'a'-10 : c + '0'; hex_digest[j++] = Py_hexdigits[c];
hex_digest[j++] = c;
c = (digest[i] & 0xf); c = (digest[i] & 0xf);
c = (c>9) ? c+'a'-10 : c + '0'; hex_digest[j++] = Py_hexdigits[c];
hex_digest[j++] = c;
} }
return retval; return retval;
} }
......
...@@ -526,13 +526,11 @@ SHA512_hexdigest(SHAobject *self, PyObject *unused) ...@@ -526,13 +526,11 @@ SHA512_hexdigest(SHAobject *self, PyObject *unused)
/* Make hex version of the digest */ /* Make hex version of the digest */
for (i=j=0; i<self->digestsize; i++) { for (i=j=0; i<self->digestsize; i++) {
char c; unsigned char c;
c = (digest[i] >> 4) & 0xf; c = (digest[i] >> 4) & 0xf;
c = (c>9) ? c+'a'-10 : c + '0'; hex_digest[j++] = Py_hexdigits[c];
hex_digest[j++] = c;
c = (digest[i] & 0xf); c = (digest[i] & 0xf);
c = (c>9) ? c+'a'-10 : c + '0'; hex_digest[j++] = Py_hexdigits[c];
hex_digest[j++] = c;
} }
return retval; return retval;
} }
......
...@@ -850,7 +850,6 @@ bytearray_init(PyByteArrayObject *self, PyObject *args, PyObject *kwds) ...@@ -850,7 +850,6 @@ bytearray_init(PyByteArrayObject *self, PyObject *args, PyObject *kwds)
static PyObject * static PyObject *
bytearray_repr(PyByteArrayObject *self) bytearray_repr(PyByteArrayObject *self)
{ {
static const char *hexdigits = "0123456789abcdef";
const char *quote_prefix = "bytearray(b"; const char *quote_prefix = "bytearray(b";
const char *quote_postfix = ")"; const char *quote_postfix = ")";
Py_ssize_t length = Py_SIZE(self); Py_ssize_t length = Py_SIZE(self);
...@@ -912,8 +911,8 @@ bytearray_repr(PyByteArrayObject *self) ...@@ -912,8 +911,8 @@ bytearray_repr(PyByteArrayObject *self)
else if (c < ' ' || c >= 0x7f) { else if (c < ' ' || c >= 0x7f) {
*p++ = '\\'; *p++ = '\\';
*p++ = 'x'; *p++ = 'x';
*p++ = hexdigits[(c & 0xf0) >> 4]; *p++ = Py_hexdigits[(c & 0xf0) >> 4];
*p++ = hexdigits[c & 0xf]; *p++ = Py_hexdigits[c & 0xf];
} }
else else
*p++ = c; *p++ = c;
......
...@@ -564,7 +564,6 @@ PyBytes_AsStringAndSize(register PyObject *obj, ...@@ -564,7 +564,6 @@ PyBytes_AsStringAndSize(register PyObject *obj,
PyObject * PyObject *
PyBytes_Repr(PyObject *obj, int smartquotes) PyBytes_Repr(PyObject *obj, int smartquotes)
{ {
static const char *hexdigits = "0123456789abcdef";
register PyBytesObject* op = (PyBytesObject*) obj; register PyBytesObject* op = (PyBytesObject*) obj;
Py_ssize_t i, length = Py_SIZE(op); Py_ssize_t i, length = Py_SIZE(op);
size_t newsize, squotes, dquotes; size_t newsize, squotes, dquotes;
...@@ -620,8 +619,8 @@ PyBytes_Repr(PyObject *obj, int smartquotes) ...@@ -620,8 +619,8 @@ PyBytes_Repr(PyObject *obj, int smartquotes)
else if (c < ' ' || c >= 0x7f) { else if (c < ' ' || c >= 0x7f) {
*p++ = '\\'; *p++ = '\\';
*p++ = 'x'; *p++ = 'x';
*p++ = hexdigits[(c & 0xf0) >> 4]; *p++ = Py_hexdigits[(c & 0xf0) >> 4];
*p++ = hexdigits[c & 0xf]; *p++ = Py_hexdigits[c & 0xf];
} }
else else
*p++ = c; *p++ = c;
......
...@@ -1058,7 +1058,7 @@ static char ...@@ -1058,7 +1058,7 @@ static char
char_from_hex(int x) char_from_hex(int x)
{ {
assert(0 <= x && x < 16); assert(0 <= x && x < 16);
return "0123456789abcdef"[x]; return Py_hexdigits[x];
} }
static int static int
......
This diff is collapsed.
...@@ -11,6 +11,8 @@ Copyright (c) Corporation for National Research Initiatives. ...@@ -11,6 +11,8 @@ Copyright (c) Corporation for National Research Initiatives.
#include "Python.h" #include "Python.h"
#include <ctype.h> #include <ctype.h>
const char *Py_hexdigits = "0123456789abcdef";
/* --- Codec Registry ----------------------------------------------------- */ /* --- Codec Registry ----------------------------------------------------- */
/* Import the standard encodings package which will register the first /* Import the standard encodings package which will register the first
...@@ -673,8 +675,6 @@ PyObject *PyCodec_XMLCharRefReplaceErrors(PyObject *exc) ...@@ -673,8 +675,6 @@ PyObject *PyCodec_XMLCharRefReplaceErrors(PyObject *exc)
} }
} }
static const char *hexdigits = "0123456789abcdef";
PyObject *PyCodec_BackslashReplaceErrors(PyObject *exc) PyObject *PyCodec_BackslashReplaceErrors(PyObject *exc)
{ {
#ifndef Py_UNICODE_WIDE #ifndef Py_UNICODE_WIDE
...@@ -731,22 +731,22 @@ PyObject *PyCodec_BackslashReplaceErrors(PyObject *exc) ...@@ -731,22 +731,22 @@ PyObject *PyCodec_BackslashReplaceErrors(PyObject *exc)
} }
if (c >= 0x00010000) { if (c >= 0x00010000) {
*outp++ = 'U'; *outp++ = 'U';
*outp++ = hexdigits[(c>>28)&0xf]; *outp++ = Py_hexdigits[(c>>28)&0xf];
*outp++ = hexdigits[(c>>24)&0xf]; *outp++ = Py_hexdigits[(c>>24)&0xf];
*outp++ = hexdigits[(c>>20)&0xf]; *outp++ = Py_hexdigits[(c>>20)&0xf];
*outp++ = hexdigits[(c>>16)&0xf]; *outp++ = Py_hexdigits[(c>>16)&0xf];
*outp++ = hexdigits[(c>>12)&0xf]; *outp++ = Py_hexdigits[(c>>12)&0xf];
*outp++ = hexdigits[(c>>8)&0xf]; *outp++ = Py_hexdigits[(c>>8)&0xf];
} }
else if (c >= 0x100) { else if (c >= 0x100) {
*outp++ = 'u'; *outp++ = 'u';
*outp++ = hexdigits[(c>>12)&0xf]; *outp++ = Py_hexdigits[(c>>12)&0xf];
*outp++ = hexdigits[(c>>8)&0xf]; *outp++ = Py_hexdigits[(c>>8)&0xf];
} }
else else
*outp++ = 'x'; *outp++ = 'x';
*outp++ = hexdigits[(c>>4)&0xf]; *outp++ = Py_hexdigits[(c>>4)&0xf];
*outp++ = hexdigits[c&0xf]; *outp++ = Py_hexdigits[c&0xf];
} }
restuple = Py_BuildValue("(On)", res, end); restuple = Py_BuildValue("(On)", res, end);
......
...@@ -463,12 +463,11 @@ dump_decimal(int fd, int value) ...@@ -463,12 +463,11 @@ dump_decimal(int fd, int value)
static void static void
dump_hexadecimal(int width, unsigned long value, int fd) dump_hexadecimal(int width, unsigned long value, int fd)
{ {
const char *hexdigits = "0123456789abcdef";
int len; int len;
char buffer[sizeof(unsigned long) * 2 + 1]; char buffer[sizeof(unsigned long) * 2 + 1];
len = 0; len = 0;
do { do {
buffer[len] = hexdigits[value & 15]; buffer[len] = Py_hexdigits[value & 15];
value >>= 4; value >>= 4;
len++; len++;
} while (len < width || value); } while (len < width || value);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment