/*
 * Written by Cort Dougan to replace the version originally used
 * by Paul Mackerras, which came from NetBSD and thus had copyright
 * conflicts with Linux.
 *
 * This file makes liberal use of the standard linux utility
 * routines to reduce the size of the binary.  We assume we can
 * trust some parts of Linux inside the debugger.
 *   -- Cort (cort@cs.nmt.edu)
 *
 * Copyright (C) 1999 Cort Dougan.
 */

#include <linux/kernel.h>
#include <linux/string.h>
#include <stdarg.h>
#include "nonstdio.h"

extern int xmon_write(void *, void *, int);

void
xmon_vfprintf(void *f, const char *fmt, va_list ap)
{
	static char xmon_buf[2048];
	int n;

	n = vsprintf(xmon_buf, fmt, ap);
	xmon_write(f, xmon_buf, n);
}

void
xmon_printf(const char *fmt, ...)
{
	va_list ap;

	va_start(ap, fmt);
	xmon_vfprintf(stdout, fmt, ap);
	va_end(ap);
}

void
xmon_fprintf(void *f, const char *fmt, ...)
{
	va_list ap;

	va_start(ap, fmt);
	xmon_vfprintf(f, fmt, ap);
	va_end(ap);
}

void
xmon_puts(char *s)
{
	xmon_write(stdout, s, strlen(s));
}
