openrc/src/libeinfo.c

824 lines
15 KiB
C
Raw Normal View History

/*
einfo.c
Informational functions
*/
/*
* Copyright 2007 Gentoo Foundation
* Copyright 2007 Roy Marples
* 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.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
*/
const char copyright[] = "Copyright (c) 2007 Gentoo Foundation\n"
"Copyright (c) 2007 Roy Marples";
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <syslog.h>
#include <unistd.h>
#include "einfo.h"
#include "rc.h"
#include "rc-misc.h"
#include "hidden-visibility.h"
2007-04-17 15:02:18 +05:30
hidden_proto(ecolor)
hidden_proto(ebegin)
hidden_proto(ebeginv)
hidden_proto(ebracket)
hidden_proto(eend)
hidden_proto(eendv)
hidden_proto(eerror)
hidden_proto(eerrorn)
hidden_proto(eerrorx)
hidden_proto(eindent)
hidden_proto(eindentv)
hidden_proto(einfo)
hidden_proto(einfon)
hidden_proto(einfov)
hidden_proto(einfovn)
2007-08-16 22:23:20 +05:30
hidden_proto(elog)
hidden_proto(eoutdent)
hidden_proto(eoutdentv)
2007-10-03 18:25:27 +05:30
hidden_proto(eprefix)
hidden_proto(ewarn)
hidden_proto(ewarnn)
hidden_proto(ewarnv)
hidden_proto(ewarnvn)
hidden_proto(ewarnx)
hidden_proto(ewend)
hidden_proto(ewendv)
2007-04-17 15:02:18 +05:30
/* Incase we cannot work out how many columns from ioctl, supply a default */
#define DEFAULT_COLS 80
2007-04-17 15:02:18 +05:30
#define OK "ok"
#define NOT_OK "!!"
/* Number of spaces for an indent */
#define INDENT_WIDTH 2
/* How wide can the indent go? */
2007-04-17 15:02:18 +05:30
#define INDENT_MAX 40
2007-04-17 15:02:18 +05:30
/* Default colours */
#define ECOLOR_GOOD_A "\033[32;01m"
#define ECOLOR_WARN_A "\033[33;01m"
#define ECOLOR_BAD_A "\033[31;01m"
#define ECOLOR_HILITE_A "\033[36;01m"
#define ECOLOR_BRACKET_A "\033[34;01m"
#define ECOLOR_NORMAL_A "\033[0m"
#define ECOLOR_FLUSH_A "\033[K"
2007-04-17 15:02:18 +05:30
/* A cheat sheet of colour capable terminals
This is taken from DIR_COLORS from GNU coreutils
We embed it here as we shouldn't depend on coreutils */
2007-04-17 15:02:18 +05:30
static const char *color_terms[] = {
2007-04-11 18:14:47 +05:30
"Eterm",
"ansi",
"color-xterm",
"con132x25",
"con132x30",
"con132x43",
"con132x60",
"con80x25",
"con80x28",
"con80x30",
"con80x43",
"con80x50",
"con80x60",
"cons25",
"console",
"cygwin",
"dtterm",
"gnome",
"konsole",
"kterm",
"linux",
"linux-c",
"mach-color",
"mlterm",
"putty",
"rxvt",
"rxvt-cygwin",
"rxvt-cygwin-native",
"rxvt-unicode",
"screen",
"screen-bce",
"screen-w",
"screen.linux",
"vt100",
"xterm",
"xterm-256color",
"xterm-color",
"xterm-debian",
NULL
};
static const char *term = NULL;
static bool term_is_cons25 = false;
/* A pointer to a string to prefix to einfo/ewarn/eerror messages */
static const char *_eprefix = NULL;
static bool yesno (const char *value)
{
if (! value) {
errno = ENOENT;
2007-04-11 18:14:47 +05:30
return (false);
}
if (strcasecmp (value, "yes") == 0 ||
strcasecmp (value, "y") == 0 ||
strcasecmp (value, "true") == 0 ||
strcasecmp (value, "on") == 0 ||
strcasecmp (value, "1") == 0)
return (true);
if (strcasecmp (value, "no") != 0 &&
strcasecmp (value, "n") != 0 &&
strcasecmp (value, "false") != 0 &&
strcasecmp (value, "off") != 0 &&
strcasecmp (value, "0") != 0)
errno = EINVAL;
return (false);
}
static bool noyes (const char *value) {
int serrno = errno;
bool retval;
errno = 0;
retval = yesno (value);
if (errno == 0) {
retval = ! retval;
errno = serrno;
}
return (retval);
}
static bool is_quiet() {
return (yesno (getenv ("EINFO_QUIET")));
}
static bool is_verbose() {
return (yesno (getenv ("EINFO_VERBOSE")));
}
static bool colour_terminal (FILE *f)
{
2007-04-11 18:14:47 +05:30
static int in_colour = -1;
int i = 0;
if (f && ! isatty (fileno (f)))
return (false);
if (noyes (getenv ("EINFO_COLOR")))
2007-06-28 21:14:14 +05:30
return (false);
2007-04-11 18:14:47 +05:30
if (in_colour == 0)
return (false);
if (in_colour == 1)
return (true);
if (! term) {
term = getenv ("TERM");
if (! term)
return (false);
}
if (strcmp (term, "cons25") == 0)
term_is_cons25 = true;
else
term_is_cons25 = false;
2007-04-17 15:02:18 +05:30
while (color_terms[i]) {
if (strcmp (color_terms[i], term) == 0) {
2007-04-11 18:14:47 +05:30
in_colour = 1;
return (true);
}
i++;
}
2007-04-11 18:14:47 +05:30
in_colour = 0;
return (false);
}
static int get_term_columns (FILE *stream)
{
2007-04-17 17:51:15 +05:30
struct winsize ws;
2007-10-03 17:19:08 +05:30
char *env = getenv ("COLUMNS");
char *p;
int i;
if (env) {
i = strtol (env, &p, 10);
if (! *p)
return (i);
}
2007-09-20 17:23:10 +05:30
if (ioctl (fileno (stream), TIOCGWINSZ, &ws) == 0)
2007-04-11 18:14:47 +05:30
return (ws.ws_col);
2007-04-11 18:14:47 +05:30
return (DEFAULT_COLS);
}
void eprefix (const char *prefix)
{
_eprefix = prefix;
}
2007-10-03 18:25:27 +05:30
hidden_def(eprefix)
2007-08-16 22:23:20 +05:30
static void elogv (int level, const char *fmt, va_list ap)
{
char *e = getenv ("EINFO_LOG");
2007-04-11 18:14:47 +05:30
va_list apc;
2007-04-11 18:14:47 +05:30
if (fmt && e) {
closelog ();
openlog (e, LOG_PID, LOG_DAEMON);
va_copy (apc, ap);
vsyslog (level, fmt, apc);
va_end (apc);
closelog ();
}
}
2007-04-11 18:14:47 +05:30
2007-08-16 22:23:20 +05:30
void elog (int level, const char *fmt, ...)
{
va_list ap;
va_start (ap, fmt);
elogv (level, fmt, ap);
va_end (ap);
}
hidden_def(elog)
static int _eindent (FILE *stream)
{
char *env = getenv ("EINFO_INDENT");
2007-04-11 18:14:47 +05:30
int amount = 0;
char indent[INDENT_MAX];
2007-04-11 18:14:47 +05:30
if (env) {
errno = 0;
amount = strtol (env, NULL, 0);
if (errno != 0 || amount < 0)
amount = 0;
else if (amount > INDENT_MAX)
amount = INDENT_MAX;
2007-04-11 18:14:47 +05:30
if (amount > 0)
memset (indent, ' ', amount);
}
2007-04-11 18:14:47 +05:30
/* Terminate it */
memset (indent + amount, 0, 1);
return (fprintf (stream, "%s", indent));
}
static const char *_ecolor (FILE *f, einfo_color_t color)
{
const char *col = NULL;
2007-04-17 15:02:18 +05:30
if (! colour_terminal (f))
2007-04-17 15:02:18 +05:30
return ("");
switch (color) {
case ECOLOR_GOOD:
2007-04-17 15:02:18 +05:30
if (! (col = getenv ("ECOLOR_GOOD")))
col = ECOLOR_GOOD_A;
break;
case ECOLOR_WARN:
2007-04-17 15:02:18 +05:30
if (! (col = getenv ("ECOLOR_WARN")))
col = ECOLOR_WARN_A;
break;
case ECOLOR_BAD:
2007-04-17 15:02:18 +05:30
if (! (col = getenv ("ECOLOR_BAD")))
col = ECOLOR_BAD_A;
break;
case ECOLOR_HILITE:
2007-04-17 15:02:18 +05:30
if (! (col = getenv ("ECOLOR_HILITE")))
col = ECOLOR_HILITE_A;
break;
case ECOLOR_BRACKET:
2007-04-17 15:02:18 +05:30
if (! (col = getenv ("ECOLOR_BRACKET")))
col = ECOLOR_BRACKET_A;
break;
case ECOLOR_NORMAL:
col = ECOLOR_NORMAL_A;
break;
}
return (col);
}
2007-04-17 15:02:18 +05:30
hidden_def(ecolor)
const char *ecolor (einfo_color_t color)
{
FILE *f = stdout;
/* Try and guess a valid tty */
if (! isatty (fileno (f))) {
f = stderr;
if (! isatty (fileno (f))) {
f = stdin;
if (! isatty (fileno (f)))
f = NULL;
}
}
return (_ecolor (f, color));
}
#define EINFOVN(_file, _color) \
if (_eprefix) \
fprintf (_file, "%s%s%s|", _ecolor (_file, _color), _eprefix, _ecolor (_file, ECOLOR_NORMAL)); \
fprintf (_file, " %s*%s ", _ecolor (_file, _color), _ecolor (_file, ECOLOR_NORMAL)); \
retval += _eindent (_file); \
2007-04-10 16:54:58 +05:30
{ \
2007-04-11 18:14:47 +05:30
va_list _ap; \
va_copy (_ap, ap); \
retval += vfprintf (_file, fmt, _ap) + 3; \
va_end (_ap); \
2007-04-10 16:54:58 +05:30
} \
if (colour_terminal (_file)) \
fprintf (_file, ECOLOR_FLUSH_A);
static int _einfovn (const char *fmt, va_list ap)
{
2007-04-11 18:14:47 +05:30
int retval = 0;
EINFOVN (stdout, ECOLOR_GOOD);
2007-04-11 18:14:47 +05:30
return (retval);
}
static int _ewarnvn (const char *fmt, va_list ap)
{
2007-04-11 18:14:47 +05:30
int retval = 0;
EINFOVN (stdout, ECOLOR_WARN);
2007-04-11 18:14:47 +05:30
return (retval);
}
static int _eerrorvn (const char *fmt, va_list ap)
{
2007-04-11 18:14:47 +05:30
int retval = 0;
EINFOVN (stderr, ECOLOR_BAD);
2007-04-11 18:14:47 +05:30
return (retval);
}
int einfon (const char *fmt, ...)
{
2007-04-11 18:14:47 +05:30
int retval;
va_list ap;
if (! fmt || is_quiet ())
2007-04-11 18:14:47 +05:30
return (0);
2007-04-11 18:14:47 +05:30
va_start (ap, fmt);
retval = _einfovn (fmt, ap);
2007-04-11 18:14:47 +05:30
va_end (ap);
2007-04-11 18:14:47 +05:30
return (retval);
}
hidden_def(einfon)
int ewarnn (const char *fmt, ...)
{
2007-04-11 18:14:47 +05:30
int retval;
va_list ap;
if (! fmt || is_quiet ())
2007-04-11 18:14:47 +05:30
return (0);
2007-04-10 16:54:58 +05:30
2007-04-11 18:14:47 +05:30
va_start (ap, fmt);
retval = _ewarnvn (fmt, ap);
2007-04-11 18:14:47 +05:30
va_end (ap);
2007-04-11 18:14:47 +05:30
return (retval);
}
hidden_def(ewarnn)
int eerrorn (const char *fmt, ...)
{
2007-04-11 18:14:47 +05:30
int retval;
va_list ap;
2007-04-11 18:14:47 +05:30
va_start (ap, fmt);
retval = _eerrorvn (fmt, ap);
2007-04-11 18:14:47 +05:30
va_end (ap);
2007-04-11 18:14:47 +05:30
return (retval);
}
hidden_def(eerrorn)
int einfo (const char *fmt, ...)
{
2007-04-11 18:14:47 +05:30
int retval;
va_list ap;
if (! fmt || is_quiet())
2007-04-11 18:14:47 +05:30
return (0);
2007-04-11 18:14:47 +05:30
va_start (ap, fmt);
retval = _einfovn (fmt, ap);
retval += printf ("\n");
2007-04-11 18:14:47 +05:30
va_end (ap);
2007-04-11 18:14:47 +05:30
return (retval);
}
hidden_def(einfo)
int ewarn (const char *fmt, ...)
{
2007-04-11 18:14:47 +05:30
int retval;
va_list ap;
if (! fmt || is_quiet ())
2007-04-11 18:14:47 +05:30
return (0);
2007-04-11 18:14:47 +05:30
va_start (ap, fmt);
2007-08-16 22:23:20 +05:30
elogv (LOG_WARNING, fmt, ap);
retval = _ewarnvn (fmt, ap);
retval += printf ("\n");
2007-04-11 18:14:47 +05:30
va_end (ap);
2007-04-11 18:14:47 +05:30
return (retval);
}
hidden_def(ewarn)
void ewarnx (const char *fmt, ...)
{
2007-04-11 18:14:47 +05:30
int retval;
va_list ap;
if (fmt && ! is_quiet ()) {
2007-04-11 18:14:47 +05:30
va_start (ap, fmt);
2007-08-16 22:23:20 +05:30
elogv (LOG_WARNING, fmt, ap);
2007-04-11 18:14:47 +05:30
retval = _ewarnvn (fmt, ap);
va_end (ap);
retval += printf ("\n");
}
exit (EXIT_FAILURE);
}
hidden_def(ewarnx)
int eerror (const char *fmt, ...)
{
2007-04-11 18:14:47 +05:30
int retval;
va_list ap;
2007-04-11 18:14:47 +05:30
if (! fmt)
return (0);
2007-04-11 18:14:47 +05:30
va_start (ap, fmt);
2007-08-16 22:23:20 +05:30
elogv (LOG_ERR, fmt, ap);
2007-04-11 18:14:47 +05:30
retval = _eerrorvn (fmt, ap);
va_end (ap);
retval += fprintf (stderr, "\n");
2007-04-11 18:14:47 +05:30
return (retval);
}
hidden_def(eerror)
void eerrorx (const char *fmt, ...)
{
2007-04-11 18:14:47 +05:30
va_list ap;
2007-04-11 18:14:47 +05:30
if (fmt) {
va_start (ap, fmt);
2007-08-16 22:23:20 +05:30
elogv (LOG_ERR, fmt, ap);
2007-04-11 18:14:47 +05:30
_eerrorvn (fmt, ap);
va_end (ap);
2007-08-01 17:03:07 +05:30
fprintf (stderr, "\n");
2007-04-11 18:14:47 +05:30
}
2007-04-11 18:14:47 +05:30
exit (EXIT_FAILURE);
}
hidden_def(eerrorx)
int ebegin (const char *fmt, ...)
{
2007-04-11 18:14:47 +05:30
int retval;
va_list ap;
if (! fmt || is_quiet ())
2007-04-11 18:14:47 +05:30
return (0);
2007-04-11 18:14:47 +05:30
va_start (ap, fmt);
retval = _einfovn (fmt, ap);
va_end (ap);
retval += printf (" ...");
if (colour_terminal (stdout))
2007-04-11 18:14:47 +05:30
retval += printf ("\n");
2007-04-11 18:14:47 +05:30
return (retval);
}
hidden_def(ebegin)
static void _eend (FILE *fp, int col, einfo_color_t color, const char *msg)
{
2007-04-11 18:14:47 +05:30
int i;
int cols;
if (! msg)
return;
cols = get_term_columns (fp) - (strlen (msg) + 5);
2007-04-11 18:14:47 +05:30
/* cons25 is special - we need to remove one char, otherwise things
* do not align properly at all. */
if (! term) {
term = getenv ("TERM");
if (term && strcmp (term, "cons25") == 0)
term_is_cons25 = true;
else
term_is_cons25 = false;
}
if (term_is_cons25)
cols--;
2007-04-11 18:14:47 +05:30
if (cols > 0 && colour_terminal (fp)) {
fprintf (fp, "\033[A\033[%dC %s[ %s%s %s]%s\n", cols,
ecolor (ECOLOR_BRACKET), ecolor (color), msg,
ecolor (ECOLOR_BRACKET), ecolor (ECOLOR_NORMAL));
2007-04-11 18:14:47 +05:30
} else {
if (col > 0)
for (i = 0; i < cols - col; i++)
fprintf (fp, " ");
fprintf (fp, " [ %s ]\n", msg);
2007-04-11 18:14:47 +05:30
}
}
static int _do_eend (const char *cmd, int retval, const char *fmt, va_list ap)
{
2007-04-11 18:14:47 +05:30
int col = 0;
FILE *fp = stdout;
2007-04-11 18:14:47 +05:30
va_list apc;
if (fmt && retval != 0) {
va_copy (apc, ap);
if (strcmp (cmd, "ewend") == 0) {
col = _ewarnvn (fmt, apc);
fp = stdout;
} else {
col = _eerrorvn (fmt, apc);
fp = stderr;
}
2007-08-01 17:03:07 +05:30
col += fprintf (fp, "\n");
2007-04-11 18:14:47 +05:30
va_end (apc);
}
_eend (fp, col,
retval == 0 ? ECOLOR_GOOD : ECOLOR_BAD,
2007-04-17 15:02:18 +05:30
retval == 0 ? OK : NOT_OK);
2007-04-11 18:14:47 +05:30
return (retval);
}
int eend (int retval, const char *fmt, ...)
{
2007-04-11 18:14:47 +05:30
va_list ap;
if (is_quiet ())
2007-04-11 18:14:47 +05:30
return (retval);
2007-04-11 18:14:47 +05:30
va_start (ap, fmt);
_do_eend ("eend", retval, fmt, ap);
va_end (ap);
2007-04-11 18:14:47 +05:30
return (retval);
}
hidden_def(eend)
2007-04-10 16:54:58 +05:30
int ewend (int retval, const char *fmt, ...)
{
2007-04-11 18:14:47 +05:30
va_list ap;
if (is_quiet ())
2007-04-11 18:14:47 +05:30
return (retval);
2007-04-11 18:14:47 +05:30
va_start (ap, fmt);
_do_eend ("ewend", retval, fmt, ap);
va_end (ap);
2007-04-11 18:14:47 +05:30
return (retval);
}
hidden_def(ewend)
void ebracket (int col, einfo_color_t color, const char *msg)
{
_eend (stdout, col, color, msg);
}
hidden_def(ebracket)
void eindent (void)
{
char *env = getenv ("EINFO_INDENT");
2007-04-11 18:14:47 +05:30
int amount = 0;
char num[10];
2007-04-11 18:14:47 +05:30
if (env) {
errno = 0;
amount = strtol (env, NULL, 0);
if (errno != 0)
amount = 0;
}
2007-04-11 18:14:47 +05:30
amount += INDENT_WIDTH;
if (amount > INDENT_MAX)
amount = INDENT_MAX;
2007-04-11 18:14:47 +05:30
snprintf (num, 10, "%08d", amount);
setenv ("EINFO_INDENT", num, 1);
}
hidden_def(eindent)
void eoutdent (void)
{
char *env = getenv ("EINFO_INDENT");
2007-04-11 18:14:47 +05:30
int amount = 0;
char num[10];
2007-04-11 18:14:47 +05:30
if (! env)
return;
2007-04-10 16:54:58 +05:30
2007-04-11 18:14:47 +05:30
errno = 0;
amount = strtol (env, NULL, 0);
if (errno != 0)
amount = 0;
else
amount -= INDENT_WIDTH;
2007-04-11 18:14:47 +05:30
if (amount <= 0)
unsetenv ("EINFO_EINDENT");
2007-04-11 18:14:47 +05:30
else {
snprintf (num, 10, "%08d", amount);
setenv ("EINFO_EINDENT", num, 1);
2007-04-11 18:14:47 +05:30
}
}
hidden_def(eoutdent)
int einfovn (const char *fmt, ...)
{
2007-04-11 18:14:47 +05:30
int retval;
va_list ap;
if (! fmt || ! is_verbose ())
2007-04-11 18:14:47 +05:30
return (0);
2007-04-11 18:14:47 +05:30
va_start (ap, fmt);
retval = _einfovn (fmt, ap);
2007-04-11 18:14:47 +05:30
va_end (ap);
2007-04-11 18:14:47 +05:30
return (retval);
}
hidden_def(einfovn)
int ewarnvn (const char *fmt, ...)
{
2007-04-11 18:14:47 +05:30
int retval;
va_list ap;
if (! fmt || ! is_verbose ())
2007-04-11 18:14:47 +05:30
return (0);
2007-04-10 16:54:58 +05:30
2007-04-11 18:14:47 +05:30
va_start (ap, fmt);
retval = _ewarnvn (fmt, ap);
2007-04-11 18:14:47 +05:30
va_end (ap);
2007-04-11 18:14:47 +05:30
return (retval);
}
hidden_def(ewarnvn)
int einfov (const char *fmt, ...)
{
2007-04-11 18:14:47 +05:30
int retval;
va_list ap;
if (! fmt || ! is_verbose ())
2007-04-11 18:14:47 +05:30
return (0);
2007-04-11 18:14:47 +05:30
va_start (ap, fmt);
retval = _einfovn (fmt, ap);
retval += printf ("\n");
2007-04-11 18:14:47 +05:30
va_end (ap);
2007-04-11 18:14:47 +05:30
return (retval);
}
hidden_def(einfov)
int ewarnv (const char *fmt, ...)
{
2007-04-11 18:14:47 +05:30
int retval;
va_list ap;
if (! fmt || ! is_verbose ())
2007-04-11 18:14:47 +05:30
return (0);
2007-04-11 18:14:47 +05:30
va_start (ap, fmt);
retval = _ewarnvn (fmt, ap);
retval += printf ("\n");
2007-04-11 18:14:47 +05:30
va_end (ap);
2007-04-11 18:14:47 +05:30
return (retval);
}
hidden_def(ewarnv)
int ebeginv (const char *fmt, ...)
{
2007-04-11 18:14:47 +05:30
int retval;
va_list ap;
if (! fmt || ! is_verbose ())
2007-04-11 18:14:47 +05:30
return (0);
2007-04-11 18:14:47 +05:30
va_start (ap, fmt);
retval = _einfovn (fmt, ap);
retval += printf (" ...");
if (colour_terminal (stdout))
retval += printf ("\n");
2007-04-11 18:14:47 +05:30
va_end (ap);
2007-04-11 18:14:47 +05:30
return (retval);
}
hidden_def(ebeginv)
int eendv (int retval, const char *fmt, ...)
{
2007-04-11 18:14:47 +05:30
va_list ap;
if (! is_verbose ())
return (0);
2007-04-11 18:14:47 +05:30
va_start (ap, fmt);
_do_eend ("eendv", retval, fmt, ap);
va_end (ap);
2007-04-11 18:14:47 +05:30
return (retval);
}
hidden_def(eendv)
int ewendv (int retval, const char *fmt, ...)
{
2007-04-11 18:14:47 +05:30
va_list ap;
if (! is_verbose ())
return (0);
2007-04-11 18:14:47 +05:30
va_start (ap, fmt);
_do_eend ("ewendv", retval, fmt, ap);
va_end (ap);
2007-04-11 18:14:47 +05:30
return (retval);
}
hidden_def(ewendv)
void eindentv (void)
{
if (is_verbose ())
2007-04-11 18:14:47 +05:30
eindent ();
}
hidden_def(eindentv)
void eoutdentv (void)
{
if (is_verbose ())
2007-04-11 18:14:47 +05:30
eoutdent ();
}
hidden_def(eoutdentv)