Index: branches/cparm/TODO =================================================================== --- branches/cparm/TODO (revision 1808) +++ branches/cparm/TODO (revision 1809) @@ -1,6 +1,8 @@ TODO List for Chameleon Boot Loader ==================================== +- (re-)Implement a watchdog library set (clear the watchdog at the right moment can avoid infinite loop made for unknow reasons by the compiler) + - Implement a Host like in bits to avoid some return issues - Implement snprintf to avoid buffer overflow in some case Index: branches/cparm/i386/libsaio/console.c =================================================================== --- branches/cparm/i386/libsaio/console.c (revision 1808) +++ branches/cparm/i386/libsaio/console.c (revision 1809) @@ -254,17 +254,21 @@ char *str = NULL; va_start(ap, fmt); - pi.last_str = 0; - len = prf_fmt_str_len(fmt, ap); + len = prf(fmt, ap, NULL, NULL); if (len > 0) { - str = malloc(len+1); - if (!str) return NULL; + str = newEmptyStringWithLength(len); + if (str != NULL) + { + pi.last_str = 0; + + pi.str = str; + + prf(fmt, ap, sputc, &pi); + *pi.str = '\0'; + } + } - pi.str = str; - - prf(fmt, ap, sputc, &pi); - *pi.str = '\0'; va_end(ap); return str; Index: branches/cparm/i386/libsa/libsa.h =================================================================== --- branches/cparm/i386/libsa/libsa.h (revision 1808) +++ branches/cparm/i386/libsa/libsa.h (revision 1809) @@ -114,9 +114,8 @@ /* * prf.c */ -extern void prf(const char * fmt, va_list ap, void (*putfn_p)(), - void * putfn_arg); -extern int prf_fmt_str_len(const char * fmt, va_list ap); +extern int prf(const char * fmt, va_list ap, void (*putfn_p)(), + void * putfn_arg); /* * printf.c Index: branches/cparm/i386/libsa/prf.c =================================================================== --- branches/cparm/i386/libsa/prf.c (revision 1808) +++ branches/cparm/i386/libsa/prf.c (revision 1809) @@ -90,90 +90,13 @@ while (cp > prbuf); } -void prf( - char *fmt, - unsigned int *adx, - void (*putfn_p)(), - void *putfn_arg - ) +int prf( + char *fmt, + unsigned int *adx, + void (*putfn_p)(), + void *putfn_arg + ) { - int b, c; - char *s; - int flag = 0, width = 0; - int minwidth; - -loop: - while ((c = *fmt++) != '%') { - if(c == '\0') - return; - (*putfn_p)(c, putfn_arg); - } - minwidth = 0; -again: - c = *fmt++; - switch (c) { - case 'l': - goto again; - case ' ': - flag |= SPACE; - goto again; - case '0': - if (minwidth == 0) { - /* this is a flag */ - flag |= ZERO; - goto again; - } /* fall through */ - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - minwidth *= 10; - minwidth += c - '0'; - goto again; - case 'X': - flag |= UCASE; - /* fall through */ - case 'x': - b = 16; - goto number; - case 'd': - b = 10; - goto number; - case 'o': case 'O': - b = 8; - number: - printn((u_long)*adx, b, flag, minwidth, putfn_p, putfn_arg); - break; - case 's': - s = (char *)*adx; - while ((c = *s++)) { - (*putfn_p)(c, putfn_arg); - width++; - } - while (width++ < minwidth) - (*putfn_p)(' ', putfn_arg); - break; - case 'c': - (*putfn_p)((char)*adx, putfn_arg); - break; - default: - break; - } - adx++; - goto loop; -} - -int prf_fmt_str_len( - char *fmt, - unsigned int *adx - ) -{ - int b, c, len =0; char *s; int flag = 0, width = 0; @@ -183,6 +106,9 @@ while ((c = *fmt++) != '%') { if(c == '\0') return len; + if (putfn_p && putfn_arg) { + (*putfn_p)(c, putfn_arg); + } len++; } minwidth = 0; @@ -224,18 +150,31 @@ case 'o': case 'O': b = 8; number: + if (putfn_p && putfn_arg) { + printn((u_long)*adx, b, flag, minwidth, putfn_p, putfn_arg); + } len++; break; case 's': s = (char *)*adx; while ((c = *s++)) { + if (putfn_p && putfn_arg) { + (*putfn_p)(c, putfn_arg); + } len++; width++; } - while (width++ < minwidth) + while (width++ < minwidth) { + if (putfn_p && putfn_arg) { + (*putfn_p)(' ', putfn_arg); + } len++; + } break; case 'c': + if (putfn_p && putfn_arg) { + (*putfn_p)((char)*adx, putfn_arg); + } len++; break; default: @@ -243,4 +182,4 @@ } adx++; goto loop; -} +} \ No newline at end of file