does not work yet.. sorry :-( git-svn-id: svn://svn.coreboot.org/coreboot/trunk@1119 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
		
			
				
	
	
		
			171 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			171 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* lib.c
 | 
						|
 * tag: simple function library
 | 
						|
 *
 | 
						|
 * Copyright (C) 2003 Stefan Reinauer
 | 
						|
 *
 | 
						|
 * See the file "COPYING" for further information about
 | 
						|
 * the copyright and warranty status of this work.
 | 
						|
 */
 | 
						|
 | 
						|
#include <stdarg.h>
 | 
						|
#include <string.h>
 | 
						|
#include "types.h"
 | 
						|
 | 
						|
int putchar(int c);
 | 
						|
 | 
						|
/* ****************************************************************** */
 | 
						|
 | 
						|
/* Convert the integer D to a string and save the string in BUF. If
 | 
						|
 * BASE is equal to 'd', interpret that D is decimal, and if BASE is
 | 
						|
 * equal to 'x', interpret that D is hexadecimal.  
 | 
						|
 */
 | 
						|
 | 
						|
static void itoa(char *buf, int base, int d)
 | 
						|
{
 | 
						|
	char *p = buf;
 | 
						|
	char *p1, *p2;
 | 
						|
	unsigned long ud = d;
 | 
						|
	int divisor = 10;
 | 
						|
 | 
						|
	/* If %d is specified and D is minus, put `-' in the head.  */
 | 
						|
	if (base == 'd' && d < 0) {
 | 
						|
		*p++ = '-';
 | 
						|
		buf++;
 | 
						|
		ud = -d;
 | 
						|
	} else if (base == 'x')
 | 
						|
		divisor = 16;
 | 
						|
 | 
						|
	/* Divide UD by DIVISOR until UD == 0.  */
 | 
						|
	do {
 | 
						|
		int remainder = ud % divisor;
 | 
						|
 | 
						|
		*p++ =
 | 
						|
		    (remainder <
 | 
						|
		     10) ? remainder + '0' : remainder + 'a' - 10;
 | 
						|
	}
 | 
						|
	while (ud /= divisor);
 | 
						|
 | 
						|
	/* Terminate BUF.  */
 | 
						|
	*p = 0;
 | 
						|
 | 
						|
	/* Reverse BUF.  */
 | 
						|
	p1 = buf;
 | 
						|
	p2 = p - 1;
 | 
						|
	while (p1 < p2) {
 | 
						|
		char tmp = *p1;
 | 
						|
		*p1 = *p2;
 | 
						|
		*p2 = tmp;
 | 
						|
		p1++;
 | 
						|
		p2--;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/* Format a string and print it on the screen, just like the libc
 | 
						|
 * function printf. 
 | 
						|
 */
 | 
						|
void printk(const char *format, ...)
 | 
						|
{
 | 
						|
	va_list ap;
 | 
						|
	int c, d;
 | 
						|
	char buf[20];
 | 
						|
 | 
						|
	va_start(ap, format);
 | 
						|
	while ((c = *format++) != 0) {
 | 
						|
		char *p;
 | 
						|
		if (c != '%') {
 | 
						|
			putchar(c);
 | 
						|
			continue;
 | 
						|
		}
 | 
						|
 | 
						|
		c = *format++;
 | 
						|
		switch (c) {
 | 
						|
		case 'd':
 | 
						|
		case 'u':
 | 
						|
		case 'x':
 | 
						|
			d = va_arg(ap, int);
 | 
						|
			itoa(buf, c, d);
 | 
						|
			p = buf;
 | 
						|
			goto string;
 | 
						|
			break;
 | 
						|
 | 
						|
		case 's':
 | 
						|
			p = va_arg(ap, char *);
 | 
						|
			if (!p)
 | 
						|
				p = "(null)";
 | 
						|
 | 
						|
		      string:
 | 
						|
			while (*p)
 | 
						|
				putchar(*p++);
 | 
						|
			break;
 | 
						|
 | 
						|
		default:
 | 
						|
			putchar(va_arg(ap, int));
 | 
						|
			break;
 | 
						|
		}
 | 
						|
	}
 | 
						|
	va_end(ap);
 | 
						|
}
 | 
						|
 | 
						|
/* memset might be a macro or alike. Disable it to be sure */
 | 
						|
#undef memset
 | 
						|
 | 
						|
void *memset(void *s, int c, size_t count)
 | 
						|
{
 | 
						|
	char *xs = (char *) s;
 | 
						|
	while (count--)
 | 
						|
		*xs++ = c;
 | 
						|
	return s;
 | 
						|
}
 | 
						|
 | 
						|
void *memmove(void *dest, const void *src, size_t count)
 | 
						|
{
 | 
						|
	char *tmp, *s;
 | 
						|
	if (dest <= src) {
 | 
						|
		tmp = (char *) dest;
 | 
						|
		s = (char *) src;
 | 
						|
		while (count--)
 | 
						|
			*tmp++ = *s++;
 | 
						|
	} else {
 | 
						|
		tmp = (char *) dest + count;
 | 
						|
		s = (char *) src + count;
 | 
						|
		while (count--)
 | 
						|
			*--tmp = *--s;
 | 
						|
	}
 | 
						|
	return dest;
 | 
						|
}
 | 
						|
 | 
						|
#ifdef DEBUG_GDB
 | 
						|
void *memcpy(void *dest, const void *src, size_t count)
 | 
						|
{
 | 
						|
	char *tmp = (char *) dest, *s = (char *) src;
 | 
						|
 | 
						|
	while (count--)
 | 
						|
		*tmp++ = *s++;
 | 
						|
 | 
						|
	return dest;
 | 
						|
}
 | 
						|
 | 
						|
#undef strncmp
 | 
						|
int strncmp(const char *cs, const char *ct, size_t count)
 | 
						|
{
 | 
						|
	register signed char __res = 0;
 | 
						|
 | 
						|
	while (count) {
 | 
						|
		if ((__res = *cs - *ct++) != 0 || !*cs++)
 | 
						|
			break;
 | 
						|
		count--;
 | 
						|
	}
 | 
						|
 | 
						|
	return __res;
 | 
						|
}
 | 
						|
 | 
						|
size_t strlen(const char *s)
 | 
						|
{
 | 
						|
	const char *sc;
 | 
						|
 | 
						|
	for (sc = s; *sc != '\0'; ++sc)
 | 
						|
		/* nothing */ ;
 | 
						|
	return sc - s;
 | 
						|
}
 | 
						|
#endif
 |