175067f4fSPoul-Henning Kamp /*-
2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause
3d915a14eSPedro F. Giffuni *
475067f4fSPoul-Henning Kamp * Copyright (c) 2005 Poul-Henning Kamp
575067f4fSPoul-Henning Kamp * All rights reserved.
675067f4fSPoul-Henning Kamp *
775067f4fSPoul-Henning Kamp * Redistribution and use in source and binary forms, with or without
875067f4fSPoul-Henning Kamp * modification, are permitted provided that the following conditions
975067f4fSPoul-Henning Kamp * are met:
1075067f4fSPoul-Henning Kamp * 1. Redistributions of source code must retain the above copyright
1175067f4fSPoul-Henning Kamp * notice, this list of conditions and the following disclaimer.
1275067f4fSPoul-Henning Kamp * 2. Redistributions in binary form must reproduce the above copyright
1375067f4fSPoul-Henning Kamp * notice, this list of conditions and the following disclaimer in the
1475067f4fSPoul-Henning Kamp * documentation and/or other materials provided with the distribution.
1575067f4fSPoul-Henning Kamp *
1675067f4fSPoul-Henning Kamp * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1775067f4fSPoul-Henning Kamp * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1875067f4fSPoul-Henning Kamp * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1975067f4fSPoul-Henning Kamp * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
2075067f4fSPoul-Henning Kamp * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2175067f4fSPoul-Henning Kamp * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2275067f4fSPoul-Henning Kamp * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2375067f4fSPoul-Henning Kamp * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2475067f4fSPoul-Henning Kamp * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2575067f4fSPoul-Henning Kamp * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2675067f4fSPoul-Henning Kamp * SUCH DAMAGE.
2775067f4fSPoul-Henning Kamp */
2875067f4fSPoul-Henning Kamp
2975067f4fSPoul-Henning Kamp #include <namespace.h>
3075067f4fSPoul-Henning Kamp #include <stdio.h>
3175067f4fSPoul-Henning Kamp #include <string.h>
3275067f4fSPoul-Henning Kamp #include <stdlib.h>
3375067f4fSPoul-Henning Kamp #include <wchar.h>
3475067f4fSPoul-Henning Kamp #include <vis.h>
3575067f4fSPoul-Henning Kamp #include <assert.h>
3675067f4fSPoul-Henning Kamp #include <sys/time.h>
3775067f4fSPoul-Henning Kamp #include "printf.h"
3875067f4fSPoul-Henning Kamp
3975067f4fSPoul-Henning Kamp int
__printf_arginfo_vis(const struct printf_info * pi,size_t n,int * argt)4075067f4fSPoul-Henning Kamp __printf_arginfo_vis(const struct printf_info *pi, size_t n, int *argt)
4175067f4fSPoul-Henning Kamp {
4275067f4fSPoul-Henning Kamp
4375067f4fSPoul-Henning Kamp assert(n >= 1);
4475067f4fSPoul-Henning Kamp argt[0] = PA_POINTER;
4575067f4fSPoul-Henning Kamp return (1);
4675067f4fSPoul-Henning Kamp }
4775067f4fSPoul-Henning Kamp
4875067f4fSPoul-Henning Kamp int
__printf_render_vis(struct __printf_io * io,const struct printf_info * pi,const void * const * arg)4975067f4fSPoul-Henning Kamp __printf_render_vis(struct __printf_io *io, const struct printf_info *pi, const void *const *arg)
5075067f4fSPoul-Henning Kamp {
5175067f4fSPoul-Henning Kamp char *p, *buf;
5275067f4fSPoul-Henning Kamp unsigned l;
5375067f4fSPoul-Henning Kamp int ret;
5475067f4fSPoul-Henning Kamp
5575067f4fSPoul-Henning Kamp ret = 0;
5675067f4fSPoul-Henning Kamp p = *((char **)arg[0]);
576dbacee2SPoul-Henning Kamp if (p == NULL)
586dbacee2SPoul-Henning Kamp return (__printf_out(io, pi, "(null)", 6));
5975067f4fSPoul-Henning Kamp if (pi->prec >= 0)
6075067f4fSPoul-Henning Kamp l = pi->prec;
6175067f4fSPoul-Henning Kamp else
6275067f4fSPoul-Henning Kamp l = strlen(p);
6375067f4fSPoul-Henning Kamp buf = malloc(l * 4 + 1);
6475067f4fSPoul-Henning Kamp if (buf == NULL)
6575067f4fSPoul-Henning Kamp return (-1);
6675067f4fSPoul-Henning Kamp if (pi->showsign)
6775067f4fSPoul-Henning Kamp ret = strvisx(buf, p, l, VIS_WHITE | VIS_HTTPSTYLE);
6875067f4fSPoul-Henning Kamp else if (pi->pad == '0')
6975067f4fSPoul-Henning Kamp ret = strvisx(buf, p, l, VIS_WHITE | VIS_OCTAL);
7075067f4fSPoul-Henning Kamp else if (pi->alt)
7175067f4fSPoul-Henning Kamp ret = strvisx(buf, p, l, VIS_WHITE);
7275067f4fSPoul-Henning Kamp else
7375067f4fSPoul-Henning Kamp ret = strvisx(buf, p, l, VIS_WHITE | VIS_CSTYLE | VIS_OCTAL);
7475067f4fSPoul-Henning Kamp ret += __printf_out(io, pi, buf, ret);
7575067f4fSPoul-Henning Kamp __printf_flush(io);
7675067f4fSPoul-Henning Kamp free(buf);
7775067f4fSPoul-Henning Kamp return(ret);
7875067f4fSPoul-Henning Kamp }
79