Annotation of qemu/roms/SLOF/lib/libc/stdio/vsnprintf.c, revision 1.1

1.1     ! root        1: /******************************************************************************
        !             2:  * Copyright (c) 2004, 2008 IBM Corporation
        !             3:  * All rights reserved.
        !             4:  * This program and the accompanying materials
        !             5:  * are made available under the terms of the BSD License
        !             6:  * which accompanies this distribution, and is available at
        !             7:  * http://www.opensource.org/licenses/bsd-license.php
        !             8:  *
        !             9:  * Contributors:
        !            10:  *     IBM Corporation - initial implementation
        !            11:  *****************************************************************************/
        !            12: 
        !            13: #include "stdio.h"
        !            14: #include "stdlib.h"
        !            15: #include "string.h"
        !            16: 
        !            17: const static unsigned long long convert[] = {
        !            18:        0x0, 0xFF, 0xFFFF, 0xFFFFFF, 0xFFFFFFFF,
        !            19:        0xFFFFFFFFFFULL, 0xFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL
        !            20: };
        !            21: 
        !            22: 
        !            23: 
        !            24: static int
        !            25: print_itoa(char **buffer,unsigned long value, unsigned short int base)
        !            26: {
        !            27:        const char zeichen[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
        !            28:        static char sign = 0;
        !            29: 
        !            30:        if(base <= 2 || base > 16)
        !            31:                return 0;
        !            32: 
        !            33:        if(value < 0) {
        !            34:                sign = 1;
        !            35:                value *= -1;
        !            36:        }
        !            37: 
        !            38:        if(value < base) {
        !            39:                if(sign) {
        !            40:                        **buffer = '-';
        !            41:                        *buffer += 1;
        !            42:                        sign = 0;
        !            43:                }
        !            44:                **buffer = zeichen[value];
        !            45:                *buffer += 1;
        !            46:        } else {
        !            47:                print_itoa(buffer, value / base, base);
        !            48:                **buffer = zeichen[(value % base)];
        !            49:                *buffer += 1;
        !            50:        }
        !            51: 
        !            52:        return 1;
        !            53: }
        !            54: 
        !            55: 
        !            56: static unsigned int
        !            57: print_intlen(unsigned long value, unsigned short int base)
        !            58: {
        !            59:        int i = 0;
        !            60: 
        !            61:        while(value > 0) {
        !            62:                value /= base;
        !            63:                i++;
        !            64:        }
        !            65:        if(i == 0) i = 1;
        !            66:        return i;
        !            67: }
        !            68: 
        !            69: 
        !            70: static int
        !            71: print_fill(char **buffer, char *sizec, unsigned long size, unsigned short int base, char c, int optlen)
        !            72: {
        !            73:        int i, sizei, len;
        !            74: 
        !            75:        sizei = strtoul(sizec, NULL, 10);
        !            76:        len = print_intlen(size, base) + optlen;
        !            77:        if(sizei > len) {
        !            78:                for(i = 0; i < (sizei - len); i++) {
        !            79:                        **buffer = c;
        !            80:                        *buffer += 1;
        !            81:                }
        !            82:        }
        !            83: 
        !            84:        return 0;
        !            85: }
        !            86: 
        !            87: 
        !            88: static int
        !            89: print_format(char **buffer, const char *format, void *var)
        !            90: {
        !            91:        unsigned long start;
        !            92:        unsigned int i = 0, sizei = 0, len = 0, length_mod = sizeof(int);
        !            93:        unsigned long value = 0;
        !            94:        unsigned long signBit;
        !            95:        char *form, sizec[32];
        !            96:        char sign = ' ';
        !            97: 
        !            98:        form  = (char *) format;
        !            99:        start = (unsigned long) *buffer;
        !           100: 
        !           101:        form++;
        !           102:        if(*form == '0' || *form == '.') {
        !           103:                sign = '0';
        !           104:                form++;
        !           105:        }
        !           106: 
        !           107:        while(*form != '\0') {
        !           108:                switch(*form) {
        !           109:                        case 'u':
        !           110:                        case 'd':
        !           111:                        case 'i':
        !           112:                                sizec[i] = '\0';
        !           113:                                value = (unsigned long) var;
        !           114:                                signBit = 0x1ULL << (length_mod * 8 - 1);
        !           115:                                if (signBit & value) {
        !           116:                                        **buffer = '-';
        !           117:                                        *buffer += 1;
        !           118:                                        value = (-(unsigned long)value) & convert[length_mod];
        !           119:                                }
        !           120:                                print_fill(buffer, sizec, value, 10, sign, 0);
        !           121:                                print_itoa(buffer, value, 10);
        !           122:                                break;
        !           123:                        case 'X':
        !           124:                        case 'x':
        !           125:                                sizec[i] = '\0';
        !           126:                                value = (unsigned long) var & convert[length_mod];
        !           127:                                print_fill(buffer, sizec, value, 16, sign, 0);
        !           128:                                print_itoa(buffer, value, 16);
        !           129:                                break;
        !           130:                        case 'O':
        !           131:                        case 'o':
        !           132:                                sizec[i] = '\0';
        !           133:                                value = (long int) var & convert[length_mod];
        !           134:                                print_fill(buffer, sizec, value, 8, sign, 0);
        !           135:                                print_itoa(buffer, value, 8);
        !           136:                                break;
        !           137:                        case 'p':
        !           138:                                sizec[i] = '\0';
        !           139:                                print_fill(buffer, sizec, (unsigned long) var, 16, ' ', 2);
        !           140:                                **buffer = '0';
        !           141:                                *buffer += 1;   
        !           142:                                **buffer = 'x';
        !           143:                                *buffer += 1;
        !           144:                                print_itoa(buffer,(unsigned long) var, 16);
        !           145:                                break;
        !           146:                        case 'c':
        !           147:                                sizec[i] = '\0';
        !           148:                                print_fill(buffer, sizec, 1, 10, ' ', 0);
        !           149:                                **buffer = (unsigned long) var;
        !           150:                                *buffer += 1;
        !           151:                                break;
        !           152:                        case 's':
        !           153:                                sizec[i] = '\0';
        !           154:                                sizei = strtoul(sizec, NULL, 10);
        !           155:                                len = strlen((char *) var);
        !           156:                                if(sizei > len) {
        !           157:                                        for(i = 0; i < (sizei - len); i++) {
        !           158:                                                **buffer = ' ';
        !           159:                                                *buffer += 1;
        !           160:                                        }
        !           161:                                }
        !           162:                                for(i = 0; i < strlen((char *) var); i++) {
        !           163:                                        **buffer = ((char *) var)[i];
        !           164:                                        *buffer += 1;
        !           165:                                }
        !           166:                                break;
        !           167:                        case 'l':
        !           168:                                form++;
        !           169:                                if(*form == 'l') {
        !           170:                                        length_mod = sizeof(long long int);
        !           171:                                } else {
        !           172:                                        form--;
        !           173:                                        length_mod = sizeof(long int);
        !           174:                                }
        !           175:                                break;
        !           176:                        case 'h':
        !           177:                                form++;
        !           178:                                if(*form == 'h') {
        !           179:                                        length_mod = sizeof(signed char);
        !           180:                                } else {
        !           181:                                        form--;
        !           182:                                        length_mod = sizeof(short int);
        !           183:                                }
        !           184:                                break;
        !           185:                        default:
        !           186:                                if(*form >= '0' && *form <= '9')
        !           187:                                        sizec[i++] = *form;
        !           188:                }
        !           189:                form++;
        !           190:        }
        !           191: 
        !           192:        
        !           193:        return (long int) (*buffer - start);
        !           194: }
        !           195: 
        !           196: 
        !           197: /*
        !           198:  * The vsnprintf function prints a formated strings into a buffer.
        !           199:  * BUG: buffer size checking does not fully work yet
        !           200:  */
        !           201: int
        !           202: vsnprintf(char *buffer, size_t bufsize, const char *format, va_list arg)
        !           203: {
        !           204:        char *ptr, *bstart;
        !           205: 
        !           206:        bstart = buffer;
        !           207:        ptr = (char *) format;
        !           208: 
        !           209:        while(*ptr != '\0' && (buffer - bstart) < bufsize)
        !           210:        {
        !           211:                if(*ptr == '%') {
        !           212:                        char formstr[20];
        !           213:                        int i=0;
        !           214:                        
        !           215:                        do {
        !           216:                                formstr[i] = *ptr;
        !           217:                                ptr++;
        !           218:                                i++;
        !           219:                        } while(!(*ptr == 'd' || *ptr == 'i' || *ptr == 'u' || *ptr == 'x' || *ptr == 'X'
        !           220:                                                || *ptr == 'p' || *ptr == 'c' || *ptr == 's' || *ptr == '%'
        !           221:                                                || *ptr == 'O' || *ptr == 'o' )); 
        !           222:                        formstr[i++] = *ptr;
        !           223:                        formstr[i] = '\0';
        !           224:                        if(*ptr == '%') {
        !           225:                                *buffer++ = '%';
        !           226:                        } else {
        !           227:                                print_format(&buffer, formstr, va_arg(arg, void *));
        !           228:                        }
        !           229:                        ptr++;
        !           230:                } else {
        !           231: 
        !           232:                        *buffer = *ptr;
        !           233: 
        !           234:                        buffer++;
        !           235:                        ptr++;
        !           236:                }
        !           237:        }
        !           238:        
        !           239:        *buffer = '\0';
        !           240: 
        !           241:        return (buffer - bstart);
        !           242: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.