Annotation of researchv9/jtools/src/pi/format.c, revision 1.1

1.1     ! root        1: #include "univ.h"
        !             2: #include "format.pri"
        !             3: #include <ctype.h>
        !             4: #include "symtab.pub"
        !             5: #include "symbol.h"
        !             6: SRCFILE("format.c")
        !             7: 
        !             8: char *Bls::af(PRINTF_ARGS)
        !             9: {
        !            10:        char x[1024], *q = x;
        !            11: 
        !            12:        trace( "%d.af(%s ...) %s", this, fmt, text );
        !            13:        IF_LIVE(!this) return "Bls::af";
        !            14:        if( p<text+TBLS && fmt ){
        !            15:                sprintf(x, PRINTF_COPY);
        !            16:                while( *q && p<text+TBLS ) *p++ = *q++;
        !            17:                *p = 0;
        !            18:        }
        !            19:        return text;
        !            20: }
        !            21: 
        !            22: Bls::Bls(PRINTF_ARGS)
        !            23: {
        !            24:        clear();
        !            25:        af(PRINTF_COPY);
        !            26: }
        !            27: 
        !            28: Bls::Bls(Bls &b)
        !            29: {
        !            30:        clear();
        !            31:        af("%s", b.text);
        !            32: }
        !            33: 
        !            34: Format::Format(long f, SymTab *s)      { format = f; stab = s; }
        !            35: 
        !            36: char *FmtByte(int c)
        !            37: {      static char buf[8];
        !            38: 
        !            39:        switch( c &= 0xFF ){
        !            40:        case '\0'       : return "\\0"; 
        !            41:        case '\b'       : return "\\b"; 
        !            42:        case '\f'       : return "\\f"; 
        !            43:        case '\n'       : return "\\n"; 
        !            44:        case '\r'       : return "\\r"; 
        !            45:        case '\t'       : return "\\t"; 
        !            46:        case '\v'       : return "\\v"; 
        !            47:        case ' '        : return " ";           /* see ikeya!<ctype.h> */       
        !            48:        case '\''       : return "\\\'";
        !            49:        case '\"'       : return "\\\"";
        !            50:        case '\\'       : return "\\\\";
        !            51:        }
        !            52:        sprintf( buf, isascii(c)&&isprint(c)?"%c":"\\%03o", c );
        !            53:        return buf;
        !            54: }
        !            55: 
        !            56: char *FmtAscii(unsigned long c)
        !            57: {
        !            58:        static char buf[32];
        !            59: 
        !            60:        if( c == 0 ) return "0";
        !            61:        strcpy(buf, "'");
        !            62:        int lead = 1; int byte = 4;                     // cfront bug
        !            63:        for( ; byte; --byte, c<<=8 ){
        !            64:                if( (c&0xFF000000) || !lead ){
        !            65:                        strcat(buf, FmtByte(c>>24));
        !            66:                        lead = 0;
        !            67:                }
        !            68:        }
        !            69:        return strcat(buf, "'");
        !            70: }
        !            71: 
        !            72: void Format::grow(char *b)
        !            73: {
        !            74:        accum.af("%s%s", sep, b);
        !            75:        sep = "=";
        !            76: }
        !            77: 
        !            78: void Format::growtime(long t)
        !            79: {
        !            80:        char *time(long*);
        !            81:        grow(ctime(&t));
        !            82: }
        !            83:        
        !            84: void Format::grow(char *fmt, long l)
        !            85: {
        !            86:        char buf[32];
        !            87: 
        !            88:        sprintf(buf, fmt, l);
        !            89:        grow(buf);
        !            90: }
        !            91: 
        !            92: void Format::grow(char *fmt, double d)
        !            93: {
        !            94:        char buf[32];
        !            95: 
        !            96:        trace( "%d.grow(%s,%g)", this, fmt, d );
        !            97:        sprintf(buf, fmt, d);
        !            98:        if( fmt[1]=='g' && !strcmp(buf, "0") )
        !            99:                grow("0.0");
        !           100:        else
        !           101:                grow(buf);
        !           102: }
        !           103: 
        !           104: char *Format::f(long lng, double dbl)
        !           105: {
        !           106:        Symbol *s;
        !           107: 
        !           108:        if( !this ) return "Format::f";
        !           109: 
        !           110:        accum.clear();
        !           111:        sep = "";
        !           112: 
        !           113:        if( !format ) format = F_HEX;
        !           114: 
        !           115:        if( format&F_MASK8  ) lng &= 0xFF;
        !           116:        if( format&F_MASK16 ) lng &= 0xFFFF;
        !           117: 
        !           118:        if( format&F_FLOAT  ) grow("%g",      dbl);
        !           119:        if( format&F_DOUBLE ) grow("%g",      dbl);
        !           120:        if( format&F_DBLHEX ) grow("0x%X_%X", dbl);
        !           121: 
        !           122:        if( format&F_SYMBOLIC
        !           123:         && lng
        !           124:         && stab
        !           125:         && (s = stab->loctosym(SSet(U_FUNC,U_GLB,U_STA,U_STMT), lng)) ){
        !           126:                lng -= s->range.lo;
        !           127:                grow(s->text());
        !           128:                if( !lng )
        !           129:                        format = 0;
        !           130:                else {
        !           131:                        sep =  "+";
        !           132:                        if( !(format&F_HOAD) ) format |= F_HEX;
        !           133:                }
        !           134:        }
        !           135: 
        !           136:        if( format&F_TIME ) growtime(lng);
        !           137:        if( (format&F_HOAD) && lng>=0 && lng<=7 ) grow("%d", lng);
        !           138:        else {
        !           139:                if( format&F_OCTAL   ) grow("0%o",  lng);
        !           140:                if( format&F_DECIMAL ) grow("%u",   lng);
        !           141:                if( format&F_HEX     ) grow("0x%X", lng);
        !           142:                if( format&F_ASCII   ) grow(FmtAscii(lng));
        !           143: 
        !           144:                if( format&F_EXT8 ) lng = (char ) lng;
        !           145:                if( format&F_EXT16) lng = (short) lng;
        !           146: 
        !           147:                if( format&F_SIGNED
        !           148:                 && (lng<0 || !(format&F_DECIMAL)) ) grow("%d", lng);
        !           149:        }
        !           150:        return accum.text;
        !           151: }

unix.superglobalmegacorp.com

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