Prex Home / Browse Source - Prex Version: 0.9.0

root/bsp/boot/common/printf.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. printf

   1 /*-
   2  * Copyright (c) 2005, Kohsuke Ohtani
   3  * All rights reserved.
   4  *
   5  * Redistribution and use in source and binary forms, with or without
   6  * modification, are permitted provided that the following conditions
   7  * are met:
   8  * 1. Redistributions of source code must retain the above copyright
   9  *    notice, this list of conditions and the following disclaimer.
  10  * 2. Redistributions in binary form must reproduce the above copyright
  11  *    notice, this list of conditions and the following disclaimer in the
  12  *    documentation and/or other materials provided with the distribution.
  13  * 3. Neither the name of the author nor the names of any co-contributors
  14  *    may be used to endorse or promote products derived from this software
  15  *    without specific prior written permission.
  16  *
  17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  27  * SUCH DAMAGE.
  28  */
  29 
  30 /*
  31  * printf.c - print formatted string
  32  */
  33 
  34 #include <sys/types.h>
  35 #include <machine/stdarg.h>
  36 #include <boot.h>
  37 #include <machdep.h>    /* for debug_putc */
  38 
  39 #ifdef DEBUG
  40 
  41 void
  42 printf(const char *fmt, ...)
  43 {
  44         static const char digits[] = "0123456789abcdef";
  45         va_list ap;
  46         char buf[10];
  47         char *s;
  48         unsigned u;
  49         int c, i, pad;
  50 
  51         va_start(ap, fmt);
  52         while ((c = *fmt++) != 0) {
  53                 if (c == '%') {
  54                         c = *fmt++;
  55                         /* ignore long */
  56                         if (c == 'l')
  57                                 c = *fmt++;
  58                         switch (c) {
  59                         case 'c':
  60                                 debug_putc(va_arg(ap, int));
  61                                 continue;
  62                         case 's':
  63                                 s = va_arg(ap, char *);
  64                                 if (s == NULL)
  65                                         s = "<NULL>";
  66                                 for (; *s; s++) {
  67                                         debug_putc((int)*s);
  68                                 }
  69                                 continue;
  70                         case 'd':
  71                                 c = 'u';
  72                         case 'u':
  73                         case 'x':
  74                                 u = va_arg(ap, unsigned);
  75                                 s = buf;
  76                                 if (c == 'u') {
  77                                         do
  78                                                 *s++ = digits[u % 10U];
  79                                         while (u /= 10U);
  80                                 } else {
  81                                         pad = 0;
  82                                         for (i = 0; i < 8; i++) {
  83                                                 if (pad)
  84                                                         *s++ = '0';
  85                                                 else {
  86                                                         *s++ = digits[u % 16U];
  87                                                         if ((u /= 16U) == 0)
  88                                                                 pad = 1;
  89                                                 }
  90                                         }
  91                                 }
  92                                 while (--s >= buf)
  93                                         debug_putc((int)*s);
  94                                 continue;
  95                         }
  96                 }
  97                 if (c == '\n')
  98                         debug_putc('\r');
  99                 debug_putc((int)c);
 100         }
 101         va_end(ap);
 102 }
 103 
 104 #endif /* !DEBUG */

/* [<][>][^][v][top][bottom][index][help] */