summaryrefslogtreecommitdiff
path: root/kern/printf.c
diff options
context:
space:
mode:
Diffstat (limited to 'kern/printf.c')
-rw-r--r--kern/printf.c112
1 files changed, 52 insertions, 60 deletions
diff --git a/kern/printf.c b/kern/printf.c
index a3a771d0..50f23623 100644
--- a/kern/printf.c
+++ b/kern/printf.c
@@ -126,17 +126,17 @@
#define isdigit(d) ((d) >= '0' && (d) <= '9')
#define Ctod(c) ((c) - '0')
-#define MAXBUF (sizeof(long int) * 8) /* enough for binary */
+#define MAXBUF (sizeof(long long int) * 8) /* enough for binary */
void printnum(
- register unsigned long u,
- register int base,
+ unsigned long long u,
+ int base,
void (*putc)( char, vm_offset_t ),
vm_offset_t putc_arg)
{
char buf[MAXBUF]; /* build number here */
- register char * p = &buf[MAXBUF-1];
+ char * p = &buf[MAXBUF-1];
static char digs[] = "0123456789abcdef";
do {
@@ -151,23 +151,8 @@ void printnum(
boolean_t _doprnt_truncates = FALSE;
-/* printf could be called at _any_ point during system initialization,
- including before printf_init() gets called from the "normal" place
- in kern/startup.c. */
-boolean_t _doprnt_lock_initialized = FALSE;
-decl_simple_lock_data(,_doprnt_lock)
-
-void printf_init(void)
-{
- if (!_doprnt_lock_initialized)
- {
- _doprnt_lock_initialized = TRUE;
- simple_lock_init(&_doprnt_lock);
- }
-}
-
void _doprnt(
- register const char *fmt,
+ const char *fmt,
va_list argp,
/* character output routine */
void (*putc)( char, vm_offset_t),
@@ -178,29 +163,14 @@ void _doprnt(
int prec;
boolean_t ladjust;
char padc;
- long n;
- unsigned long u;
+ long long n;
+ unsigned long long u;
+ int have_long_long;
int plus_sign;
int sign_char;
boolean_t altfmt, truncate;
int base;
- register char c;
-
- printf_init();
-
-#if 0
- /* Make sure that we get *some* printout, no matter what */
- simple_lock(&_doprnt_lock);
-#else
- {
- register int i = 0;
- while (i < 1*1024*1024) {
- if (simple_lock_try(&_doprnt_lock))
- break;
- i++;
- }
- }
-#endif
+ char c;
while ((c = *fmt) != '\0') {
if (c != '%') {
@@ -218,6 +188,7 @@ void _doprnt(
plus_sign = 0;
sign_char = 0;
altfmt = FALSE;
+ have_long_long = FALSE;
while (TRUE) {
c = *fmt;
@@ -276,6 +247,10 @@ void _doprnt(
if (c == 'l')
c = *++fmt; /* need it if sizeof(int) < sizeof(long) */
+ if (c == 'l') {
+ c = *++fmt; /* handle `long long' */
+ have_long_long = TRUE;
+ }
truncate = FALSE;
@@ -283,11 +258,14 @@ void _doprnt(
case 'b':
case 'B':
{
- register char *p;
- boolean_t any;
- register int i;
-
- u = va_arg(argp, unsigned long);
+ char *p;
+ boolean_t any;
+ int i;
+
+ if (! have_long_long)
+ u = va_arg(argp, unsigned long);
+ else
+ u = va_arg(argp, unsigned long long);
p = va_arg(argp, char *);
base = *p++;
printnum(u, base, putc, putc_arg);
@@ -302,7 +280,7 @@ void _doprnt(
/*
* Bit field
*/
- register int j;
+ int j;
if (any)
(*putc)(',', putc_arg);
else {
@@ -342,8 +320,8 @@ void _doprnt(
case 's':
{
- register char *p;
- register char *p2;
+ char *p;
+ char *p2;
if (prec == -1)
prec = 0x7fffffff; /* MAXINT */
@@ -431,7 +409,10 @@ void _doprnt(
goto print_unsigned;
print_signed:
- n = va_arg(argp, long);
+ if (! have_long_long)
+ n = va_arg(argp, long);
+ else
+ n = va_arg(argp, long long);
if (n >= 0) {
u = n;
sign_char = plus_sign;
@@ -443,13 +424,16 @@ void _doprnt(
goto print_num;
print_unsigned:
- u = va_arg(argp, unsigned long);
+ if (! have_long_long)
+ u = va_arg(argp, unsigned long);
+ else
+ u = va_arg(argp, unsigned long long);
goto print_num;
print_num:
{
char buf[MAXBUF]; /* build number here */
- register char * p = &buf[MAXBUF-1];
+ char * p = &buf[MAXBUF-1];
static char digits[] = "0123456789abcdef";
char *prefix = 0;
@@ -507,8 +491,6 @@ void _doprnt(
}
fmt++;
}
-
- simple_unlock(&_doprnt_lock);
}
/*
@@ -540,7 +522,7 @@ int indent = 0;
void iprintf(const char *fmt, ...)
{
va_list listp;
- register int i;
+ int i;
for (i = indent; i > 0; ){
if (i >= 8) {
@@ -567,8 +549,8 @@ sputc(
char c,
vm_offset_t arg)
{
- register char **bufp = (char **) arg;
- register char *p = *bufp;
+ char **bufp = (char **) arg;
+ char *p = *bufp;
*p++ = c;
*bufp = p;
}
@@ -615,13 +597,23 @@ vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
return cookie.index;
}
+int
+snprintf(char *buf, size_t size, const char *fmt, ...)
+{
+ int written;
+ va_list listp;
+ va_start(listp, fmt);
+ written = vsnprintf(buf, size, fmt, listp);
+ va_end(listp);
+ return written;
+}
-void safe_gets(str, maxlen)
- char *str;
- int maxlen;
+void safe_gets(
+ char *str,
+ int maxlen)
{
- register char *lp;
- register int c;
+ char *lp;
+ int c;
char *strmax = str + maxlen - 1; /* allow space for trailing 0 */
lp = str;