Changeset 56972c81 in mainline


Ignore:
Timestamp:
2006-03-14T21:19:38Z (19 years ago)
Author:
Josef Cejka <malyzelenyhnus@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
ee7736e
Parents:
4241683
Message:

Fixed bug in printf (native from kernel must be unsigned long).
Putting prefixes in printf optimized.
Test function created in init.c.

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • init/init.c

    r4241683 r56972c81  
    3333#include <unistd.h>
    3434#include <stdlib.h>
    35 
     35/*
     36static void test_printf(void)
     37{
     38        printf("Simple text.\n");
     39        printf("Now insert '%s' string.\n","this");
     40        printf("We are brave enought to print numbers like %%d = '%d'\n", 0x123456);
     41        printf("And now... '%b' byte! '%w' word! '%W' Word! \n", 0x12, 0x1234, 0x1234);
     42        printf(" '%Q' Q! Another '%q' q! \n", 0x1234567887654321ll, 0x1234567887654321ll);
     43        printf(" '%P' with 64bit value and '%p' with 32 bit value. \n", 0x1234567887654321ll, 0x12345678 );
     44        printf("Thats all, folks!\n");
     45}
     46*/
    3647/*
    3748static void test_mremap(void)
  • libc/generic/io/print.c

    r4241683 r56972c81  
    3333#include <stdarg.h>
    3434
     35#define __PRINTF_FLAG_PREFIX 0x00000001
     36#define __PRINTF_FLAG_SIGNED 0x00000002
     37
    3538static char digits[] = "0123456789abcdef";      /**< Hexadecimal characters */
    3639
     
    4649 *
    4750 */
    48 static int print_fixed_hex(const uint64_t num, const int width)
     51static int print_fixed_hex(const uint64_t num, const int width, uint64_t flags)
    4952{
    5053        int i;
    51         char buf[16];
     54        char buf[18]; /* 16 bytes for number + 2 for optionaly prefix */
    5255        char *bptr;
    5356       
    5457        bptr = buf;
     58       
     59        if (flags & __PRINTF_FLAG_PREFIX) {
     60                buf[0] = '0';
     61                buf[1] = 'x';
     62                bptr += 2;
     63        }
     64
    5565        for (i = width*8 - 4; i >= 0; i -= 4)
    5666                *bptr++ = digits[(num>>i) & 0xf];
     
    7181 *
    7282 */
    73 static int print_number(const unsigned int num, const unsigned int base)
     83static int print_number(const unsigned long num, const unsigned int base, uint64_t flags)
    7484{
    7585        int val = num;
    76         char d[sizeof(unsigned int)*8+1];       /* this is good enough even for base == 2 */
    77         int i = sizeof(unsigned int)*8-1;
     86        char d[sizeof(unsigned long)*8+1];      /* this is good enough even for base == 2 */
     87        int i = sizeof(unsigned long)*8-1;
     88       
     89        /* FIXME: if signed, print sign */
    7890       
    7991        do {
     
    8193        } while (val /= base);
    8294       
    83         d[sizeof(unsigned int)*8] = 0; 
     95        d[sizeof(unsigned long)*8] = 0;
    8496
    8597        return putstr(&d[i + 1]);
     
    149161        va_list ap;
    150162        char c;
     163
     164        uint64_t flags;
    151165       
    152166        counter = 0;
     
    158172                        /* print common characters if any processed */ 
    159173                        if (i > j) {
    160                                 if ((retval = putnchars(&fmt[j], i - j)) == EOF) { /* error */
     174                                if ((retval = putnchars(&fmt[j], (size_t)(i - j))) == EOF) { /* error */
    161175                                        return -counter;
    162176                                }
    163177                                counter += retval;
    164178                        }
    165 
     179                       
    166180                        j = ++i;
    167 
     181                       
     182                        /* parse modifiers */
     183                        flags = 0;
     184                        /*switch (c = fmt[i]) {
     185                                case '-':       
     186                        }       
     187                        */
    168188                        switch (c = fmt[i]) {
    169189
     
    184204                                        break;
    185205                                case 'c':
    186                                         if ((retval = putnchars((char *)&va_arg(ap, int), sizeof(char))) == EOF) {
     206                                        if ((retval = putnchars((char *)&va_arg(ap, unsigned long), sizeof(char))) == EOF) {
    187207                                                return -counter;
    188208                                        };
     
    194214                                * Hexadecimal conversions with fixed width.
    195215                                */
    196                                 case 'P':
    197                                         if ((retval = putnchars("0x", 2)) == EOF) {
    198                                                 return -counter;
    199                                         };
    200                                        
    201                                         counter += retval;
     216                                case 'P':
     217                                        flags |= __PRINTF_FLAG_PREFIX;
    202218                                case 'p':
    203                                         if ((retval = print_fixed_hex(va_arg(ap, int), sizeof(int))) == EOF ) {
     219                                        if ((retval = print_fixed_hex(va_arg(ap, unsigned long), sizeof(unsigned long), flags)) == EOF ) {
    204220                                                return -counter;
    205221                                        };
     
    208224                                        break;
    209225                                case 'Q':
    210                                         if ((retval = putnchars("0x", 2)) == EOF) {
    211                                                 return -counter;
    212                                         };
    213                                        
    214                                         counter += retval;
     226                                        flags |= __PRINTF_FLAG_PREFIX;
    215227                                case 'q':
    216                                         if ((retval = print_fixed_hex(va_arg(ap, uint64_t), sizeof(uint64_t))) == EOF ) {
     228                                        if ((retval = print_fixed_hex(va_arg(ap, uint64_t), sizeof(uint64_t), flags)) == EOF ) {
    217229                                                return -counter;
    218230                                        };
     
    221233                                        break;
    222234                                case 'L':
    223                                         if ((retval = putnchars("0x", 2)) == EOF) {
    224                                                 return -counter;
    225                                         };
    226                                        
    227                                         counter += retval;
     235                                        flags |= __PRINTF_FLAG_PREFIX;
    228236                                case 'l':
    229                                         if ((retval = print_fixed_hex(va_arg(ap, int), sizeof(uint32_t))) == EOF ) {
     237                                        if ((retval = print_fixed_hex(va_arg(ap, unsigned long), sizeof(uint32_t), flags)) == EOF ) {
    230238                                                return -counter;
    231239                                        };
     
    234242                                        break;
    235243                                case 'W':
    236                                         if ((retval = putnchars("0x", 2)) == EOF) {
    237                                                 return -counter;
    238                                         };
    239                                        
    240                                         counter += retval;
     244                                        flags |= __PRINTF_FLAG_PREFIX;
    241245                                case 'w':
    242                                         if ((retval = print_fixed_hex(va_arg(ap, int), sizeof(uint16_t))) == EOF ) {
     246                                        if ((retval = print_fixed_hex(va_arg(ap, unsigned long), sizeof(uint16_t), flags)) == EOF ) {
    243247                                                return -counter;
    244248                                        };
     
    247251                                        break;
    248252                                case 'B':
    249                                         if ((retval = putnchars("0x", 2)) == EOF) {
    250                                                 return -counter;
    251                                         };
    252                                        
    253                                         counter += retval;
     253                                        flags |= __PRINTF_FLAG_PREFIX;
    254254                                case 'b':
    255                                         if ((retval = print_fixed_hex(va_arg(ap, int), sizeof(uint8_t))) == EOF ) {
     255                                        if ((retval = print_fixed_hex(va_arg(ap, unsigned long), sizeof(uint8_t), flags)) == EOF ) {
    256256                                                return -counter;
    257257                                        };
     
    263263                                */
    264264                                case 'd':
    265                                         if ((retval = print_number(va_arg(ap, int), 10)) == EOF ) {
     265                                case 'i':
     266                                        flags |= __PRINTF_FLAG_SIGNED;
     267                                        if ((retval = print_number(va_arg(ap,unsigned long), 10, flags)) == EOF ) {
    266268                                                return -counter;
    267269                                        };
     
    270272                                        break;
    271273                                case 'X':
    272                                         if ((retval = putnchars("0x", 2)) == EOF) {
    273                                                 return -counter;
    274                                         };
    275                                        
    276                                         counter += retval;
     274                                        flags |= __PRINTF_FLAG_PREFIX;
    277275                                case 'x':
    278                                         if ((retval = print_number(va_arg(ap, int), 16)) == EOF ) {
     276                                        if ((retval = print_number(va_arg(ap, unsigned long), 16, flags)) == EOF ) {
    279277                                                return -counter;
    280278                                        };
     
    294292       
    295293        if (i > j) {
    296                 if ((retval = putnchars(&fmt[j], i - j)) == EOF) { /* error */
     294                if ((retval = putnchars(&fmt[j], (size_t)(i - j))) == EOF) { /* error */
    297295                        return -counter;
    298296                }
Note: See TracChangeset for help on using the changeset viewer.