diff options
| author | Josh Blum <josh@joshknows.com> | 2011-01-19 22:23:46 -0800 | 
|---|---|---|
| committer | Josh Blum <josh@joshknows.com> | 2011-01-19 22:23:46 -0800 | 
| commit | 9239878b0b81c3a368bf11cfc2fe48bfb05ff902 (patch) | |
| tree | f41a5e58eac89b35cb99537a0a0b64662384a9f2 /firmware/zpu/lib/printf.c.smaller | |
| parent | fc138381ee4bd8d191795230b7447071a85e1f28 (diff) | |
| parent | 7d918c5f6acc9a5d2c8ae03e2e67b403f7efd5ff (diff) | |
| download | uhd-9239878b0b81c3a368bf11cfc2fe48bfb05ff902.tar.gz uhd-9239878b0b81c3a368bf11cfc2fe48bfb05ff902.tar.bz2 uhd-9239878b0b81c3a368bf11cfc2fe48bfb05ff902.zip | |
Merge branch 'next'
Conflicts:
	host/lib/usrp/usrp2/codec_impl.cpp
Diffstat (limited to 'firmware/zpu/lib/printf.c.smaller')
| -rw-r--r-- | firmware/zpu/lib/printf.c.smaller | 134 | 
1 files changed, 134 insertions, 0 deletions
| diff --git a/firmware/zpu/lib/printf.c.smaller b/firmware/zpu/lib/printf.c.smaller new file mode 100644 index 000000000..4d858648d --- /dev/null +++ b/firmware/zpu/lib/printf.c.smaller @@ -0,0 +1,134 @@ +/* -*- c -*- */ +/* + * Copyright 2007 Free Software Foundation, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +/* + * Based on code from the SDCC z80 library ;) + */ + +#include <stdarg.h> +#include <stdio.h> +#include <hal_io.h>		/* FIXME refactor into stdio */ + +#define PUTCHAR(x) hal_putc(x) + + +static void  +_printn(unsigned u, unsigned base, char issigned) +{ +  const char *_hex = "0123456789ABCDEF"; +  if (issigned && ((int)u < 0)) { +    PUTCHAR('-'); +    u = (unsigned)-((int)u); +  } +  if (u >= base) +    _printn(u/base, base, 0); +  PUTCHAR(_hex[u%base]); +} + +static void  +_printf(const char *format, va_list va) +{ +  while (*format) { +    if (*format != '%') +      PUTCHAR(*format); +    else { +      switch (*++format) { +      case 0:			/* hit end of format string */ +	return; +      case 'c': +	{ +	  char c = (char)va_arg(va, int); +	  PUTCHAR(c); +	  break; +	} +      case 'u': +	{ +	  unsigned u = va_arg(va, unsigned); +	  _printn(u, 10, 0); +	  break; +	} +      case 'd': +	{ +	  unsigned u = va_arg(va, unsigned); +	  _printn(u, 10, 1); +	  break; +	} +      case 'x': +      case 'p': +	{ +	  unsigned u = va_arg(va, unsigned); +	  _printn(u, 16, 0); +	  break; +	} +      case 's': +	{ +	  char *s = va_arg(va, char *); +	  while (*s) { +	    PUTCHAR(*s); +	    s++; +	  } +	  break; +	} +      } +    } +    format++; +  } +} + +#if 0 +static void  +_char_emitter(char c, void *pData __attribute__((unused))) +{ +  hal_putc(c); +} +#endif + +int  +printf(const char *format, ...) +{ +  va_list va; +  va_start(va, format); + +  _printf(format, va); + +  // wrong return value... +  return 0; +} + + +#if 0 + +// Totally dangerous.  Don't use +static void  +_buf_emitter(char c, void *pData) +{ +  *((*((char **)pData)))++ = c; +} + +int sprintf(char *pInto, const char *format, ...) +{ +  va_list va; +  va_start(va, format); + +  _printf(format, _buf_emitter, &pInto, va); +  *pInto++ = '\0'; + +  // FIXME wrong return value +  return 0; +} +#endif | 
