Annotation of researchv8dc/cmd/file.c, revision 1.1.1.1

1.1       root        1: static char sccsid[] = "@(#)file.c 4.1 10/1/80";
                      2: /*
                      3:  * file - determine type of file
                      4:  */
                      5: 
                      6: #include <pagsiz.h>
                      7: #include <sys/types.h>
                      8: #include <sys/stat.h>
                      9: #include <stdio.h>
                     10: #include <ctype.h>
                     11: #include <a.out.h>
                     12: int in;
                     13: int i  = 0;
                     14: char buf[BUFSIZ];
                     15: char *troff[] = {      /* new troff intermediate lang */
                     16:        "x","T","res","init","font","202","V0","p1",0};
                     17: char *fort[] = {
                     18:        "function","subroutine","common","dimension","block","integer",
                     19:        "real","data","double",0};
                     20: char *asc[] = {
                     21:        "chmk","mov","tst","clr","jmp",0};
                     22: char *c[] = {
                     23:        "int","char","float","double","struct","extern",0};
                     24: char *as[] = {
                     25:        "globl","byte","align","text","data","comm",0};
                     26: int    ifile;
                     27: 
                     28: main(argc, argv)
                     29: char **argv;
                     30: {
                     31:        FILE *fl;
                     32:        register char *p;
                     33:        char ap[128];
                     34:        extern char _sobuf[];
                     35: 
                     36:        if (argc>1 && argv[1][0]=='-' && argv[1][1]=='f') {
                     37:                if ((fl = fopen(argv[2], "r")) == NULL) {
                     38:                        printf("Can't open %s\n", argv[2]);
                     39:                        exit(2);
                     40:                }
                     41:                while ((p = fgets(ap, 128, fl)) != NULL) {
                     42:                        int l = strlen(p);
                     43:                        if (l>0)
                     44:                                p[l-1] = '\0';
                     45:                        printf("%s:     ", p);
                     46:                        type(p);
                     47:                        if (ifile>=0)
                     48:                                close(ifile);
                     49:                }
                     50:                exit(1);
                     51:        }
                     52:        while(argc > 1) {
                     53:                printf("%s:     ", argv[1]);
                     54:                type(argv[1]);
                     55:                fflush(stdout);
                     56:                argc--;
                     57:                argv++;
                     58:                if (ifile >= 0)
                     59:                        close(ifile);
                     60:        }
                     61: }
                     62: 
                     63: type(file)
                     64: char *file;
                     65: {
                     66:        int j,nl;
                     67:        char ch;
                     68:        struct stat mbuf;
                     69: 
                     70:        ifile = -1;
                     71:        if(stat(file, &mbuf) < 0) {
                     72:                printf("cannot stat\n");
                     73:                return;
                     74:        }
                     75:        switch (mbuf.st_mode & S_IFMT) {
                     76: 
                     77:        case S_IFCHR:
                     78:                printf("character");
                     79:                goto spcl;
                     80: 
                     81:        case S_IFDIR:
                     82:                printf("directory\n");
                     83:                return;
                     84: 
                     85:        case S_IFBLK:
                     86:                printf("block");
                     87: 
                     88: spcl:
                     89:                printf(" special (%d/%d)\n", major(mbuf.st_rdev), minor(mbuf.st_rdev));
                     90:                return;
                     91:        }
                     92: 
                     93:        ifile = open(file, 0);
                     94:        if(ifile < 0) {
                     95:                printf("cannot open\n");
                     96:                return;
                     97:        }
                     98:        in = read(ifile, buf, BUFSIZ);
                     99:        if(in == 0){
                    100:                printf("empty\n");
                    101:                return;
                    102:        }
                    103: 
                    104:        if(in>=64){
                    105: 
                    106:                int i, bucket[8];
                    107:                float cs;
                    108: 
                    109:                for(i=0; i<8; i++) bucket[i] = 0;
                    110: 
                    111:                for(i=0; i<64; i++) bucket[(buf[i]>>5)&07] += 1;
                    112: 
                    113:                cs = 0.;
                    114:                for(i=0; i<8; i++) cs += (bucket[i]-8)*(bucket[i]-8);
                    115:                cs /= 8.;
                    116: 
                    117:                if(cs <= 24.322){
                    118: 
                    119:                        printf("encrypted\n");
                    120:                        return;
                    121:                }
                    122:        }
                    123: 
                    124:        switch (*(short *) buf)
                    125:        {
                    126:        case 070707:
                    127: cpio:
                    128:                printf("cpio archive\n");
                    129:                goto out;
                    130:        }
                    131: 
                    132:        switch(*(int *)buf)
                    133:        {
                    134:        case 0413:
                    135:                printf("demand paged ");
                    136: 
                    137:        case 0410:
                    138:                printf("pure ");
                    139:                goto exec;
                    140: 
                    141:        case 0411:
                    142:                printf("jfr 411 executable\n");
                    143:                return;
                    144:        
                    145:        case 0406:
                    146:                printf ("mpx 68000 ");
                    147:                goto exec;
                    148: 
                    149:        case 0407:
                    150: exec:
                    151:                printf("executable");
                    152:                if(((int *)buf)[4] != 0) {
                    153:                        printf(" not stripped");
                    154:                        if(oldo(buf))
                    155:                                printf(" (old format symbol table)");
                    156:                }
                    157:                printf("\n");
                    158:                goto out;
                    159: 
                    160:        case 0177555:
                    161:                printf("very old archive\n");
                    162:                goto out;
                    163: 
                    164:        case 0177545:
                    165:                printf("old archive\n");
                    166:                goto out;
                    167: 
                    168:        case 0135246:           /* andrew/ehg */
                    169:                printf("view2d input file\n");
                    170:                goto out;
                    171: 
                    172:        case 0135256:           /* andrew */
                    173:                printf("apl file\n");
                    174:                goto out;
                    175: 
                    176:        default:
                    177:                switch (*(short *) buf+1) {
                    178:                case 0405:
                    179:                case 0407:
                    180:                case 0410:
                    181:                case 0411:
                    182:                        printf ("pdp-11 executable\n");
                    183:                        goto out;
                    184:                }
                    185:        }
                    186: 
                    187:        if(strncmp(buf, "!<arch>\n__.SYMDEF", 17) == 0 ) {
                    188:                printf("archive random library\n");
                    189:                goto out;
                    190:        }
                    191:        if (strncmp(buf, "!<arch>\n", 8)==0) {
                    192:                printf("archive\n");
                    193:                goto out;
                    194:        }
                    195:        if (strncmp(buf, "070707", 6) == 0)
                    196:        {
                    197:                printf("ascii ");
                    198:                goto cpio;
                    199:        }
                    200:        i = 0;
                    201:        if(ccom() == 0)goto notc;
                    202:        while(buf[i] == '#'){
                    203:                j = i;
                    204:                while(buf[i++] != '\n'){
                    205:                        if(i - j > 255){
                    206:                                printf("data\n"); 
                    207:                                goto out;
                    208:                        }
                    209:                        if(i >= in)goto notc;
                    210:                }
                    211:                if(ccom() == 0)goto notc;
                    212:        }
                    213: check:
                    214:        if(lookup(c) == 1){
                    215:                while((ch = buf[i++]) != ';' && ch != '{')if(i >= in)goto notc;
                    216:                printf("c program text");
                    217:                goto outa;
                    218:        }
                    219:        nl = 0;
                    220:        while(buf[i] != '('){
                    221:                if(buf[i] <= 0)
                    222:                        goto notas;
                    223:                if(buf[i] == ';'){
                    224:                        i++; 
                    225:                        goto check; 
                    226:                }
                    227:                if(buf[i++] == '\n')
                    228:                        if(nl++ > 6)goto notc;
                    229:                if(i >= in)goto notc;
                    230:        }
                    231:        while(buf[i] != ')'){
                    232:                if(buf[i++] == '\n')
                    233:                        if(nl++ > 6)goto notc;
                    234:                if(i >= in)goto notc;
                    235:        }
                    236:        while(buf[i] != '{'){
                    237:                if(buf[i++] == '\n')
                    238:                        if(nl++ > 6)goto notc;
                    239:                if(i >= in)goto notc;
                    240:        }
                    241:        printf("c program text");
                    242:        goto outa;
                    243: notc:
                    244:        i = 0;
                    245:        while(buf[i] == 'c' || buf[i] == '#'){
                    246:                while(buf[i++] != '\n')if(i >= in)goto notfort;
                    247:        }
                    248:        if(lookup(fort) == 1){
                    249:                printf("fortran program text");
                    250:                goto outa;
                    251:        }
                    252: notfort:
                    253:        i=0;
                    254:        if(ascom() == 0)goto notas;
                    255:        j = i-1;
                    256:        if(buf[i] == '.'){
                    257:                i++;
                    258:                if(lookup(as) == 1){
                    259:                        printf("assembler program text"); 
                    260:                        goto outa;
                    261:                }
                    262:                else if(buf[j] == '\n' && isalpha(buf[j+2])){
                    263:                        printf("roff, nroff, or eqn input text");
                    264:                        goto outa;
                    265:                }
                    266:        }
                    267:        while(lookup(asc) == 0){
                    268:                if(ascom() == 0)goto notas;
                    269:                while(buf[i] != '\n' && buf[i++] != ':')
                    270:                        if(i >= in)goto notas;
                    271:                while(buf[i] == '\n' || buf[i] == ' ' || buf[i] == '\t')if(i++ >= in)goto notas;
                    272:                j = i-1;
                    273:                if(buf[i] == '.'){
                    274:                        i++;
                    275:                        if(lookup(as) == 1){
                    276:                                printf("assembler program text"); 
                    277:                                goto outa; 
                    278:                        }
                    279:                        else if(buf[j] == '\n' && isalpha(buf[j+2])){
                    280:                                printf("roff, nroff, or eqn input text");
                    281:                                goto outa;
                    282:                        }
                    283:                }
                    284:        }
                    285:        printf("assembler program text");
                    286:        goto outa;
                    287: notas:
                    288:        for(i=0; i < in; i++)if(buf[i]&0200){
                    289:                if (buf[0]=='\100' && buf[1]=='\357') {
                    290:                        printf("troff (CAT) output\n");
                    291:                        goto out;
                    292:                }
                    293:                if(buf[0] == 037 && buf[1] == 036){
                    294:                        char *p = file;
                    295:                        while(*p++);
                    296:                        if(*(p-2) != 'z' || *(p-3) != '.')
                    297:                                printf("probably ");
                    298:                        printf("packed\n");
                    299:                        goto out;
                    300:                }
                    301:                printf("data\n"); 
                    302:                goto out; 
                    303:        }
                    304:        if (mbuf.st_mode&((S_IEXEC)|(S_IEXEC>>3)|(S_IEXEC>>6)))
                    305:                printf("commands text");
                    306:        else if (troffint(buf, in))
                    307:                printf("troff intermediate output text");
                    308:        else if (english(buf, in))
                    309:                printf("English text");
                    310:        else
                    311:                printf("ascii text");
                    312: outa:
                    313:        while(i < in)
                    314:                if((buf[i++]&0377) > 127){
                    315:                        printf(" with garbage\n");
                    316:                        goto out;
                    317:                }
                    318:        /* if next few lines in then read whole file looking for nulls ...
                    319:                while((in = read(ifile,buf,BUFSIZ)) > 0)
                    320:                        for(i = 0; i < in; i++)
                    321:                                if((buf[i]&0377) > 127){
                    322:                                        printf(" with garbage\n");
                    323:                                        goto out;
                    324:                                }
                    325:                /*.... */
                    326:        printf("\n");
                    327: out:;
                    328: }
                    329: 
                    330: oldo(cp)
                    331: char *cp;
                    332: {
                    333:        struct exec ex;
                    334:        struct stat stb;
                    335: 
                    336:        ex = *(struct exec *)cp;
                    337:        if (fstat(ifile, &stb) < 0)
                    338:                return(0);
                    339:        if (N_STROFF(ex)+sizeof(off_t) > stb.st_size)
                    340:                return (1);
                    341:        return (0);
                    342: }
                    343: 
                    344: 
                    345: 
                    346: troffint(bp, n)
                    347: char *bp;
                    348: int n;
                    349: {
                    350:        int k;
                    351: 
                    352:        i = 0;
                    353:        for (k = 0; k < 6; k++) {
                    354:                if (lookup(troff) == 0)
                    355:                        return(0);
                    356:                if (lookup(troff) == 0)
                    357:                        return(0);
                    358:                while (i < n && buf[i] != '\n')
                    359:                        i++;
                    360:                if (i++ >= n)
                    361:                        return(0);
                    362:        }
                    363:        return(1);
                    364: }
                    365: lookup(tab)
                    366: char *tab[];
                    367: {
                    368:        char r;
                    369:        int k,j,l;
                    370:        while(buf[i] == ' ' || buf[i] == '\t' || buf[i] == '\n')i++;
                    371:        for(j=0; tab[j] != 0; j++){
                    372:                l=0;
                    373:                for(k=i; ((r=tab[j][l++]) == buf[k] && r != '\0');k++);
                    374:                if(r == '\0')
                    375:                        if(buf[k] == ' ' || buf[k] == '\n' || buf[k] == '\t'
                    376:                            || buf[k] == '{' || buf[k] == '/'){
                    377:                                i=k;
                    378:                                return(1);
                    379:                        }
                    380:        }
                    381:        return(0);
                    382: }
                    383: ccom(){
                    384:        char cc;
                    385:        while((cc = buf[i]) == ' ' || cc == '\t' || cc == '\n')if(i++ >= in)return(0);
                    386:        if(buf[i] == '/' && buf[i+1] == '*'){
                    387:                i += 2;
                    388:                while(buf[i] != '*' || buf[i+1] != '/'){
                    389:                        if(buf[i] == '\\')i += 2;
                    390:                        else i++;
                    391:                        if(i >= in)return(0);
                    392:                }
                    393:                if((i += 2) >= in)return(0);
                    394:        }
                    395:        if(buf[i] == '\n')if(ccom() == 0)return(0);
                    396:        return(1);
                    397: }
                    398: ascom(){
                    399:        while(buf[i] == '/'){
                    400:                i++;
                    401:                while(buf[i++] != '\n')if(i >= in)return(0);
                    402:                while(buf[i] == '\n')if(i++ >= in)return(0);
                    403:        }
                    404:        return(1);
                    405: }
                    406: 
                    407: english (bp, n)
                    408: char *bp;
                    409: {
                    410: # define NASC 128
                    411:        int ct[NASC], j, vow, freq, rare;
                    412:        int badpun = 0, punct = 0;
                    413:        if (n<50) return(0); /* no point in statistics on squibs */
                    414:        for(j=0; j<NASC; j++)
                    415:                ct[j]=0;
                    416:        for(j=0; j<n; j++)
                    417:        {
                    418:                if (bp[j]<NASC)
                    419:                        ct[bp[j]|040]++;
                    420:                switch (bp[j])
                    421:                {
                    422:                case '.': 
                    423:                case ',': 
                    424:                case ')': 
                    425:                case '%':
                    426:                case ';': 
                    427:                case ':': 
                    428:                case '?':
                    429:                        punct++;
                    430:                        if ( j < n-1 &&
                    431:                            bp[j+1] != ' ' &&
                    432:                            bp[j+1] != '\n')
                    433:                                badpun++;
                    434:                }
                    435:        }
                    436:        if (badpun*5 > punct)
                    437:                return(0);
                    438:        vow = ct['a'] + ct['e'] + ct['i'] + ct['o'] + ct['u'];
                    439:        freq = ct['e'] + ct['t'] + ct['a'] + ct['i'] + ct['o'] + ct['n'];
                    440:        rare = ct['v'] + ct['j'] + ct['k'] + ct['q'] + ct['x'] + ct['z'];
                    441:        if (2*ct[';'] > ct['e']) return(0);
                    442:        if ( (ct['>']+ct['<']+ct['/'])>ct['e']) return(0); /* shell file test */
                    443:        return (vow*5 >= n-ct[' '] && freq >= 10*rare);
                    444: }

unix.superglobalmegacorp.com

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