/*
* Copyright (c) Cyril Hrubis chrubis@suse.cz 2009
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
* the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <sys/uio.h>
#include <inttypes.h>
#include <limits.h>
#include <assert.h>
#include "test.h"
#include "libftest.h"
/*
* Dump content of iov structure.
*/
void ft_dumpiov(struct iovec *iov)
{
char *buf, val;
int idx, nout, i;
tst_resm(TINFO, "\tBuf:");
nout = 0;
idx = 0;
buf = (char *)iov->iov_base;
val = *((char *)buf);
for (i = 0; (unsigned int)i < iov->iov_len; i++) {
if (buf[i] != val) {
if (i == idx + 1)
tst_resm(TINFO, "\t%" PRIx32 "x,",
buf[idx] & 0xff);
else
tst_resm(TINFO, "\t%d*%" PRIx32 "x, ", i - idx,
buf[idx] & 0xff);
idx = i;
++nout;
}
if (nout > 10) {
tst_resm(TINFO, "\t ... more");
return;
}
}
if (i == idx + 1)
tst_resm(TINFO, "\t%" PRIx32 "x", buf[idx] & 0xff);
else
tst_resm(TINFO, "\t%d*%" PRIx32 "x", i - idx, buf[idx]);
}
/*
* Dump bits string.
*/
void ft_dumpbits(void *bits, size_t size)
{
void *buf;
tst_resm(TINFO, "\tBits array:");
for (buf = bits; size > 0; --size, ++buf) {
tst_resm(TINFO, "\t%td:\t", 8 * (buf - bits));
if ((buf - bits) % 16 == 0) {
assert(0 < (buf - bits));
tst_resm(TINFO, "\t%td:\t", 8 * (buf - bits));
}
tst_resm(TINFO, "\t%02" PRIx32 "x ", *((char *)buf) & 0xff);
}
tst_resm(TINFO, "\t");
}
/*
* Do logical or of hold and bits (of size)
* fields and store result into hold field.
*/
void ft_orbits(char *hold, char *bits, int size)
{
while (size-- > 0)
*hold++ |= *bits++;
}
/*
* Dumps buffer in hexadecimal format.
*/
void ft_dumpbuf(char *buf, int csize)
{
char val;
int idx, nout, i;
tst_resm(TINFO, "\tBuf:");
nout = 0;
idx = 0;
val = buf[0];
for (i = 0; i < csize; i++) {
if (buf[i] != val) {
if (i == idx + 1)
tst_resm(TINFO, "\t%x, ", buf[idx] & 0xff);
else
tst_resm(TINFO, "\t%d*%x, ", i - idx,
buf[idx] & 0xff);
idx = i;
++nout;
}
if (nout > 10) {
tst_resm(TINFO, "\t ... more");
return;
}
}
if (i == idx + 1)
tst_resm(TINFO, "\t%x", buf[idx] & 0xff);
else
tst_resm(TINFO, "\t%d*%x", i - idx, buf[idx]);
}
/*
* Creates filename from path and numbers.
*
* TODO: name is big enough?
*/
void ft_mkname(char *name, char *dirname, int me, int idx)
{
char a, b;
a = 'A' + (me % 26);
b = 'a' + (idx % 26);
if (dirname[0] != '\0')
snprintf(name, PATH_MAX, "%s/%c%c", dirname, a, b);
else
snprintf(name, PATH_MAX, "%c%c", a, b);
}