Annotation of xinu/sys/doprnt.c, revision 1.1

1.1     ! root        1: /* doprnt.c - _doprnt, _prt10, _prt8, _prt16 */
        !             2: 
        !             3: #define        MAXSTR  80
        !             4: #define        LOCAL   static
        !             5: 
        !             6: /*------------------------------------------------------------------------
        !             7:  *  _doprnt --  format and write output using 'func' to write characters
        !             8:  *------------------------------------------------------------------------
        !             9:  */
        !            10: _doprnt(fmt, args, func, farg) /* adapted by S. Salisbury, Purdue U.   */
        !            11:        char    *fmt;           /* Format string for printf             */
        !            12:        int     *args;          /* Arguments to printf                  */
        !            13:        int     (*func)();      /* Function to put a character          */
        !            14:        int     farg;           /* Argument to func                     */
        !            15: {
        !            16:        int     c;
        !            17:        int     i;
        !            18:        int     f;              /* The format character (comes after %) */
        !            19:        char    *str;           /* Running pointer in string            */
        !            20:        char    string[20];     /* The string str points to this output */
        !            21:                                /*  from number conversion              */
        !            22:        int     length;         /* Length of string "str"               */
        !            23:        char    fill;           /* Fill character (' ' or '0')          */
        !            24:        int     leftjust;       /* 0 = right-justified, else left-just. */
        !            25:        int     fmax,fmin;      /* Field specifications % MIN . MAX s   */
        !            26:        int     leading;        /* No. of leading/trailing fill chars.  */
        !            27:        char    sign;           /* Set to '-' for negative decimals     */
        !            28:        char    digit1;         /* Offset to add to first numeric digit */
        !            29: 
        !            30:        for(;;) {
        !            31:                /* Echo characters until '%' or end of fmt string */
        !            32:                while( (c = *fmt++) != '%' ) {
        !            33:                        if( c == '\0' )
        !            34:                                return;
        !            35:                        (*func)(farg,c);
        !            36:                }
        !            37:                /* Echo "...%%..." as '%' */
        !            38:                if( *fmt == '%' ) {
        !            39:                        (*func)(farg,*fmt++);
        !            40:                        continue;
        !            41:                }
        !            42:                /* Check for "%-..." == Left-justified output */
        !            43:                if (leftjust = ((*fmt=='-') ? 1 : 0) )
        !            44:                        fmt++;
        !            45:                /* Allow for zero-filled numeric outputs ("%0...") */
        !            46:                fill = (*fmt=='0') ? *fmt++ : ' ';
        !            47:                /* Allow for minimum field width specifier for %d,u,x,o,c,s*/
        !            48:                /* Also allow %* for variable width (%0* as well)       */
        !            49:                fmin = 0;
        !            50:                if( *fmt == '*' ) {
        !            51:                        fmin = *args++;
        !            52:                        ++fmt;
        !            53:                }
        !            54:                else while( '0' <= *fmt && *fmt <= '9' ) {
        !            55:                        fmin = fmin * 10 + *fmt++ - '0';
        !            56:                }
        !            57:                /* Allow for maximum string width for %s */
        !            58:                fmax = 0;
        !            59:                if( *fmt == '.' ) {
        !            60:                        if( *(++fmt) == '*' ) {
        !            61:                                fmax = *args++;
        !            62:                                ++fmt;
        !            63:                        }
        !            64:                else while( '0' <= *fmt && *fmt <= '9' ) {
        !            65:                        fmax = fmax * 10 + *fmt++ - '0';
        !            66:                        }
        !            67:                }
        !            68:                if (*fmt == 'l') /* long */
        !            69:                        fmt++;
        !            70:                str = string;
        !            71:                if( (f= *fmt++) == '\0' ) {
        !            72:                        (*func)(farg,'%');
        !            73:                        return;
        !            74:                }
        !            75:                sign = '\0';    /* sign == '-' for negative decimal */
        !            76: 
        !            77:                switch( f ) {
        !            78:                    case 'c' :
        !            79:                        string[0] = (char) *args;
        !            80:                        string[1] = '\0';
        !            81:                        fmax = 0;
        !            82:                        fill = ' ';
        !            83:                        break;
        !            84: 
        !            85:                    case 's' :
        !            86:                        str = (char *) *args;
        !            87:                        fill = ' ';
        !            88:                        break;
        !            89: 
        !            90:                    case 'D' :
        !            91:                    case 'd' :
        !            92:                        if ( *args < 0 ) {
        !            93:                                sign = '-';
        !            94:                                *args = -*args;
        !            95:                                }
        !            96:                    case 'U':
        !            97:                    case 'u':
        !            98:                        _prt10(*args, str);
        !            99:                        fmax = 0;
        !           100:                        break;
        !           101: 
        !           102:                    case 'O' :
        !           103:                    case 'o' :
        !           104:                        _prt8(*args, str);
        !           105:                        fmax = 0;
        !           106:                        break;
        !           107: 
        !           108:                    case 'X' :
        !           109:                    case 'x' :
        !           110:                        _prt16(*args, str);
        !           111:                        fmax = 0;
        !           112:                        break;
        !           113: 
        !           114:                    default :
        !           115:                        (*func)(farg,f);
        !           116:                        break;
        !           117:                }
        !           118:                args++;
        !           119:                for(length = 0; str[length] != '\0'; length++)
        !           120:                        ;
        !           121:                if ( fmin > MAXSTR || fmin < 0 )
        !           122:                        fmin = 0;
        !           123:                if ( fmax > MAXSTR || fmax < 0 )
        !           124:                        fmax = 0;
        !           125:                leading = 0;
        !           126:                if ( fmax != 0 || fmin != 0 ) {
        !           127:                        if ( fmax != 0 )
        !           128:                                if ( length > fmax )
        !           129:                                        length = fmax;
        !           130:                        if ( fmin != 0 )
        !           131:                                leading = fmin - length;
        !           132:                        if ( sign == '-' )
        !           133:                                --leading;
        !           134:                }
        !           135:                if( sign == '-' && fill == '0' )
        !           136:                        (*func)(farg,sign);
        !           137:                if( leftjust == 0 )
        !           138:                        for( i = 0; i < leading; i++ )
        !           139:                                (*func)(farg,fill);
        !           140:                if( sign == '-' && fill == ' ' )
        !           141:                        (*func)(farg,sign);
        !           142:                for( i = 0 ; i < length ; i++ )
        !           143:                        (*func)(farg,str[i]);
        !           144:                if ( leftjust != 0 )
        !           145:                        for( i = 0; i < leading; i++ )
        !           146:                                (*func)(farg,fill);
        !           147:        }
        !           148: }
        !           149: 
        !           150: LOCAL  _prt10(num,str)
        !           151:        unsigned long   num;
        !           152:        char    *str;
        !           153: {
        !           154:        int     i;
        !           155:        char    c, temp[11];
        !           156: 
        !           157:        temp[0] = '\0';
        !           158:        for(i = 1; i <= 10; i++)  {
        !           159:                temp[i] = num % 10 + '0';
        !           160:                num /= 10;
        !           161:        }
        !           162:        for(i = 10; temp[i] == '0'; i--);
        !           163:        if( i == 0 )
        !           164:                i++;
        !           165:        while( i >= 0 )
        !           166:                *str++ = temp[i--];
        !           167: }
        !           168: 
        !           169: LOCAL  _prt8(num,str)
        !           170:        unsigned long   num;
        !           171:        char    *str;
        !           172: {
        !           173:        int     i;
        !           174:        char    c, temp[12];
        !           175: 
        !           176:        temp[0] = '\0';
        !           177:        for(i = 1; i <= 11; i++)  {
        !           178:                temp[i] = (num & 07) + '0';
        !           179:                num = num >> 3;
        !           180:        }
        !           181:        temp[11] &= '3';
        !           182:        for(i = 11; temp[i] == '0'; i--);
        !           183:        if( i == 0 )
        !           184:                i++;
        !           185:        while( i >= 0 )
        !           186:                *str++ = temp[i--];
        !           187: }
        !           188: 
        !           189: LOCAL  _prt16(num,str)
        !           190:        unsigned long   num;
        !           191:        char    *str;
        !           192: {
        !           193:        int     i;
        !           194:        char    c, temp[9];
        !           195: 
        !           196:        temp[0] = '\0';
        !           197:        for(i = 1; i <= 8; i++)  {
        !           198:                temp[i] = "0123456789abcdef"[num & 0x0f];
        !           199:                num = num >> 4;
        !           200:        }
        !           201:        for(i = 8; temp[i] == '0'; i--);
        !           202:        if( i == 0 )
        !           203:                i++;
        !           204:        while( i >= 0 )
        !           205:                *str++ = temp[i--];
        !           206: }

unix.superglobalmegacorp.com

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