From bd31b7c48317eecf981215afbb1f30c81769acbf Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 23 Mar 2016 10:32:26 +0100 Subject: Issue #23848: Expose _Py_DumpHexadecimal() This function will be reused by faulthandler. --- Include/traceback.h | 15 ++++++++++++++- Python/traceback.c | 17 +++++++++-------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/Include/traceback.h b/Include/traceback.h index 76e169a..f767ea8 100644 --- a/Include/traceback.h +++ b/Include/traceback.h @@ -94,7 +94,20 @@ PyAPI_FUNC(void) _Py_DumpASCII(int fd, PyObject *text); /* Format an integer as decimal into the file descriptor fd. This function is signal safe. */ -PyAPI_FUNC(void) _Py_DumpDecimal(int fd, unsigned long value); +PyAPI_FUNC(void) _Py_DumpDecimal( + int fd, + unsigned long value); + +/* Format an integer as hexadecimal into the file descriptor fd with at least + width digits. + + The maximum width is sizeof(unsigned long)*2 digits. + + This function is signal safe. */ +PyAPI_FUNC(void) _Py_DumpHexadecimal( + int fd, + unsigned long value, + Py_ssize_t width); #endif /* !Py_LIMITED_API */ diff --git a/Python/traceback.c b/Python/traceback.c index 403dba5..3259482 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -506,14 +506,15 @@ _Py_DumpDecimal(int fd, unsigned long value) This function is signal safe. */ -static void -dump_hexadecimal(int fd, unsigned long value, Py_ssize_t width) +void +_Py_DumpHexadecimal(int fd, unsigned long value, Py_ssize_t width) { char buffer[sizeof(unsigned long) * 2 + 1], *ptr, *end; const Py_ssize_t size = Py_ARRAY_LENGTH(buffer) - 1; if (width > size) width = size; + /* it's ok if width is negative */ end = &buffer[size]; ptr = end; @@ -582,15 +583,15 @@ _Py_DumpASCII(int fd, PyObject *text) } else if (ch <= 0xff) { PUTS(fd, "\\x"); - dump_hexadecimal(fd, ch, 2); + _Py_DumpHexadecimal(fd, ch, 2); } else if (ch <= 0xffff) { PUTS(fd, "\\u"); - dump_hexadecimal(fd, ch, 4); + _Py_DumpHexadecimal(fd, ch, 4); } else { PUTS(fd, "\\U"); - dump_hexadecimal(fd, ch, 8); + _Py_DumpHexadecimal(fd, ch, 8); } } if (truncated) { @@ -693,9 +694,9 @@ write_thread_id(int fd, PyThreadState *tstate, int is_current) PUTS(fd, "Current thread 0x"); else PUTS(fd, "Thread 0x"); - dump_hexadecimal(fd, - (unsigned long)tstate->thread_id, - sizeof(unsigned long) * 2); + _Py_DumpHexadecimal(fd, + (unsigned long)tstate->thread_id, + sizeof(unsigned long) * 2); PUTS(fd, " (most recent call first):\n"); } -- cgit v0.12