vsprintf: Fix string printing
It would previously only print out the first character.
This commit is contained in:
parent
f82c53bfdc
commit
52c7aa83b8
1 changed files with 7 additions and 21 deletions
28
vsprintf.c
28
vsprintf.c
|
@ -264,7 +264,6 @@ static noinline char* put_dec(char *buf, unsigned NUM_TYPE num)
|
||||||
#define SMALL 32 /* Must be 32 == 0x20 */
|
#define SMALL 32 /* Must be 32 == 0x20 */
|
||||||
#define SPECIAL 64 /* 0x */
|
#define SPECIAL 64 /* 0x */
|
||||||
|
|
||||||
#ifdef CONFIG_SYS_VSNPRINTF
|
|
||||||
/*
|
/*
|
||||||
* Macro to add a new character to our output string, but only if it will
|
* Macro to add a new character to our output string, but only if it will
|
||||||
* fit. The macro moves to the next character position in the output string.
|
* fit. The macro moves to the next character position in the output string.
|
||||||
|
@ -274,9 +273,6 @@ static noinline char* put_dec(char *buf, unsigned NUM_TYPE num)
|
||||||
*(str) = (ch); \
|
*(str) = (ch); \
|
||||||
++str; \
|
++str; \
|
||||||
} while (0)
|
} while (0)
|
||||||
#else
|
|
||||||
#define ADDCH(str, ch) (*(str)++ = (ch))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static char *number(char *buf, char *end, unsigned NUM_TYPE num,
|
static char *number(char *buf, char *end, unsigned NUM_TYPE num,
|
||||||
int base, int size, int precision, int type)
|
int base, int size, int precision, int type)
|
||||||
|
@ -379,9 +375,9 @@ static char *string(char *buf, char *end, char *s, int field_width,
|
||||||
int len, i;
|
int len, i;
|
||||||
|
|
||||||
if (s == 0)
|
if (s == 0)
|
||||||
s = "<NULL>";
|
s = "(null)";
|
||||||
|
|
||||||
len = _strnlen(s, precision);
|
len = _strnlen(s, precision) - 1;
|
||||||
|
|
||||||
if (!(flags & LEFT))
|
if (!(flags & LEFT))
|
||||||
while (len < field_width--)
|
while (len < field_width--)
|
||||||
|
@ -528,13 +524,6 @@ static int vsnprintf_internal(char *buf, size_t size, const char *fmt,
|
||||||
/* 't' added for ptrdiff_t */
|
/* 't' added for ptrdiff_t */
|
||||||
char *end = buf + size;
|
char *end = buf + size;
|
||||||
|
|
||||||
#ifdef CONFIG_SYS_VSNPRINTF
|
|
||||||
/* Make sure end is always >= buf - do we want this in U-Boot? */
|
|
||||||
if (end < buf) {
|
|
||||||
end = ((void *)-1);
|
|
||||||
size = end - buf;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
str = buf;
|
str = buf;
|
||||||
|
|
||||||
for (; *fmt ; ++fmt) {
|
for (; *fmt ; ++fmt) {
|
||||||
|
@ -686,20 +675,15 @@ static int vsnprintf_internal(char *buf, size_t size, const char *fmt,
|
||||||
flags);
|
flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SYS_VSNPRINTF
|
|
||||||
if (size > 0) {
|
if (size > 0) {
|
||||||
ADDCH(str, '\0');
|
ADDCH(str, '\0');
|
||||||
if (str > end)
|
if (str > end)
|
||||||
end[-1] = '\0';
|
end[-1] = '\0';
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
*str = '\0';
|
|
||||||
#endif
|
|
||||||
/* the trailing null byte doesn't count towards the total */
|
/* the trailing null byte doesn't count towards the total */
|
||||||
return str-buf;
|
return str-buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SYS_VSNPRINTF
|
|
||||||
int vsnprintf(char *buf, size_t size, const char *fmt,
|
int vsnprintf(char *buf, size_t size, const char *fmt,
|
||||||
va_list args)
|
va_list args)
|
||||||
{
|
{
|
||||||
|
@ -712,7 +696,7 @@ int vscnprintf(char *buf, size_t size, const char *fmt, va_list args)
|
||||||
|
|
||||||
i = vsnprintf(buf, size, fmt, args);
|
i = vsnprintf(buf, size, fmt, args);
|
||||||
|
|
||||||
if (likely(i < size))
|
if (i < size)
|
||||||
return i;
|
return i;
|
||||||
if (size != 0)
|
if (size != 0)
|
||||||
return size - 1;
|
return size - 1;
|
||||||
|
@ -742,7 +726,6 @@ int scnprintf(char *buf, size_t size, const char *fmt, ...)
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_SYS_VSNPRINT */
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Format a string and place it in a buffer (va_list version)
|
* Format a string and place it in a buffer (va_list version)
|
||||||
|
@ -768,11 +751,13 @@ int sprintf(char * buf, const char *fmt, ...)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
va_start(args, fmt);
|
va_start(args, fmt);
|
||||||
i=vsprintf(buf,fmt,args);
|
i = vsprintf(buf,fmt,args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern void serial_puts(const char *bfr);
|
||||||
|
|
||||||
int printf(const char *fmt, ...)
|
int printf(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list args;
|
va_list args;
|
||||||
|
@ -783,6 +768,7 @@ int printf(const char *fmt, ...)
|
||||||
i = vsnprintf_internal(printbuffer, sizeof(printbuffer), fmt, args);
|
i = vsnprintf_internal(printbuffer, sizeof(printbuffer), fmt, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
serial_puts(printbuffer);
|
serial_puts(printbuffer);
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue