Annotation of coherent/d/bin/od.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Octal dump.
        !             3:  * The name is a bit of a joke on a
        !             4:  * machine that uses hexadecimal,
        !             5:  * but it will stay like this for now.
        !             6:  * Defaults to hex unless on the PDP11.
        !             7:  */
        !             8: 
        !             9: #include <stdio.h>
        !            10: #include <sys/mdata.h>
        !            11: 
        !            12: #ifndef PDP11
        !            13: #define        DEFBASE         16
        !            14: #define        DEFC            'x'
        !            15: #else
        !            16: #define        DEFBASE         8
        !            17: #define        DEFC            'o'
        !            18: #endif
        !            19: 
        !            20: #define        WIDTH           80
        !            21: #define        getbyte()       getc(ifp)
        !            22: #define        getword()       getw(ifp)
        !            23: 
        !            24: /* Forward. */
        !            25: long   getoffs();
        !            26: void   mkfmt();
        !            27: int    putasc();
        !            28: void   usage();
        !            29: int    val();
        !            30: 
        !            31: /* Globals. */
        !            32: int    base = DEFBASE;
        !            33: char   buf[BUFSIZ];
        !            34: FILE   *ifp;
        !            35: 
        !            36: main(argc, argv) int argc; char *argv[];
        !            37: {
        !            38:        register char *p;
        !            39:        register c, i;
        !            40:        long offs;
        !            41:        int bump, fc, mol, nof, nol, pw;
        !            42:        char afmt[10], pfmt[10];
        !            43:        int found;
        !            44: 
        !            45:        found = 0;
        !            46:        i = 1;
        !            47:        fc = DEFC;
        !            48:        if (i<argc && argv[i][0]=='-') {
        !            49:                p = &argv[i++][1];
        !            50:                while ((c = *p++) != 0) {
        !            51:                        switch (c) {
        !            52: 
        !            53:                        case 'b':
        !            54:                        case 'c':
        !            55:                        case 'd':
        !            56:                        case 'o':
        !            57:                        case 'x':
        !            58:                                if (found)
        !            59:                                        usage();
        !            60:                                fc = c;
        !            61:                                found++;
        !            62:                                break;
        !            63: 
        !            64:                        default:
        !            65:                                usage();
        !            66:                        }
        !            67:                }
        !            68:        }
        !            69:        setbuf(stdout, buf);
        !            70:        ifp = stdin;
        !            71:        nof = 0;
        !            72:        if (i < argc) {
        !            73:                ++nof;
        !            74:                if (*(p=argv[i++]) != '+') {
        !            75:                        nof = 0;
        !            76:                        if ((ifp=fopen(p, "rb")) == NULL) {
        !            77:                                fprintf(stderr, "%s: cannot open.\n", p);
        !            78:                                exit(1);
        !            79:                        }
        !            80:                        if (i<argc && argv[i][0]=='+') {
        !            81:                                ++i;
        !            82:                                ++nof;
        !            83:                        }
        !            84:                }
        !            85:        }
        !            86:        if (nof && i>=argc)
        !            87:                usage();
        !            88:        offs = 0;
        !            89:        if (i < argc) {
        !            90:                offs = getoffs(argv[i]);
        !            91:                fseek(ifp, offs, 0);
        !            92:        }
        !            93:        if (fc=='b' || fc=='c') {
        !            94:                bump = sizeof(char);
        !            95:                if (DEFC == 'o')
        !            96:                        pw = (NBCHAR+2) / 3; else
        !            97:                        pw = (NBCHAR+3) / 4;
        !            98:        } else {
        !            99:                bump = sizeof(int);
        !           100:                if (fc != 'x')
        !           101:                        pw = (NBINT+2) / 3; else
        !           102:                        pw = (NBINT+3) / 4;
        !           103:        }
        !           104:        mkfmt(pfmt, pw, fc);
        !           105:        if (DEFC == 'o')
        !           106:                mkfmt(afmt, (NBLONG+2)/3, 'O');
        !           107:        else
        !           108:                mkfmt(afmt, (NBLONG+3)/4, 'X');
        !           109:        for (mol=1; mol < (WIDTH-(NBLONG+2)/3)/(pw+1); mol<<=1)
        !           110:                ;
        !           111:        mol >>= 1;
        !           112:        nol = 0;
        !           113:        for (;;) {
        !           114:                c = (bump==sizeof(char)) ? getbyte() : getword();
        !           115:                if (ferror(ifp) && c != EOF)    /* partial read */
        !           116:                        clearerr(ifp);          /* treated as good */
        !           117:                else if (feof(ifp))
        !           118:                        break;
        !           119:                if (nol >= mol) {
        !           120:                        putchar('\n');
        !           121:                        nol = 0;
        !           122:                }
        !           123:                if (nol == 0)
        !           124:                        printf(afmt, offs);
        !           125:                if (fc!='c' || !putasc(c))
        !           126:                        printf(pfmt, c);
        !           127:                ++nol;
        !           128:                offs += bump;
        !           129:        }
        !           130:        if (nol != 0)
        !           131:                putchar('\n');
        !           132:        exit(0);
        !           133: }
        !           134: 
        !           135: /*
        !           136:  * Parse the offset at p (form [0[x]]dd*[.][b]) and return its value.
        !           137:  * Much ado about little.
        !           138:  */
        !           139: long
        !           140: getoffs(p) register char *p;
        !           141: {
        !           142:        register char *ep;
        !           143:        int bflag;
        !           144:        long offs;
        !           145: 
        !           146:        ep = &p[strlen(p) - 1];         /* pointer to last char of arg */
        !           147:        bflag = (*ep == 'b');           /* trailing b means blocks */
        !           148:        if (bflag)
        !           149:                *ep-- = '\0';
        !           150:        if (*ep == '.') {               /* trailing . means decimal */
        !           151:                *ep = '\0';
        !           152:                base = 10;
        !           153:        } else if (*p == '0') {
        !           154:                if (*++p == 'x') {      /* leading 0x means hex */
        !           155:                        ++p;
        !           156:                        base = 16;
        !           157:                } else                  /* leading 0 means octal */
        !           158:                        base = 8;
        !           159:        }
        !           160:        for (offs = 0; *p != '\0'; offs = base * offs + val(*p++))
        !           161:                ;
        !           162:        return (bflag) ? offs * BUFSIZ : offs;
        !           163: }
        !           164: 
        !           165: void
        !           166: mkfmt(p, w, c) register char *p; register int w, c;
        !           167: {
        !           168:        if (c >= 'a')
        !           169:                *p++ = ' ';
        !           170:        *p++ = '%';
        !           171:        if (c != 'd')
        !           172:                *p++ = '0';
        !           173:        if (w >= 10) {
        !           174:                *p++ = '1';
        !           175:                w -= 10;
        !           176:        }
        !           177:        *p++ = w+'0';
        !           178:        if (c=='b' || c=='c')
        !           179:                c = DEFC;
        !           180:        if (c >= 'A' && c <= 'Z') {
        !           181:                *p++ = 'l';
        !           182:                c += 'a' - 'A';
        !           183:        }
        !           184:        *p++ = c;
        !           185:        *p = 0;
        !           186: }
        !           187: 
        !           188: int
        !           189: putasc(c) register int c;
        !           190: {
        !           191:        register n;
        !           192: 
        !           193:        if (c>=' ' && c<='~') {
        !           194:                putchar(' ');
        !           195:                putchar(c);
        !           196:                if (DEFC == 'o')
        !           197:                        n = (NBCHAR+2)/3 - 1; else
        !           198:                        n = (NBCHAR+3)/4 - 1;
        !           199:                while (n--)
        !           200:                        putchar(' ');
        !           201:                return (1);
        !           202:        }
        !           203:        switch (c) {
        !           204: 
        !           205:        case '\0':
        !           206:                c = '0';
        !           207:                break;
        !           208: 
        !           209:        case '\b':
        !           210:                c = 'b';
        !           211:                break;
        !           212: 
        !           213:        case '\f':
        !           214:                c = 'f';
        !           215:                break;
        !           216: 
        !           217:        case '\n':
        !           218:                c = 'n';
        !           219:                break;
        !           220: 
        !           221:        case '\r':
        !           222:                c = 'r';
        !           223:                break;
        !           224: 
        !           225:        case '\t':
        !           226:                c = 't';
        !           227:                break;
        !           228: 
        !           229:        default:
        !           230:                return (0);
        !           231:        }
        !           232:        putchar(' ');
        !           233:        putchar('\\');
        !           234:        putchar(c);
        !           235:        if (DEFC == 'o')
        !           236:                n = (NBCHAR+2)/3 - 2; else
        !           237:                n = (NBCHAR+3)/4 - 2;
        !           238:        while (n--)
        !           239:                putchar(' ');
        !           240:        return (1);
        !           241: }
        !           242: 
        !           243: void
        !           244: usage()
        !           245: {
        !           246:        fprintf(stderr, "Usage: od [-bcdox] [file] [ [+] offset[.][b] ]\n");
        !           247:        exit(1);
        !           248: }
        !           249: 
        !           250: /*
        !           251:  * Given ASCII character c, return its integer value.
        !           252:  * Give a usage error if the character is illegal in the given base.
        !           253:  * Base must be 8, 10 or 16.
        !           254:  */
        !           255: int
        !           256: val(c) register int c;
        !           257: {
        !           258:        if (c >= '0' && c <= '7')
        !           259:                return c - '0';
        !           260:        else if (base == 8)
        !           261:                usage();
        !           262:        else if (c == '8' || c == '9')
        !           263:                return c - '0';
        !           264:        else if (base == 10)
        !           265:                usage();
        !           266:        else if (c >= 'a' && c <= 'f')
        !           267:                return c + 10 - 'a';
        !           268:        else if (c >= 'A' && c <= 'F')
        !           269:                return c + 10 - 'A';
        !           270:        else
        !           271:                usage();
        !           272: }
        !           273: 
        !           274: /* end of od.c */

unix.superglobalmegacorp.com

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