summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/i386/shared/io/printk.c
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1998-08-05 16:51:39 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1998-08-05 16:51:39 +0000
commitbd8c8b2a855f3219e3c4c73c9e67eb4bd6d473d7 (patch)
treed9f1b7bf8ee4865c1e485e2b161c5709e2b6b75d /c/src/lib/libbsp/i386/shared/io/printk.c
parentchanged load address (diff)
downloadrtems-bd8c8b2a855f3219e3c4c73c9e67eb4bd6d473d7.tar.bz2
Patch from Eric Valette <valette@crf.canon.fr> which brings the i386ex BSP
inline with the new IRQ structure.
Diffstat (limited to '')
-rw-r--r--c/src/lib/libbsp/i386/shared/io/printk.c99
1 files changed, 99 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/i386/shared/io/printk.c b/c/src/lib/libbsp/i386/shared/io/printk.c
new file mode 100644
index 0000000000..c34b20e730
--- /dev/null
+++ b/c/src/lib/libbsp/i386/shared/io/printk.c
@@ -0,0 +1,99 @@
+/*-------------------------------------------------------------------------+
+| printk.c v1.1 - PC386 BSP - 1997/08/07
++--------------------------------------------------------------------------+
+| (C) Copyright 1997 -
+| - NavIST Group - Real-Time Distributed Systems and Industrial Automation
+|
+| http://pandora.ist.utl.pt
+|
+| Instituto Superior Tecnico * Lisboa * PORTUGAL
++--------------------------------------------------------------------------+
+| Disclaimer:
+|
+| This file is provided "AS IS" without warranty of any kind, either
+| expressed or implied.
++--------------------------------------------------------------------------+
+| This code is based on code by: Jose Rufino - IST
+|
+| $Id$
++--------------------------------------------------------------------------*/
+
+
+#include <stdarg.h>
+
+#include <bspIo.h>
+
+/*-------------------------------------------------------------------------+
+| Function: printNum
+| Description: print number in a given base.
+| Global Variables: None.
+| Arguments: num - number to print, base - base used to print the number.
+| Returns: Nothing.
++--------------------------------------------------------------------------*/
+static void
+printNum(long int num, int base)
+{
+ long int n;
+
+ if ((n = num / base) > 0)
+ printNum(n, base);
+ BSP_output_char("0123456789ABCDEF"[(int)(num % base)]);
+} /* printNum */
+
+
+/*-------------------------------------------------------------------------+
+| Function: printk
+| Description: a simplified version of printf intended for use when the
+ console is not yet initialized or in ISR's.
+| Global Variables: None.
+| Arguments: as in printf: fmt - format string, ... - unnamed arguments.
+| Returns: Nothing.
++--------------------------------------------------------------------------*/
+void
+printk(char *fmt, ...)
+{
+ va_list ap; /* points to each unnamed argument in turn */
+ char c, *str;
+ int lflag, base;
+
+ va_start(ap, fmt); /* make ap point to 1st unnamed arg */
+ for (; *fmt != '\0'; fmt++)
+ {
+ lflag = 0;
+ base = 0;
+ if (*fmt == '%')
+ {
+ if ((c = *++fmt) == 'l')
+ {
+ lflag = 1;
+ c = *++fmt;
+ }
+ switch (c)
+ {
+ case 'o': case 'O': base = 8; break;
+ case 'd': case 'D': base = 10; break;
+ case 'x': case 'X': base = 16; break;
+ case 's':
+ for (str = va_arg(ap, char *); *str; str++)
+ BSP_output_char(*str);
+ break;
+ case 'c':
+ BSP_output_char(va_arg(ap, char));
+ break;
+ default:
+ BSP_output_char(c);
+ break;
+ } /* switch*/
+
+ if (base)
+ printNum(lflag ? va_arg(ap, long int) : (long int)va_arg(ap, int),
+ base);
+ }
+ else
+ {
+ BSP_output_char(*fmt);
+ }
+ }
+ va_end(ap); /* clean up when done */
+} /* printk */
+