lkml.org 
[lkml]   [2010]   [Mar]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH] vsprintf.c: Reduce sizeof struct printf_spec from 24 to 8 bytes
    From
    Date
    On Sat, 2010-03-06 at 15:58 -0800, Linus Torvalds wrote:
    > And no, I guess we don't really need to make it 32-bit. Fitting in 64 bits
    > would already be a big improvement over what we have now.

    Reducing the size of struct printf_spec is a good thing
    because multiple instances are commonly passed on stack.

    It's possible for type to be u8 and field_width to be s8,
    but this is likely small enough for now.

    Signed-off-by: Joe Perches <joe@perches.com>
    ---
    lib/vsprintf.c | 22 ++++++++++++----------
    1 files changed, 12 insertions(+), 10 deletions(-)

    diff --git a/lib/vsprintf.c b/lib/vsprintf.c
    index af4aaa6..fdee7f7 100644
    --- a/lib/vsprintf.c
    +++ b/lib/vsprintf.c
    @@ -408,12 +408,12 @@ enum format_type {
    };

    struct printf_spec {
    - enum format_type type;
    - int flags; /* flags to number() */
    - int field_width; /* width of output field */
    - int base;
    - int precision; /* # of digits/chars */
    - int qualifier;
    + u16 type;
    + s16 field_width; /* width of output field */
    + u8 flags; /* flags to number() */
    + u8 base;
    + s8 precision; /* # of digits/chars */
    + u8 qualifier;
    };

    static char *number(char *buf, char *end, unsigned long long num,
    @@ -1333,7 +1333,7 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
    break;

    case FORMAT_TYPE_NRCHARS: {
    - int qualifier = spec.qualifier;
    + u8 qualifier = spec.qualifier;

    if (qualifier == 'l') {
    long *ip = va_arg(args, long *);
    @@ -1619,7 +1619,7 @@ do { \

    case FORMAT_TYPE_NRCHARS: {
    /* skip %n 's argument */
    - int qualifier = spec.qualifier;
    + u8 qualifier = spec.qualifier;
    void *skip_arg;
    if (qualifier == 'l')
    skip_arg = va_arg(args, long *);
    @@ -1885,7 +1885,9 @@ int vsscanf(const char *buf, const char *fmt, va_list args)
    char *next;
    char digit;
    int num = 0;
    - int qualifier, base, field_width;
    + u8 qualifier;
    + u8 base;
    + s16 field_width;
    bool is_sign;

    while (*fmt && *str) {
    @@ -1963,7 +1965,7 @@ int vsscanf(const char *buf, const char *fmt, va_list args)
    {
    char *s = (char *)va_arg(args, char *);
    if (field_width == -1)
    - field_width = INT_MAX;
    + field_width = SHORT_MAX;
    /* first, skip leading white space in buffer */
    str = skip_spaces(str);




    \
     
     \ /
      Last update: 2010-03-07 02:13    [W:0.024 / U:0.324 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site