Annotation of 42BSD/usr.bin/file.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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