- Notifications
You must be signed in to change notification settings - Fork 31.7k
/
Copy pathpystrhex.c
61 lines (52 loc) · 1.67 KB
/
pystrhex.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/* bytes to hex implementation */
#include"Python.h"
staticPyObject*_Py_strhex_impl(constchar*argbuf, constPy_ssize_targlen,
intreturn_bytes)
{
PyObject*retval;
Py_UCS1*retbuf;
Py_ssize_ti, j;
assert(arglen >= 0);
if (arglen>PY_SSIZE_T_MAX / 2)
returnPyErr_NoMemory();
if (return_bytes) {
/* If _PyBytes_FromSize() were public we could avoid malloc+copy. */
retbuf= (Py_UCS1*) PyMem_Malloc(arglen*2);
if (!retbuf)
returnPyErr_NoMemory();
retval=NULL; /* silence a compiler warning, assigned later. */
} else {
retval=PyUnicode_New(arglen*2, 127);
if (!retval)
returnNULL;
retbuf=PyUnicode_1BYTE_DATA(retval);
}
/* make hex version of string, taken from shamodule.c */
for (i=j=0; i<arglen; i++) {
unsigned charc;
c= (argbuf[i] >> 4) &0xf;
retbuf[j++] =Py_hexdigits[c];
c=argbuf[i] &0xf;
retbuf[j++] =Py_hexdigits[c];
}
if (return_bytes) {
retval=PyBytes_FromStringAndSize((constchar*)retbuf, arglen*2);
PyMem_Free(retbuf);
}
#ifdefPy_DEBUG
else {
assert(_PyUnicode_CheckConsistency(retval, 1));
}
#endif
returnretval;
}
PyAPI_FUNC(PyObject*) _Py_strhex(constchar*argbuf, constPy_ssize_targlen)
{
return_Py_strhex_impl(argbuf, arglen, 0);
}
/* Same as above but returns a bytes() instead of str() to avoid the
* need to decode the str() when bytes are needed. */
PyAPI_FUNC(PyObject*) _Py_strhex_bytes(constchar*argbuf, constPy_ssize_targlen)
{
return_Py_strhex_impl(argbuf, arglen, 1);
}