aboutsummaryrefslogtreecommitdiff
path: root/sys/ddb
diff options
context:
space:
mode:
Diffstat (limited to 'sys/ddb')
-rw-r--r--sys/ddb/db_output.c102
1 files changed, 87 insertions, 15 deletions
diff --git a/sys/ddb/db_output.c b/sys/ddb/db_output.c
index 531fef8f2c17..c5e2c616a8b5 100644
--- a/sys/ddb/db_output.c
+++ b/sys/ddb/db_output.c
@@ -47,6 +47,13 @@ __FBSDID("$FreeBSD$");
#include <ddb/ddb.h>
#include <ddb/db_output.h>
+struct dbputchar_arg {
+ size_t da_nbufr;
+ size_t da_remain;
+ char *da_pbufr;
+ char *da_pnext;
+};
+
/*
* Character output - tracks position in line.
* To do this correctly, we should know how wide
@@ -73,6 +80,8 @@ static int ddb_use_printf = 0;
SYSCTL_INT(_debug, OID_AUTO, ddb_use_printf, CTLFLAG_RW, &ddb_use_printf, 0,
"use printf for all ddb output");
+static void db_putc(int c);
+static void db_puts(const char *str);
static void db_putchar(int c, void *arg);
static void db_pager(void);
@@ -107,9 +116,34 @@ db_force_whitespace()
* Output character. Buffer whitespace.
*/
static void
-db_putchar(c, arg)
- int c; /* character to output */
- void * arg;
+db_putchar(int c, void *arg)
+{
+ struct dbputchar_arg *dap = arg;
+
+ if (dap->da_pbufr == NULL) {
+
+ /* No bufferized output is provided. */
+ db_putc(c);
+ } else {
+
+ *dap->da_pnext++ = c;
+ dap->da_remain--;
+
+ /* Leave always the buffer 0 terminated. */
+ *dap->da_pnext = '\0';
+
+ /* Check if the buffer needs to be flushed. */
+ if (dap->da_remain < 2 || c == '\n') {
+ db_puts(dap->da_pbufr);
+ dap->da_pnext = dap->da_pbufr;
+ dap->da_remain = dap->da_nbufr;
+ *dap->da_pnext = '\0';
+ }
+ }
+}
+
+static void
+db_putc(int c)
{
/*
@@ -180,6 +214,15 @@ db_putchar(c, arg)
/* other characters are assumed non-printing */
}
+static void
+db_puts(const char *str)
+{
+ int i;
+
+ for (i = 0; str[i] != '\0'; i++)
+ db_putc(str[i]);
+}
+
/*
* Turn on the pager.
*/
@@ -272,30 +315,43 @@ db_print_position()
* Printing
*/
void
-#if __STDC__
db_printf(const char *fmt, ...)
-#else
-db_printf(fmt)
- const char *fmt;
-#endif
{
+#ifdef DDB_BUFR_SIZE
+ char bufr[DDB_BUFR_SIZE];
+#endif
+ struct dbputchar_arg dca;
va_list listp;
+#ifdef DDB_BUFR_SIZE
+ dca.da_pbufr = bufr;
+ dca.da_pnext = dca.da_pbufr;
+ dca.da_nbufr = sizeof(bufr);
+ dca.da_remain = sizeof(bufr);
+ *dca.da_pnext = '\0';
+#else
+ dca.da_pbufr = NULL;
+#endif
+
va_start(listp, fmt);
- kvprintf (fmt, db_putchar, NULL, db_radix, listp);
+ kvprintf (fmt, db_putchar, &dca, db_radix, listp);
va_end(listp);
+
+#ifdef DDB_BUFR_SIZE
+ if (*dca.da_pbufr != '\0')
+ db_puts(dca.da_pbufr);
+#endif
}
int db_indent;
void
-#if __STDC__
db_iprintf(const char *fmt,...)
-#else
-db_iprintf(fmt)
- const char *fmt;
-#endif
{
+#ifdef DDB_BUFR_SIZE
+ char bufr[DDB_BUFR_SIZE];
+#endif
+ struct dbputchar_arg dca;
register int i;
va_list listp;
@@ -303,9 +359,25 @@ db_iprintf(fmt)
db_printf("\t");
while (--i >= 0)
db_printf(" ");
+
+#ifdef DDB_BUFR_SIZE
+ dca.da_pbufr = bufr;
+ dca.da_pnext = dca.da_pbufr;
+ dca.da_nbufr = sizeof(bufr);
+ dca.da_remain = sizeof(bufr);
+ *dca.da_pnext = '\0';
+#else
+ dca.da_pbufr = NULL;
+#endif
+
va_start(listp, fmt);
- kvprintf (fmt, db_putchar, NULL, db_radix, listp);
+ kvprintf (fmt, db_putchar, &dca, db_radix, listp);
va_end(listp);
+
+#ifdef DDB_BUFR_SIZE
+ if (*dca.da_pbufr != '\0')
+ db_puts(dca.da_pbufr);
+#endif
}
/*