/*
* linux/lib/vsprintf.c
*
* Copyright (C) 1991, 1992 Linus Torvalds
*/
/* vsprintf.c -- Lars Wirzenius & Linus Torvalds. */
/*
* Wirzenius wrote this portably, Torvalds fucked it up :-)
*/
/*
* Fri Jul 13 2001 Crutcher Dunnavant <crutcher+kernel@datastacks.com>
* - changed to provide snprintf and vsnprintf functions
* So Feb 1 16:51:32 CET 2004 Juergen Quade <quade@hsnr.de>
* - scnprintf and vscnprintf
*/
//#include <stdarg.h>
//#include <linux/module.h>
#include "types.h"
#include "kernel.h"
#include "ctype.h"
#include "string.h"
#include "div64.h"
#include "vsprintf.h"
#define unlikely(x) __builtin_expect(!!(x), 0)
/**
* simple_strtoul - convert a string to an unsigned long
* @cp: The start of the string
* @endp: A pointer to the end of the parsed string will be placed here
* @base: The number base to use
*/
unsigned long simple_strtoul(const char *cp,char **endp,unsigned int base)
{
unsigned long result = 0,value;
if (!base) {
base = 10;
if (*cp == '0') {
base = 8;
cp++;
if ((toupper(*cp) == 'X') && isxdigit(cp[1])) {
cp++;
base = 16;
}
}
} else if (base == 16) {
if (cp[0] == '0' && toupper(cp[1]) == 'X')
cp += 2;
}
while (isxdigit(*cp) &&
(value = isdigit(*cp) ? *cp-'0' : toupper(*cp)-'A'+10) < base) {
result = result*base + value;
cp++;
}
if (endp)
*endp = (char *)cp;
return result;
}
//EXPORT_SYMBOL(simple_strtoul);
/**
* simple_strtol - convert a string to a signed long
* @cp: The start of the string
* @endp: A pointer to the end of the parsed string will be placed here
* @base: The number base to use
*/
long simple_strtol(const char *cp,char **endp,unsigned int base)
{
if(*cp=='-')
return -simple_strtoul(cp+1,endp,base);
return simple_strtoul(cp,endp,base);
}
//EXPORT_SYMBOL(simple_strtol);
/**
* simple_strtoull - convert a string to an unsigned long long
* @cp: The start of the string
* @endp: A pointer to the end of the parsed string will be placed here
* @base: The number base to use
*/
unsigned long long simple_strtoull(const char *cp,char **endp,unsigned int base)
{
unsigned long long result = 0,value;
if (!base) {
base = 10;
if (*cp == '0') {
base = 8;
cp++;
if ((toupper(*cp) == 'X') && isxdigit(cp[1])) {
cp++;
base = 16;
}
}
} else if (base == 16) {
if (cp[0] == '0' && toupper(cp[1]) == 'X')
cp += 2;
}
while (isxdigit(*cp) && (value = isdigit(*cp) ? *cp-'0' : (islower(*cp)
? toupper(*cp) : *cp)-'A'+10) < base) {
result = result*base + value;
cp++;
}
if (endp)
*endp = (char *)cp;
return result;
}
//EXPORT_SYMBOL(simple_strtoull);
/**
* simple_strtoll - convert a string to a signed long long
* @cp: The start of the string
* @endp: A pointer to the end of the parsed string will be placed here
* @base: The number base to use
*/
long long simple_strtoll(const char *cp,char **endp,unsigned int base)
{
if(*cp=='-')
return -simple_strtoull(cp+1,endp,base);
return simple_strtoull(cp,endp,base);
}
static int skip_atoi(const char **s)
{
int i=0;
while (isdigit(**s))
i = i*10 + *((*s)++) - '0';
return i;
}
#define ZEROPAD 1 /* pad with zero */
#define SIGN 2 /* unsigned/signed long */
#define PLUS 4 /* show plus */
#define SPACE 8 /* space if plus */
#define LEFT 16 /* left justified */
#define SPECIAL 32 /* 0x */
#define LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */
static char * number(char * buf, char * end, unsigned long long num, int base, int size, int precision, int type)
{
char c,sign,tmp[66];
const char *digits;
static const char small_digits[] = "0123456789abcdefghijklmnopqrstuvwxyz";
static const char large_digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int i;
digits = (type & LARGE) ? large_digits : small_digits;
if (type & LEFT)
type &= ~ZEROPAD;
if (base < 2 || base > 36)
return NULL;
c = (type & ZEROPAD) ? '0' : ' ';
sign = 0;
if (type & SIGN) {
if ((signed long long) num < 0) {
sign = '-';
num = - (signed long long) num;
size--;
} else if (type & PLUS) {
sign = '+';
size--;
} else if (type & SPACE) {
sign = ' ';
size--;
}
}
if (type & SPECIAL) {
if (base == 16)
size -= 2;
else if (base == 8)
size--;
}
i = 0;
if (num == 0)
tmp[i++]='0';
else while (num != 0)
tmp[i++] = digits[do_div(num,base)];
if (i > precision)
precision = i;
size -= precision;
if (!(type&(ZEROPAD+LEFT))) {
while(size-->0) {
if (buf <= end)
*buf = ' ';
++buf;
}
}
if (sign) {
if (buf <= end)
*buf = sign;
++buf;
}
if (type & SPECIAL) {
if (base==8) {
if (buf <= end)
*buf = '0';
++buf;
} else if (base==16) {
if (buf <= end)
*buf = '0';
++buf;
if (buf <= end)
*buf = digits[33];
++buf;
}
}
if (!(type & LEFT)) {
while (size-- > 0) {
if (buf <= end)
*buf = c;
++buf;
}
}
while (i < precision--) {
if (buf <= end)
*buf = '0';
++buf;
}
while (i-- > 0) {
if (buf <= end)
*buf = tmp[i];
++buf;
}
while (size-- > 0) {
if (buf <= end)
*buf = ' ';
++buf;
}
return buf;
}
/**
* vsnprintf - Format a string and place it in a buffer
* @buf: The buffer to place the result into
* @size: The size of the buffer, including the trailing null space
* @fmt: The format string to use
* @args: Arguments for the format string
*
* The return value is the number of characters which would
* be generated for the given input, excluding the trailing
* '\0', as per ISO C99. If you want to have the exact
* number of characters written into @buf as return value
* (not including the trailing '\0'), use vscnprintf. If the
* return is greater than or equal to @size, the resulting
* string is truncated.
*
* Call this function if you are already dealing with a va_list.
* You probably want snprintf instead.
*/
int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
{
int len;
unsigned long long num;
int i, base;
char *str, *end, c;
const char *s;
int flags; /* flags to number() */
int field_width; /* width of output field */
int precision; /* min. # of digits for integers; max
number of chars for from string */
int qualifier; /* 'h', 'l', or 'L' for integer fields */
/* 'z' support added 23/7/1999 S.H. */
/* 'z' changed to 'Z' --davidm 1/25/99 */
/* Reject out-of-range values early */
if (unlikely((int) size < 0)) {
/* There can be only one.. */
static int warn = 1;
// WARN_ON(warn);
warn = 0;
return 0;
}
str = buf;
end = buf + size - 1;
if (end < buf - 1) {
end = ((void *) -1);
size = end - buf + 1;
}
for (; *fmt ; ++fmt) {
if (*fmt != '%') {
if (str <= end)
*str = *fmt;
++str;
continue;
}
/* process flags */
flags = 0;
repeat:
++fmt; /* this also skips first '%' */
switch (*fmt) {
case '-': flags |= LEFT; goto repeat;
case '+': flags |= PLUS; goto repeat;
case ' ': flags |= SPACE; goto repeat;
case '#': flags |= SPECIAL; goto repeat;
case '0': flags |= ZEROPAD; goto repeat;
}
/* get field width */
field_width = -1;
if (isdigit(*fmt))
field_width = skip_atoi(&fmt);
else if (*fmt == '*') {
++fmt;
/* it's the next argument */
field_width = va_arg(args, int);
if (field_width < 0) {
field_width = -field_width;
flags |= LEFT;
}
}
/* get the precision */
precision = -1;
if (*fmt == '.') {
++fmt;
if (isdigit(*fmt))
precision = skip_atoi(&fmt);
else if (*fmt == '*') {
++fmt;
/* it's the next argument */
precision = va_arg(args, int);
}
if (precision < 0)
precision = 0;
}
/* get the conversion qualifier */
qualifier = -1;
if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' ||
*fmt =='Z' || *fmt == 'z') {
qualifier = *fmt;
++fmt;
if (qualifier == 'l' && *fmt == 'l') {
qualifier = 'L';
++fmt;
}
}
/* default base */
base = 10;
switch (*fmt) {
case 'c':
if (!(flags & LEFT)) {
while (--field_width > 0)
没有合适的资源?快使用搜索试试~ 我知道了~
tiny4412裸机相关程序
共169个文件
h:28个
c:26个
makefile:20个
5星 · 超过95%的资源 需积分: 32 228 下载量 114 浏览量
2014-07-07
22:11:12
上传
评论 4
收藏 2.72MB RAR 举报
温馨提示
tiny4412裸机相关程序 : 1、汇编点亮LED灯 2、关闭看门狗和调用C程序 3、设置栈和C语言点亮LED 4、控制icache 5、重定位代码到IRAM+0x8000 6、重定位代码到DRAM 7、重定位到DRAM及LCD实验 8、串口排查驱动原因及字符图片显示
资源推荐
资源详情
资源评论
收起资源包目录
tiny4412裸机相关程序 (169个子文件)
bl2.bin 14KB
E4412_N.bl1.bin 8KB
E4412_N.bl1.bin 8KB
E4412_N.bl1.bin 8KB
E4412_N.bl1.bin 8KB
E4412_N.bl1.bin 8KB
E4412_N.bl1.bin 8KB
E4412_N.bl1.bin 8KB
E4412_N.bl1.bin 8KB
user_bin.bin 204B
vsprintf.c 18KB
lcd.c 12KB
string.c 10KB
lcd.c 8KB
mmc_relocate.c 3KB
mmc_relocate.c 3KB
mmc_relocate.c 3KB
muldi3.c 3KB
main.c 2KB
V310-EVT1-mkbl2.c 2KB
V310-EVT1-mkbl2.c 2KB
V310-EVT1-mkbl2.c 2KB
V310-EVT1-mkbl2.c 2KB
V310-EVT1-mkbl2.c 2KB
V310-EVT1-mkbl2.c 1KB
V310-EVT1-mkbl2.c 1KB
V310-EVT1-mkbl2.c 1KB
ctype.c 1KB
printf.c 894B
uart.c 705B
main.c 542B
led.c 417B
main.c 409B
main.c 409B
led.c 408B
delay.c 84B
sdram_elf.dis 25KB
user_bin_elf.dis 3KB
sdram.elf 35KB
user_bin.elf 33KB
sex800_480.h 5.63MB
feng800_480.h 5.63MB
bmp.h 1.9MB
font_sun12x22.h 181KB
font_10x18.h 140KB
font_8x16.h 93KB
exynos4412.h 41KB
exynos4412.h 41KB
exynos4412.h 41KB
lcd.h 22KB
lcd.h 21KB
tiny4412.h 15KB
tiny4412.h 15KB
tiny4412.h 15KB
tiny4412_val.h 10KB
tiny4412_val.h 10KB
tiny4412_val.h 10KB
system.h 10KB
string.h 2KB
vsprintf.h 2KB
ctype.h 1KB
uart.h 1KB
div64.h 1KB
gcclib.h 733B
stdio.h 686B
types.h 195B
kernel.h 187B
printf.h 130B
SDRAM.IAB 176KB
SDRAM.IAB 176KB
SDRAM.IAB 88KB
1_LED_S.IAB 4KB
SDRAM.IAD 2KB
SDRAM.IAD 2KB
SDRAM.IAD 1KB
1_LED_S.IAD 368B
SDRAM.IMB 52KB
SDRAM.IMB 52KB
SDRAM.IMB 24KB
1_LED_S.IMB 4KB
SDRAM.IMD 848B
SDRAM.IMD 848B
SDRAM.IMD 568B
1_LED_S.IMD 368B
link.lds 182B
sdram.lds 169B
sdram.lds 169B
sdram.lds 169B
sdram.lds 135B
sdram.lds 135B
sdram.lds 135B
Makefile 809B
Makefile 809B
Makefile 809B
Makefile 809B
Makefile 809B
Makefile 721B
Makefile 402B
Makefile 402B
Makefile 401B
共 169 条
- 1
- 2
eshing
- 粉丝: 146
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页