diff options
author | Jeff Johnston <jjohnstn@redhat.com> | 2012-02-21 22:34:31 +0000 |
---|---|---|
committer | Jeff Johnston <jjohnstn@redhat.com> | 2012-02-21 22:34:31 +0000 |
commit | 9edde1d2c4430fd79bbf494d5e8cec0359a0b267 (patch) | |
tree | 544ea7ed1bab2481a081af5e71beba6f501233c8 /newlib/libc/sys/epiphany/e_printf.c | |
parent | 801bf9f27287a43eb9aaafe0c0f2dfac08455532 (diff) | |
download | cygnal-9edde1d2c4430fd79bbf494d5e8cec0359a0b267.tar.gz cygnal-9edde1d2c4430fd79bbf494d5e8cec0359a0b267.tar.bz2 cygnal-9edde1d2c4430fd79bbf494d5e8cec0359a0b267.zip |
2012-02-21 Jeremy Bennett <jeremy.bennett@embecosm.com>
Alan Lehotsky <apl@alum.mit.edu>
Joern Rennecke <joern.rennecke@embecosm.com>
* configure.host: Add Epiphany support.
* libc/include/machine/ieeefp.h: Likewise.
* libc/include/machine/setjmp.h: Likewise.
* libc/machine/configure.in, libc/sys/configure.in: Likewise.
* libc/machine/configure, libc/sys/configure: Regenerate.
* libc/machine/epiphany, libc/sys/epiphany: New directories.
* NEWS: Mention addition of Epiphany.
Diffstat (limited to 'newlib/libc/sys/epiphany/e_printf.c')
-rw-r--r-- | newlib/libc/sys/epiphany/e_printf.c | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/newlib/libc/sys/epiphany/e_printf.c b/newlib/libc/sys/epiphany/e_printf.c new file mode 100644 index 000000000..a93c34320 --- /dev/null +++ b/newlib/libc/sys/epiphany/e_printf.c @@ -0,0 +1,150 @@ +/* e_printf.c + + Copyright (c) 2011, Adapteva, Inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Adapteva nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. */ +#include <stdarg.h> +#include <string.h> + + + + +int trap_7( char *s , int _bsize, int _argsize) { + volatile register void* buff_adrr asm("r0") = s; + volatile register unsigned bsize asm("r1") = _bsize; + volatile register unsigned argsize asm("r2") = _argsize; + volatile register int result asm("r0"); + __asm__ __volatile__ ("trap 7" : "=r" (result) : "r" (buff_adrr), "r" (bsize) , "r" (argsize)); + return result; + +} + +//#include <stdio.h> +//#include <string.h> +//#include <stdlib.h> + +volatile static int*fp_int =0; +volatile int getIntFromFloat(float *f) { + fp_int= (int*)f; + + return *fp_int; +} + + +int e_printf(const char *fmt, ...) { + + char buf[256],*p,*fmt_p; + va_list args; + int percentMet=0; + int pos = 0; + + char *v_arg_s; + unsigned v_arg_int; + float fl_f[1]; + + unsigned fmt_len = strnlen(fmt,128); + + fmt_p = (char*)fmt; + + //printf("---- 111 +++ %d \n", strlen(fmt)); + + va_start(args, fmt); + + p = (char*)buf; + + strcpy(buf,fmt); + pos =fmt_len; + p[pos] = '\0'; + pos++; + + va_start(args, fmt); + + while (*fmt_p) { + +// putchar(*p); +// puts(""); + + if(*fmt_p == '%') { + percentMet=1; + } + if(*fmt_p == 's' && percentMet == 1 ) { + percentMet=0; + v_arg_s = va_arg(args, char *); + if (!v_arg_s) v_arg_s = "<NULL>"; + + strcpy(p + pos , v_arg_s ); + pos+=strlen(v_arg_s); + + p[pos] = '\0'; + pos++; + } + + if((*fmt_p == 'i' || *fmt_p == 'd' || *fmt_p == 'u' || *fmt_p == 'x' || *fmt_p == 'f' ) && percentMet == 1 ) { + percentMet=0; + if(*fmt_p == 'f' ) { + fl_f[0] = (float)va_arg(args, double); + //printf("v_arg_ float --- %f \n", fl_f[0]); + //printf("v_arg_ p --- %x \n", *( (unsigned *)fl_f)); + + v_arg_int = getIntFromFloat (fl_f); + + //v_arg_int = 0; + + } else { + v_arg_int = (int)va_arg(args, int); + } + +// if(*fmt_p == 'd') { +// printf("v_arg_int --- %d \n", v_arg_int); +// } +// if(*fmt_p == 'x') { +// printf("v_arg_int --- %x \n", v_arg_int); +// } +// if(*fmt_p == 'f') { +// printf("fff++v_arg_int --- %x \n", v_arg_int); +// fl = (float*)&v_arg_int; +// printf("fff++ v_arg_float --- %f \n", *fl); +// } + + *(p + pos) = ((v_arg_int>>24) & 0xff); + pos++; + *(p + pos) = ((v_arg_int>>16) & 0xff); + pos++; + *(p + pos) = ((v_arg_int>>8) & 0xff); + pos++; + *(p + pos) = ((v_arg_int>>0) & 0xff); + pos++; + } + + fmt_p++; + } + + va_end(args); + + //printf(" +++ %d %d \n" , strlen(fmt), pos); + + return trap_7((char*)buf ,fmt_len, pos) ; + //return 1; +} |