From: Dmitry V. Levin Date: Thu, 4 Feb 2016 01:59:35 +0000 (+0000) Subject: tests: add hexquote_strndup function to libtests X-Git-Tag: v4.12~599 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7637b1d9e86a0882ef95db8f13d2f0f8f3db07d3;p=strace tests: add hexquote_strndup function to libtests * tests/tests.h (hexquote_strndup): New prototype. * tests/hexquote_strndup.c: New file. * tests/Makefile.am (libtests_a_SOURCES): Add it. --- diff --git a/tests/Makefile.am b/tests/Makefile.am index 667d8633..da74adc2 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -44,6 +44,7 @@ libtests_a_SOURCES = \ error_msg.c \ get_page_size.c \ hexdump_strdup.c \ + hexquote_strndup.c \ inode_of_sockfd.c \ tail_alloc.c \ tests.h \ diff --git a/tests/hexquote_strndup.c b/tests/hexquote_strndup.c new file mode 100644 index 00000000..3ad3970c --- /dev/null +++ b/tests/hexquote_strndup.c @@ -0,0 +1,58 @@ +/* + * Make a hexquoted copy of a string + * + * Copyright (c) 2016 Dmitry V. Levin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "tests.h" + +#include +#include +#include + +const char * +hexquote_strndup(const char *src, const size_t src_len) +{ + const size_t dst_size = 4 * src_len + 1; + assert(dst_size > src_len); + + char *dst = malloc(dst_size); + if (!dst) + perror_msg_and_fail("malloc(%zu)", dst_size); + + char *p = dst; + size_t i; + for (i = 0; i < src_len; ++i) { + unsigned int c = ((const unsigned char *) src)[i]; + *(p++) = '\\'; + *(p++) = 'x'; + *(p++) = "0123456789abcdef"[c >> 4]; + *(p++) = "0123456789abcdef"[c & 0xf]; + } + *p = '\0'; + + return dst; +} diff --git a/tests/tests.h b/tests/tests.h index 37db2ebf..826f8b2f 100644 --- a/tests/tests.h +++ b/tests/tests.h @@ -69,6 +69,9 @@ void tprintf(const char *, ...) /* Make a hexdump copy of C string */ const char *hexdump_strdup(const char *); +/* Make a hexquoted copy of a string */ +const char *hexquote_strndup(const char *, size_t); + /* Return inode number of socket descriptor. */ unsigned long inode_of_sockfd(int);