lkml.org 
[lkml]   [2008]   [Dec]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH v1 2/3] Add %v support to vsnprintf()
    Date
    Add %v support to vsnprintf()

    vsnprintf() is extended to support a '%v' in the format string. '%v'
    takes two arguments, the first is a format string and the second is a
    va_list. vsnprintf() is recursively called to process the specified
    format string and arguments, before returning to the original format
    string.

    This allows functions like the following, which prepend a
    subsystem-specific string to an error message:

    int subsystem_error(char *fmt, ...) {
    va_list ap;
    int rc;

    va_start(ap, fmt);
    rc = printk("%s: %v\n", "SUBSYSTEM", fmt, ap);
    va_end(ap);
    return rc;
    }

    Functions printing errors inside the subsystem would do like:

    subsystem_error("Failed to get widget: %d", 3);

    The resulting kernel message would be:

    SUBSYSTEM: Failed to get widget: 3\n

    The advantage over using say 2 printk() calls is that message output
    will be contiguous, whereas separate printk() calls might be broken
    by an intervening message from another kernel thread. Also a single
    message buffer is used, which avoids double-handling and excessive
    memory use.

    Signed-off-by: Nick Andrew <nick@nick-andrew.net>
    ---

    lib/vsprintf.c | 14 ++++++++++++++
    1 files changed, 14 insertions(+), 0 deletions(-)


    diff --git a/lib/vsprintf.c b/lib/vsprintf.c
    index 1e2dcaf..e779f79 100644
    --- a/lib/vsprintf.c
    +++ b/lib/vsprintf.c
    @@ -632,6 +632,7 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr, int field
    * %pS output the name of a text symbol
    * %pF output the name of a function pointer
    * %pR output the address range in a struct resource
    + * %v processes a supplied format string and args, recursively
    *
    */

    @@ -787,6 +788,19 @@ static char *__vsnprintfr(char *buf, char *str, char *end,
    case 'u':
    break;

    + case 'v': {
    + char *fmt2;
    + va_list args2;
    +
    + fmt2 = va_arg(args, char *);
    + args2 = va_arg(args, va_list);
    + /* recurse to format the (fmt,args) pair */
    + str = __vsnprintfr(buf, str, end, fmt2, args2);
    + va_end(args2);
    +
    + continue;
    + }
    +
    default:
    if (str < end)
    *str = '%';


    \
     
     \ /
      Last update: 2008-12-06 08:03    [W:0.024 / U:32.104 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site