151 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
	
| /* 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;
 | |
| }
 |