1/* $NetBSD$ */ 2/*- 3 * Copyright (c) 1998 Robert Nordier 4 * All rights reserved. 5 * Copyright (c) 2006 M. Warner Losh 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms are freely 9 * permitted provided that the above copyright notice and this 10 * paragraph and the following disclaimer are duplicated in all 11 * such forms. 12 * 13 * This software is provided "AS IS" and without any express or 14 * implied warranties, including, without limitation, the implied 15 * warranties of merchantability and fitness for a particular 16 * purpose. 17 * 18 * $FreeBSD: src/sys/boot/mips/emips/libemips/printf.c,v 1.2 2006/10/20 09:12:05 imp Exp $ 19 */ 20 21#include <lib/libsa/stand.h> 22 23void 24xputchar(int ch) 25{ 26 if (ch == '\n') 27 putchar('\r'); 28 putchar(ch); 29} 30 31void 32printf(const char *fmt,...) 33{ 34 va_list ap; 35 const char *hex = "0123456789abcdef"; 36 char buf[10]; 37 char *s; 38 unsigned u; 39 int c; 40 41 va_start(ap, fmt); 42 while ((c = *fmt++)) { 43 if (c == '%') { 44 again: 45 c = *fmt++; 46 switch (c) { 47 case 'l': 48 goto again; 49 case 'c': 50 xputchar(va_arg(ap, int)); 51 continue; 52 case 's': 53 for (s = va_arg(ap, char *); s && *s; s++) 54 xputchar(*s); 55 continue; 56 case 'd': /* A lie, always prints unsigned */ 57 case 'u': 58 u = va_arg(ap, unsigned); 59 s = buf; 60 do 61 *s++ = '0' + u % 10U; 62 while (u /= 10U); 63 dumpbuf:; 64 while (--s >= buf) 65 xputchar(*s); 66 continue; 67 case 'x': 68 case 'p': 69 u = va_arg(ap, unsigned); 70 s = buf; 71 do 72 *s++ = hex[u & 0xfu]; 73 while (u >>= 4); 74 goto dumpbuf; 75 case 0: 76 return; 77 } 78 } 79 xputchar(c); 80 } 81 va_end(ap); 82 83 return; 84} 85