[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] hvmloader: Add snprintf()
# HG changeset patch # User Paul Durrant <paul.durrant@xxxxxxxxxx> # Date 1322664931 28800 # Node ID 295337e5d4e003c116ebabf6ef535b65ea5cfb92 # Parent 54a9e172a373055f8c55a0f30979cd2208e618b4 hvmloader: Add snprintf() Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> Committed-by: Keir Fraser <keir@xxxxxxx> --- diff -r 54a9e172a373 -r 295337e5d4e0 tools/firmware/hvmloader/util.c --- a/tools/firmware/hvmloader/util.c Wed Nov 30 06:53:36 2011 -0800 +++ b/tools/firmware/hvmloader/util.c Wed Nov 30 06:55:31 2011 -0800 @@ -528,7 +528,7 @@ return p; } -static void _doprint(void (*put)(char), const char *fmt, va_list ap) +static void _doprint(void (*emit)(void *, char), void *arg, const char *fmt, va_list ap) { char *str, c; int lflag, zflag, nflag; @@ -540,7 +540,7 @@ { if ( *fmt != '%' ) { - put(*fmt); + emit(arg, *fmt); continue; } @@ -571,7 +571,7 @@ if ( (c == 'd') && ((long)value < 0) ) { value = -value; - put('-'); + emit(arg, '-'); } } else @@ -580,7 +580,7 @@ if ( (c == 'd') && ((int)value < 0) ) { value = -(int)value; - put('-'); + emit(arg, '-'); } } str = buffer; @@ -588,13 +588,13 @@ c == 'o' ? 8 : ((c == 'x') || (c == 'X') ? 16 : 10)); slen = strlen(str); for ( i = pad - slen; i > 0; i-- ) - put(zflag ? '0' : ' '); + emit(arg, zflag ? '0' : ' '); while ( *str ) { char ch = *str++; if ( (ch >= 'a') && (c == 'X') ) ch += 'A'-'a'; - put(ch); + emit(arg, ch); } } else if ( c == 's' ) @@ -603,20 +603,20 @@ slen = strlen(str); if ( nflag == 0 ) for ( i = pad - slen; i > 0; i-- ) - put(' '); + emit(arg, ' '); while ( *str ) - put(*str++); + emit(arg, *str++); if ( nflag ) for ( i = pad - slen; i > 0; i-- ) - put(' '); + emit(arg, ' '); } else if ( c == 'c' ) { - put(va_arg(ap, int)); + emit(arg, va_arg(ap, int)); } else { - put(*fmt); + emit(arg, *fmt); } } } @@ -626,12 +626,17 @@ outb(0xe9, c); } +static void __put(void *arg, char c) +{ + putchar(c); +} + int printf(const char *fmt, ...) { va_list ap; va_start(ap, fmt); - _doprint(putchar, fmt, ap); + _doprint(__put, NULL, fmt, ap); va_end(ap); return 0; @@ -639,10 +644,48 @@ int vprintf(const char *fmt, va_list ap) { - _doprint(putchar, fmt, ap); + _doprint(__put, NULL, fmt, ap); return 0; } +struct __copy_context { + char *ptr; + size_t emitted; + size_t remaining; +}; + +static void __copy(void *arg, char c) +{ + struct __copy_context *ctxt = arg; + + ctxt->emitted++; + + if (ctxt->remaining == 0) + return; + + *(ctxt->ptr++) = c; + --ctxt->remaining; +} + +int snprintf(char *buf, size_t size, const char *fmt, ...) +{ + va_list ap; + struct __copy_context ctxt; + + ctxt.ptr = buf; + ctxt.emitted = 0; + ctxt.remaining = size; + + va_start(ap, fmt); + _doprint(__copy, &ctxt, fmt, ap); + va_end(ap); + + if (ctxt.remaining != 0) + *ctxt.ptr = '\0'; + + return ctxt.emitted; +} + static void __attribute__((noreturn)) crash(void) { struct sched_shutdown shutdown = { .reason = SHUTDOWN_crash }; diff -r 54a9e172a373 -r 295337e5d4e0 tools/firmware/hvmloader/util.h --- a/tools/firmware/hvmloader/util.h Wed Nov 30 06:53:36 2011 -0800 +++ b/tools/firmware/hvmloader/util.h Wed Nov 30 06:55:31 2011 -0800 @@ -171,6 +171,10 @@ int printf(const char *fmt, ...) __attribute__ ((format (printf, 1, 2))); int vprintf(const char *fmt, va_list ap); +/* Buffer output */ +typedef unsigned long size_t; +int snprintf(char *buf, size_t size, const char *fmt, ...) __attribute__ ((format (printf, 3, 4))); + /* Populate specified memory hole with RAM. */ void mem_hole_populate_ram(xen_pfn_t mfn, uint32_t nr_mfns); _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |