Annotation of researchv9/cmd/dd.c, revision 1.1

1.1     ! root        1: #include <stdio.h>
        !             2: #include <signal.h>
        !             3: 
        !             4: #define        BIG     2147483647
        !             5: #define        LCASE   01
        !             6: #define        UCASE   02
        !             7: #define        SWAB    04
        !             8: #define NERR   010
        !             9: #define SYNC   020
        !            10: int    cflag;
        !            11: int    fflag;
        !            12: int    skip;
        !            13: int    oseekn;
        !            14: int    iseekn;
        !            15: int    count;
        !            16: int    files   = 1;
        !            17: char   *string;
        !            18: char   *ifile;
        !            19: char   *ofile;
        !            20: char   *ibuf;
        !            21: char   *obuf;
        !            22: char   *sbrk();
        !            23: int    ibs     = 512;
        !            24: int    obs     = 512;
        !            25: int    bs;
        !            26: int    cbs;
        !            27: int    ibc;
        !            28: int    obc;
        !            29: int    cbc;
        !            30: int    nifr;
        !            31: int    nipr;
        !            32: int    nofr;
        !            33: int    nopr;
        !            34: int    ntrunc;
        !            35: int    ibf;
        !            36: int    obf;
        !            37: char   *op;
        !            38: int    nspace;
        !            39: char   etoa[] = {
        !            40:        0000,0001,0002,0003,0234,0011,0206,0177,
        !            41:        0227,0215,0216,0013,0014,0015,0016,0017,
        !            42:        0020,0021,0022,0023,0235,0205,0010,0207,
        !            43:        0030,0031,0222,0217,0034,0035,0036,0037,
        !            44:        0200,0201,0202,0203,0204,0012,0027,0033,
        !            45:        0210,0211,0212,0213,0214,0005,0006,0007,
        !            46:        0220,0221,0026,0223,0224,0225,0226,0004,
        !            47:        0230,0231,0232,0233,0024,0025,0236,0032,
        !            48:        0040,0240,0241,0242,0243,0244,0245,0246,
        !            49:        0247,0250,0133,0056,0074,0050,0053,0041,
        !            50:        0046,0251,0252,0253,0254,0255,0256,0257,
        !            51:        0260,0261,0135,0044,0052,0051,0073,0136,
        !            52:        0055,0057,0262,0263,0264,0265,0266,0267,
        !            53:        0270,0271,0174,0054,0045,0137,0076,0077,
        !            54:        0272,0273,0274,0275,0276,0277,0300,0301,
        !            55:        0302,0140,0072,0043,0100,0047,0075,0042,
        !            56:        0303,0141,0142,0143,0144,0145,0146,0147,
        !            57:        0150,0151,0304,0305,0306,0307,0310,0311,
        !            58:        0312,0152,0153,0154,0155,0156,0157,0160,
        !            59:        0161,0162,0313,0314,0315,0316,0317,0320,
        !            60:        0321,0176,0163,0164,0165,0166,0167,0170,
        !            61:        0171,0172,0322,0323,0324,0325,0326,0327,
        !            62:        0330,0331,0332,0333,0334,0335,0336,0337,
        !            63:        0340,0341,0342,0343,0344,0345,0346,0347,
        !            64:        0173,0101,0102,0103,0104,0105,0106,0107,
        !            65:        0110,0111,0350,0351,0352,0353,0354,0355,
        !            66:        0175,0112,0113,0114,0115,0116,0117,0120,
        !            67:        0121,0122,0356,0357,0360,0361,0362,0363,
        !            68:        0134,0237,0123,0124,0125,0126,0127,0130,
        !            69:        0131,0132,0364,0365,0366,0367,0370,0371,
        !            70:        0060,0061,0062,0063,0064,0065,0066,0067,
        !            71:        0070,0071,0372,0373,0374,0375,0376,0377,
        !            72: };
        !            73: char   atoe[] = {
        !            74:        0000,0001,0002,0003,0067,0055,0056,0057,
        !            75:        0026,0005,0045,0013,0014,0015,0016,0017,
        !            76:        0020,0021,0022,0023,0074,0075,0062,0046,
        !            77:        0030,0031,0077,0047,0034,0035,0036,0037,
        !            78:        0100,0117,0177,0173,0133,0154,0120,0175,
        !            79:        0115,0135,0134,0116,0153,0140,0113,0141,
        !            80:        0360,0361,0362,0363,0364,0365,0366,0367,
        !            81:        0370,0371,0172,0136,0114,0176,0156,0157,
        !            82:        0174,0301,0302,0303,0304,0305,0306,0307,
        !            83:        0310,0311,0321,0322,0323,0324,0325,0326,
        !            84:        0327,0330,0331,0342,0343,0344,0345,0346,
        !            85:        0347,0350,0351,0112,0340,0132,0137,0155,
        !            86:        0171,0201,0202,0203,0204,0205,0206,0207,
        !            87:        0210,0211,0221,0222,0223,0224,0225,0226,
        !            88:        0227,0230,0231,0242,0243,0244,0245,0246,
        !            89:        0247,0250,0251,0300,0152,0320,0241,0007,
        !            90:        0040,0041,0042,0043,0044,0025,0006,0027,
        !            91:        0050,0051,0052,0053,0054,0011,0012,0033,
        !            92:        0060,0061,0032,0063,0064,0065,0066,0010,
        !            93:        0070,0071,0072,0073,0004,0024,0076,0341,
        !            94:        0101,0102,0103,0104,0105,0106,0107,0110,
        !            95:        0111,0121,0122,0123,0124,0125,0126,0127,
        !            96:        0130,0131,0142,0143,0144,0145,0146,0147,
        !            97:        0150,0151,0160,0161,0162,0163,0164,0165,
        !            98:        0166,0167,0170,0200,0212,0213,0214,0215,
        !            99:        0216,0217,0220,0232,0233,0234,0235,0236,
        !           100:        0237,0240,0252,0253,0254,0255,0256,0257,
        !           101:        0260,0261,0262,0263,0264,0265,0266,0267,
        !           102:        0270,0271,0272,0273,0274,0275,0276,0277,
        !           103:        0312,0313,0314,0315,0316,0317,0332,0333,
        !           104:        0334,0335,0336,0337,0352,0353,0354,0355,
        !           105:        0356,0357,0372,0373,0374,0375,0376,0377,
        !           106: };
        !           107: char   atoibm[] =
        !           108: {
        !           109:        0000,0001,0002,0003,0067,0055,0056,0057,
        !           110:        0026,0005,0045,0013,0014,0015,0016,0017,
        !           111:        0020,0021,0022,0023,0074,0075,0062,0046,
        !           112:        0030,0031,0077,0047,0034,0035,0036,0037,
        !           113:        0100,0132,0177,0173,0133,0154,0120,0175,
        !           114:        0115,0135,0134,0116,0153,0140,0113,0141,
        !           115:        0360,0361,0362,0363,0364,0365,0366,0367,
        !           116:        0370,0371,0172,0136,0114,0176,0156,0157,
        !           117:        0174,0301,0302,0303,0304,0305,0306,0307,
        !           118:        0310,0311,0321,0322,0323,0324,0325,0326,
        !           119:        0327,0330,0331,0342,0343,0344,0345,0346,
        !           120:        0347,0350,0351,0255,0340,0275,0137,0155,
        !           121:        0171,0201,0202,0203,0204,0205,0206,0207,
        !           122:        0210,0211,0221,0222,0223,0224,0225,0226,
        !           123:        0227,0230,0231,0242,0243,0244,0245,0246,
        !           124:        0247,0250,0251,0300,0117,0320,0241,0007,
        !           125:        0040,0041,0042,0043,0044,0025,0006,0027,
        !           126:        0050,0051,0052,0053,0054,0011,0012,0033,
        !           127:        0060,0061,0032,0063,0064,0065,0066,0010,
        !           128:        0070,0071,0072,0073,0004,0024,0076,0341,
        !           129:        0101,0102,0103,0104,0105,0106,0107,0110,
        !           130:        0111,0121,0122,0123,0124,0125,0126,0127,
        !           131:        0130,0131,0142,0143,0144,0145,0146,0147,
        !           132:        0150,0151,0160,0161,0162,0163,0164,0165,
        !           133:        0166,0167,0170,0200,0212,0213,0214,0215,
        !           134:        0216,0217,0220,0232,0233,0234,0235,0236,
        !           135:        0237,0240,0252,0253,0254,0255,0256,0257,
        !           136:        0260,0261,0262,0263,0264,0265,0266,0267,
        !           137:        0270,0271,0272,0273,0274,0275,0276,0277,
        !           138:        0312,0313,0314,0315,0316,0317,0332,0333,
        !           139:        0334,0335,0336,0337,0352,0353,0354,0355,
        !           140:        0356,0357,0372,0373,0374,0375,0376,0377,
        !           141: };
        !           142: 
        !           143: 
        !           144: main(argc, argv)
        !           145: int    argc;
        !           146: char   **argv;
        !           147: {
        !           148:        int (*conv)();
        !           149:        register char *ip;
        !           150:        register c;
        !           151:        int ebcdic(), ibm(), ascii(), null(), cnull(), term(), block(), unblock();
        !           152:        int a;
        !           153: 
        !           154:        conv = null;
        !           155:        for(c=1; c<argc; c++) {
        !           156:                string = argv[c];
        !           157:                if(match("ibs=")) {
        !           158:                        ibs = number(BIG);
        !           159:                        continue;
        !           160:                }
        !           161:                if(match("obs=")) {
        !           162:                        obs = number(BIG);
        !           163:                        continue;
        !           164:                }
        !           165:                if(match("cbs=")) {
        !           166:                        cbs = number(BIG);
        !           167:                        continue;
        !           168:                }
        !           169:                if (match("bs=")) {
        !           170:                        bs = number(BIG);
        !           171:                        continue;
        !           172:                }
        !           173:                if(match("if=")) {
        !           174:                        ifile = string;
        !           175:                        continue;
        !           176:                }
        !           177:                if(match("of=")) {
        !           178:                        ofile = string;
        !           179:                        continue;
        !           180:                }
        !           181:                if(match("skip=")) {
        !           182:                        skip = number(BIG);
        !           183:                        continue;
        !           184:                }
        !           185:                if(match("seek=") || match("oseek=")) {
        !           186:                        oseekn = number(BIG);
        !           187:                        continue;
        !           188:                }
        !           189:                if(match("iseek=")) {
        !           190:                        iseekn = number(BIG);
        !           191:                        continue;
        !           192:                }
        !           193:                if(match("count=")) {
        !           194:                        count = number(BIG);
        !           195:                        continue;
        !           196:                }
        !           197:                if(match("files=")) {
        !           198:                        files = number(BIG);
        !           199:                        continue;
        !           200:                }
        !           201:                if(match("conv=")) {
        !           202:                cloop:
        !           203:                        if(match(","))
        !           204:                                goto cloop;
        !           205:                        if(*string == '\0')
        !           206:                                continue;
        !           207:                        if(match("ebcdic")) {
        !           208:                                conv = ebcdic;
        !           209:                                goto cloop;
        !           210:                        }
        !           211:                        if(match("ibm")) {
        !           212:                                conv = ibm;
        !           213:                                goto cloop;
        !           214:                        }
        !           215:                        if(match("ascii")) {
        !           216:                                conv = ascii;
        !           217:                                goto cloop;
        !           218:                        }
        !           219:                        if(match("block")) {
        !           220:                                conv = block;
        !           221:                                goto cloop;
        !           222:                        }
        !           223:                        if(match("unblock")) {
        !           224:                                conv = unblock;
        !           225:                                goto cloop;
        !           226:                        }
        !           227:                        if(match("lcase")) {
        !           228:                                cflag |= LCASE;
        !           229:                                goto cloop;
        !           230:                        }
        !           231:                        if(match("ucase")) {
        !           232:                                cflag |= UCASE;
        !           233:                                goto cloop;
        !           234:                        }
        !           235:                        if(match("swab")) {
        !           236:                                cflag |= SWAB;
        !           237:                                goto cloop;
        !           238:                        }
        !           239:                        if(match("noerror")) {
        !           240:                                cflag |= NERR;
        !           241:                                goto cloop;
        !           242:                        }
        !           243:                        if(match("sync")) {
        !           244:                                cflag |= SYNC;
        !           245:                                goto cloop;
        !           246:                        }
        !           247:                }
        !           248:                fprintf(stderr,"bad arg: %s\n", string);
        !           249:                exit(1);
        !           250:        }
        !           251:        if(conv == null && cflag&(LCASE|UCASE))
        !           252:                conv = cnull;
        !           253:        if (ifile)
        !           254:                ibf = open(ifile, 0);
        !           255:        else
        !           256:                ibf = dup(0);
        !           257:        if(ibf < 0) {
        !           258:                fprintf(stderr,"cannot open: %s\n", ifile);
        !           259:                exit(1);
        !           260:        }
        !           261:        if (ofile)
        !           262:                obf = creat(ofile, 0666);
        !           263:        else
        !           264:                obf = dup(1);
        !           265:        if(obf < 0) {
        !           266:                fprintf(stderr,"cannot create: %s\n", ofile);
        !           267:                exit(1);
        !           268:        }
        !           269:        if (bs)
        !           270:                ibs = obs = bs;
        !           271:        if (ibs == obs && conv == null)
        !           272:                fflag++;
        !           273:        if(ibs == 0 || obs == 0) {
        !           274:                fprintf(stderr,"counts: cannot be zero\n");
        !           275:                exit(1);
        !           276:        }
        !           277:        ibuf = sbrk(ibs);
        !           278:        if (fflag)
        !           279:                obuf = ibuf;
        !           280:        else
        !           281:                obuf = sbrk(obs);
        !           282:        sbrk(64);       /* For good measure */
        !           283:        if(ibuf == (char *)-1 || obuf == (char *)-1) {
        !           284:                fprintf(stderr, "not enough memory\n");
        !           285:                exit(1);
        !           286:        }
        !           287:        ibc = 0;
        !           288:        obc = 0;
        !           289:        cbc = 0;
        !           290:        op = obuf;
        !           291: 
        !           292:        if (signal(SIGINT, SIG_IGN) != SIG_IGN)
        !           293:                signal(SIGINT, term);
        !           294:        lseek(obf, (long)obs*oseekn, 1);
        !           295:        lseek(ibf, (long)ibs*iseekn, 1);
        !           296:        while(skip) {
        !           297:                read(ibf, ibuf, ibs);
        !           298:                skip--;
        !           299:        }
        !           300: 
        !           301: loop:
        !           302:        if(ibc-- == 0) {
        !           303:                ibc = 0;
        !           304:                if(count==0 || nifr+nipr!=count) {
        !           305:                        if(cflag&(NERR|SYNC))
        !           306:                        for(ip=ibuf+ibs; ip>ibuf;)
        !           307:                                *--ip = 0;
        !           308:                        ibc = read(ibf, ibuf, ibs);
        !           309:                }
        !           310:                if(ibc == -1) {
        !           311:                        perror("read");
        !           312:                        if((cflag&NERR) == 0) {
        !           313:                                flsh();
        !           314:                                term();
        !           315:                        }
        !           316:                        ibc = 0;
        !           317:                        for(c=0; c<ibs; c++)
        !           318:                                if(ibuf[c] != 0)
        !           319:                                        ibc = c;
        !           320:                        stats();
        !           321:                }
        !           322:                if(ibc == 0 && --files<=0) {
        !           323:                        flsh();
        !           324:                        term();
        !           325:                }
        !           326:                if(ibc != ibs) {
        !           327:                        nipr++;
        !           328:                        if(cflag&SYNC)
        !           329:                                ibc = ibs;
        !           330:                } else
        !           331:                        nifr++;
        !           332:                ip = ibuf;
        !           333:                c = (ibc>>1) & ~1;
        !           334:                if(cflag&SWAB && c)
        !           335:                do {
        !           336:                        a = *ip++;
        !           337:                        ip[-1] = *ip;
        !           338:                        *ip++ = a;
        !           339:                } while(--c);
        !           340:                ip = ibuf;
        !           341:                if (fflag) {
        !           342:                        obc = ibc;
        !           343:                        flsh();
        !           344:                        ibc = 0;
        !           345:                }
        !           346:                goto loop;
        !           347:        }
        !           348:        c = 0;
        !           349:        c |= *ip++;
        !           350:        c &= 0377;
        !           351:        (*conv)(c);
        !           352:        goto loop;
        !           353: }
        !           354: 
        !           355: flsh()
        !           356: {
        !           357:        register c;
        !           358: 
        !           359:        if(obc) {
        !           360:                if(obc == obs)
        !           361:                        nofr++; else
        !           362:                        nopr++;
        !           363:                c = write(obf, obuf, obc);
        !           364:                if(c != obc) {
        !           365:                        perror("write");
        !           366:                        term();
        !           367:                }
        !           368:                obc = 0;
        !           369:        }
        !           370: }
        !           371: 
        !           372: match(s)
        !           373: char *s;
        !           374: {
        !           375:        register char *cs;
        !           376: 
        !           377:        cs = string;
        !           378:        while(*cs++ == *s)
        !           379:                if(*s++ == '\0')
        !           380:                        goto true;
        !           381:        if(*s != '\0')
        !           382:                return(0);
        !           383: 
        !           384: true:
        !           385:        cs--;
        !           386:        string = cs;
        !           387:        return(1);
        !           388: }
        !           389: 
        !           390: number(big)
        !           391: {
        !           392:        register char *cs;
        !           393:        long n;
        !           394: 
        !           395:        cs = string;
        !           396:        n = 0;
        !           397:        while(*cs >= '0' && *cs <= '9')
        !           398:                n = n*10 + *cs++ - '0';
        !           399:        for(;;)
        !           400:        switch(*cs++) {
        !           401: 
        !           402:        case 'k':
        !           403:                n *= 1024;
        !           404:                continue;
        !           405: 
        !           406:        case 'w':
        !           407:                n *= sizeof(int);
        !           408:                continue;
        !           409: 
        !           410:        case 'b':
        !           411:                n *= 512;
        !           412:                continue;
        !           413: 
        !           414:        case '*':
        !           415:        case 'x':
        !           416:                string = cs;
        !           417:                n *= number(BIG);
        !           418: 
        !           419:        case '\0':
        !           420:                if (n>=big || n<0) {
        !           421:                        fprintf(stderr, "dd: argument %D out of range\n", n);
        !           422:                        exit(1);
        !           423:                }
        !           424:                return(n);
        !           425:        }
        !           426:        /* never gets here */
        !           427: }
        !           428: 
        !           429: cnull(cc)
        !           430: {
        !           431:        register c;
        !           432: 
        !           433:        c = cc;
        !           434:        if(cflag&UCASE && c>='a' && c<='z')
        !           435:                c += 'A'-'a';
        !           436:        if(cflag&LCASE && c>='A' && c<='Z')
        !           437:                c += 'a'-'A';
        !           438:        null(c);
        !           439: }
        !           440: 
        !           441: null(c)
        !           442: {
        !           443: 
        !           444:        *op = c;
        !           445:        op++;
        !           446:        if(++obc >= obs) {
        !           447:                flsh();
        !           448:                op = obuf;
        !           449:        }
        !           450: }
        !           451: 
        !           452: ascii(cc)
        !           453: {
        !           454:        register c;
        !           455: 
        !           456:        c = etoa[cc] & 0377;
        !           457:        if(cbs == 0) {
        !           458:                cnull(c);
        !           459:                return;
        !           460:        }
        !           461:        if(c == ' ') {
        !           462:                nspace++;
        !           463:                goto out;
        !           464:        }
        !           465:        while(nspace > 0) {
        !           466:                null(' ');
        !           467:                nspace--;
        !           468:        }
        !           469:        cnull(c);
        !           470: 
        !           471: out:
        !           472:        if(++cbc >= cbs) {
        !           473:                null('\n');
        !           474:                cbc = 0;
        !           475:                nspace = 0;
        !           476:        }
        !           477: }
        !           478: 
        !           479: unblock(cc)
        !           480: {
        !           481:        register c;
        !           482: 
        !           483:        c = cc & 0377;
        !           484:        if(cbs == 0) {
        !           485:                cnull(c);
        !           486:                return;
        !           487:        }
        !           488:        if(c == ' ') {
        !           489:                nspace++;
        !           490:                goto out;
        !           491:        }
        !           492:        while(nspace > 0) {
        !           493:                null(' ');
        !           494:                nspace--;
        !           495:        }
        !           496:        cnull(c);
        !           497: 
        !           498: out:
        !           499:        if(++cbc >= cbs) {
        !           500:                null('\n');
        !           501:                cbc = 0;
        !           502:                nspace = 0;
        !           503:        }
        !           504: }
        !           505: 
        !           506: ebcdic(cc)
        !           507: {
        !           508:        register c;
        !           509: 
        !           510:        c = cc;
        !           511:        if(cflag&UCASE && c>='a' && c<='z')
        !           512:                c += 'A'-'a';
        !           513:        if(cflag&LCASE && c>='A' && c<='Z')
        !           514:                c += 'a'-'A';
        !           515:        c = atoe[c] & 0377;
        !           516:        if(cbs == 0) {
        !           517:                null(c);
        !           518:                return;
        !           519:        }
        !           520:        if(cc == '\n') {
        !           521:                while(cbc < cbs) {
        !           522:                        null(atoe[' ']);
        !           523:                        cbc++;
        !           524:                }
        !           525:                cbc = 0;
        !           526:                return;
        !           527:        }
        !           528:        if(cbc == cbs)
        !           529:                ntrunc++;
        !           530:        cbc++;
        !           531:        if(cbc <= cbs)
        !           532:                null(c);
        !           533: }
        !           534: 
        !           535: ibm(cc)
        !           536: {
        !           537:        register c;
        !           538: 
        !           539:        c = cc;
        !           540:        if(cflag&UCASE && c>='a' && c<='z')
        !           541:                c += 'A'-'a';
        !           542:        if(cflag&LCASE && c>='A' && c<='Z')
        !           543:                c += 'a'-'A';
        !           544:        c = atoibm[c] & 0377;
        !           545:        if(cbs == 0) {
        !           546:                null(c);
        !           547:                return;
        !           548:        }
        !           549:        if(cc == '\n') {
        !           550:                while(cbc < cbs) {
        !           551:                        null(atoibm[' ']);
        !           552:                        cbc++;
        !           553:                }
        !           554:                cbc = 0;
        !           555:                return;
        !           556:        }
        !           557:        if(cbc == cbs)
        !           558:                ntrunc++;
        !           559:        cbc++;
        !           560:        if(cbc <= cbs)
        !           561:                null(c);
        !           562: }
        !           563: 
        !           564: block(cc)
        !           565: {
        !           566:        register c;
        !           567: 
        !           568:        c = cc;
        !           569:        if(cflag&UCASE && c>='a' && c<='z')
        !           570:                c += 'A'-'a';
        !           571:        if(cflag&LCASE && c>='A' && c<='Z')
        !           572:                c += 'a'-'A';
        !           573:        c &= 0377;
        !           574:        if(cbs == 0) {
        !           575:                null(c);
        !           576:                return;
        !           577:        }
        !           578:        if(cc == '\n') {
        !           579:                while(cbc < cbs) {
        !           580:                        null(' ');
        !           581:                        cbc++;
        !           582:                }
        !           583:                cbc = 0;
        !           584:                return;
        !           585:        }
        !           586:        if(cbc == cbs)
        !           587:                ntrunc++;
        !           588:        cbc++;
        !           589:        if(cbc <= cbs)
        !           590:                null(c);
        !           591: }
        !           592: 
        !           593: term()
        !           594: {
        !           595: 
        !           596:        stats();
        !           597:        exit(0);
        !           598: }
        !           599: 
        !           600: stats()
        !           601: {
        !           602: 
        !           603:        fprintf(stderr,"%u+%u records in\n", nifr, nipr);
        !           604:        fprintf(stderr,"%u+%u records out\n", nofr, nopr);
        !           605:        if(ntrunc)
        !           606:                fprintf(stderr,"%u truncated records\n", ntrunc);
        !           607: }

unix.superglobalmegacorp.com

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