Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/printf/printf_core.c

    r7fadb65 r1e27d85  
    7575#define PRINT_NUMBER_BUFFER_SIZE  (64 + 5)
    7676
    77 /** Get signed or unsigned integer argument */
    78 #define PRINTF_GET_INT_ARGUMENT(type, ap, flags) \
    79         ({ \
    80                 unsigned type res; \
    81                 \
    82                 if ((flags) & __PRINTF_FLAG_SIGNED) { \
    83                         signed type arg = va_arg((ap), signed type); \
    84                         \
    85                         if (arg < 0) { \
    86                                 res = -arg; \
    87                                 (flags) |= __PRINTF_FLAG_NEGATIVE; \
    88                         } else \
    89                                 res = arg; \
    90                 } else \
    91                         res = va_arg((ap), unsigned type); \
    92                 \
    93                 res; \
    94         })
    95 
    9677/** Enumeration of possible arguments types.
    9778 */
     
    226207        }
    227208       
    228         return (int) (counter);
     209        return (int) (counter + 1);
    229210}
    230211
     
    264245        }
    265246       
    266         return (int) (counter);
     247        return (int) (counter + 1);
    267248}
    268249
     
    851832                        size_t size;
    852833                        uint64_t number;
    853                        
    854834                        switch (qualifier) {
    855835                        case PrintfQualifierByte:
    856836                                size = sizeof(unsigned char);
    857                                 number = PRINTF_GET_INT_ARGUMENT(int, ap, flags);
     837                                number = (uint64_t) va_arg(ap, unsigned int);
    858838                                break;
    859839                        case PrintfQualifierShort:
    860840                                size = sizeof(unsigned short);
    861                                 number = PRINTF_GET_INT_ARGUMENT(int, ap, flags);
     841                                number = (uint64_t) va_arg(ap, unsigned int);
    862842                                break;
    863843                        case PrintfQualifierInt:
    864844                                size = sizeof(unsigned int);
    865                                 number = PRINTF_GET_INT_ARGUMENT(int, ap, flags);
     845                                number = (uint64_t) va_arg(ap, unsigned int);
    866846                                break;
    867847                        case PrintfQualifierLong:
    868848                                size = sizeof(unsigned long);
    869                                 number = PRINTF_GET_INT_ARGUMENT(long, ap, flags);
     849                                number = (uint64_t) va_arg(ap, unsigned long);
    870850                                break;
    871851                        case PrintfQualifierLongLong:
    872852                                size = sizeof(unsigned long long);
    873                                 number = PRINTF_GET_INT_ARGUMENT(long long, ap, flags);
     853                                number = (uint64_t) va_arg(ap, unsigned long long);
    874854                                break;
    875855                        case PrintfQualifierPointer:
     
    886866                                counter = -counter;
    887867                                goto out;
     868                        }
     869                       
     870                        if (flags & __PRINTF_FLAG_SIGNED) {
     871                                if (number & (0x1 << (size * 8 - 1))) {
     872                                        flags |= __PRINTF_FLAG_NEGATIVE;
     873                                       
     874                                        if (size == sizeof(uint64_t)) {
     875                                                number = -((int64_t) number);
     876                                        } else {
     877                                                number = ~number;
     878                                                number &=
     879                                                    ~(0xFFFFFFFFFFFFFFFFll <<
     880                                                    (size * 8));
     881                                                number++;
     882                                        }
     883                                }
    888884                        }
    889885                       
Note: See TracChangeset for help on using the changeset viewer.