Annotation of 40BSD/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 <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_IFMPC:
                     86:                printf("char multiplexor\n");
                     87:                return;
                     88: 
                     89:        case S_IFMPB:
                     90:                printf("block multiplexor\n");
                     91:                return;
                     92: 
                     93:        case S_IFBLK:
                     94:                printf("block");
                     95: 
                     96: spcl:
                     97:                printf(" special (%d/%d)\n", major(mbuf.st_rdev), minor(mbuf.st_rdev));
                     98:                return;
                     99:        }
                    100: 
                    101:        ifile = open(file, 0);
                    102:        if(ifile < 0) {
                    103:                printf("cannot open\n");
                    104:                return;
                    105:        }
                    106:        in = read(ifile, buf, BUFSIZ);
                    107:        if(in == 0){
                    108:                printf("empty\n");
                    109:                return;
                    110:        }
                    111:        switch(*(int *)buf) {
                    112: 
                    113:        case 0413:
                    114:                printf("demand paged ");
                    115: 
                    116:        case 0410:
                    117:                printf("pure ");
                    118:                goto exec;
                    119: 
                    120:        case 0411:
                    121:                printf("jfr or pdp-11 unix 411 executable\n");
                    122:                return;
                    123: 
                    124:        case 0407:
                    125: exec:
                    126:                printf("executable");
                    127:                if(((int *)buf)[4] != 0) {
                    128:                        printf(" not stripped");
                    129:                        if(oldo(buf))
                    130:                                printf(" (old format symbol table)");
                    131:                }
                    132:                printf("\n");
                    133:                goto out;
                    134: 
                    135:        case 0177555:
                    136:                printf("very old archive\n");
                    137:                goto out;
                    138: 
                    139:        case 0177545:
                    140:                printf("old archive\n");
                    141:                goto out;
                    142: 
                    143:        case 070707:
                    144:                printf("cpio data\n");
                    145:                goto out;
                    146:        }
                    147: 
                    148:        if(strncmp(buf, "!<arch>\n__.SYMDEF", 17) == 0 ) {
                    149:                printf("archive random library\n");
                    150:                goto out;
                    151:        }
                    152:        if (strncmp(buf, "!<arch>\n", 8)==0) {
                    153:                printf("archive\n");
                    154:                goto out;
                    155:        }
                    156:        i = 0;
                    157:        if(ccom() == 0)goto notc;
                    158:        while(buf[i] == '#'){
                    159:                j = i;
                    160:                while(buf[i++] != '\n'){
                    161:                        if(i - j > 255){
                    162:                                printf("data\n"); 
                    163:                                goto out;
                    164:                        }
                    165:                        if(i >= in)goto notc;
                    166:                }
                    167:                if(ccom() == 0)goto notc;
                    168:        }
                    169: check:
                    170:        if(lookup(c) == 1){
                    171:                while((ch = buf[i++]) != ';' && ch != '{')if(i >= in)goto notc;
                    172:                printf("c program text");
                    173:                goto outa;
                    174:        }
                    175:        nl = 0;
                    176:        while(buf[i] != '('){
                    177:                if(buf[i] <= 0)
                    178:                        goto notas;
                    179:                if(buf[i] == ';'){
                    180:                        i++; 
                    181:                        goto check; 
                    182:                }
                    183:                if(buf[i++] == '\n')
                    184:                        if(nl++ > 6)goto notc;
                    185:                if(i >= in)goto notc;
                    186:        }
                    187:        while(buf[i] != ')'){
                    188:                if(buf[i++] == '\n')
                    189:                        if(nl++ > 6)goto notc;
                    190:                if(i >= in)goto notc;
                    191:        }
                    192:        while(buf[i] != '{'){
                    193:                if(buf[i++] == '\n')
                    194:                        if(nl++ > 6)goto notc;
                    195:                if(i >= in)goto notc;
                    196:        }
                    197:        printf("c program text");
                    198:        goto outa;
                    199: notc:
                    200:        i = 0;
                    201:        while(buf[i] == 'c' || buf[i] == '#'){
                    202:                while(buf[i++] != '\n')if(i >= in)goto notfort;
                    203:        }
                    204:        if(lookup(fort) == 1){
                    205:                printf("fortran program text");
                    206:                goto outa;
                    207:        }
                    208: notfort:
                    209:        i=0;
                    210:        if(ascom() == 0)goto notas;
                    211:        j = i-1;
                    212:        if(buf[i] == '.'){
                    213:                i++;
                    214:                if(lookup(as) == 1){
                    215:                        printf("assembler program text"); 
                    216:                        goto outa;
                    217:                }
                    218:                else if(buf[j] == '\n' && isalpha(buf[j+2])){
                    219:                        printf("roff, nroff, or eqn input text");
                    220:                        goto outa;
                    221:                }
                    222:        }
                    223:        while(lookup(asc) == 0){
                    224:                if(ascom() == 0)goto notas;
                    225:                while(buf[i] != '\n' && buf[i++] != ':')
                    226:                        if(i >= in)goto notas;
                    227:                while(buf[i] == '\n' || buf[i] == ' ' || buf[i] == '\t')if(i++ >= in)goto notas;
                    228:                j = i-1;
                    229:                if(buf[i] == '.'){
                    230:                        i++;
                    231:                        if(lookup(as) == 1){
                    232:                                printf("assembler program text"); 
                    233:                                goto outa; 
                    234:                        }
                    235:                        else if(buf[j] == '\n' && isalpha(buf[j+2])){
                    236:                                printf("roff, nroff, or eqn input text");
                    237:                                goto outa;
                    238:                        }
                    239:                }
                    240:        }
                    241:        printf("assembler program text");
                    242:        goto outa;
                    243: notas:
                    244:        for(i=0; i < in; i++)if(buf[i]&0200){
                    245:                if (buf[0]=='\100' && buf[1]=='\357') {
                    246:                        printf("troff (CAT) output\n");
                    247:                        goto out;
                    248:                }
                    249:                printf("data\n"); 
                    250:                goto out; 
                    251:        }
                    252:        if (mbuf.st_mode&((S_IEXEC)|(S_IEXEC>>3)|(S_IEXEC>>6)))
                    253:                printf("commands text");
                    254:        else if (troffint(buf, in))
                    255:                printf("troff intermediate output text");
                    256:        else if (english(buf, in))
                    257:                printf("English text");
                    258:        else
                    259:                printf("ascii text");
                    260: outa:
                    261:        while(i < in)
                    262:                if((buf[i++]&0377) > 127){
                    263:                        printf(" with garbage\n");
                    264:                        goto out;
                    265:                }
                    266:        /* if next few lines in then read whole file looking for nulls ...
                    267:                while((in = read(ifile,buf,BUFSIZ)) > 0)
                    268:                        for(i = 0; i < in; i++)
                    269:                                if((buf[i]&0377) > 127){
                    270:                                        printf(" with garbage\n");
                    271:                                        goto out;
                    272:                                }
                    273:                /*.... */
                    274:        printf("\n");
                    275: out:;
                    276: }
                    277: 
                    278: oldo(cp)
                    279: char *cp;
                    280: {
                    281:        struct exec ex;
                    282:        struct stat stb;
                    283: 
                    284:        ex = *(struct exec *)cp;
                    285:        if (fstat(ifile, &stb) < 0)
                    286:                return(0);
                    287:        if (N_STROFF(ex)+sizeof(off_t) > stb.st_size)
                    288:                return (1);
                    289:        return (0);
                    290: }
                    291: 
                    292: 
                    293: 
                    294: troffint(bp, n)
                    295: char *bp;
                    296: int n;
                    297: {
                    298:        int k;
                    299: 
                    300:        i = 0;
                    301:        for (k = 0; k < 6; k++) {
                    302:                if (lookup(troff) == 0)
                    303:                        return(0);
                    304:                if (lookup(troff) == 0)
                    305:                        return(0);
                    306:                while (i < n && buf[i] != '\n')
                    307:                        i++;
                    308:                if (i++ >= n)
                    309:                        return(0);
                    310:        }
                    311:        return(1);
                    312: }
                    313: lookup(tab)
                    314: char *tab[];
                    315: {
                    316:        char r;
                    317:        int k,j,l;
                    318:        while(buf[i] == ' ' || buf[i] == '\t' || buf[i] == '\n')i++;
                    319:        for(j=0; tab[j] != 0; j++){
                    320:                l=0;
                    321:                for(k=i; ((r=tab[j][l++]) == buf[k] && r != '\0');k++);
                    322:                if(r == '\0')
                    323:                        if(buf[k] == ' ' || buf[k] == '\n' || buf[k] == '\t'
                    324:                            || buf[k] == '{' || buf[k] == '/'){
                    325:                                i=k;
                    326:                                return(1);
                    327:                        }
                    328:        }
                    329:        return(0);
                    330: }
                    331: ccom(){
                    332:        char cc;
                    333:        while((cc = buf[i]) == ' ' || cc == '\t' || cc == '\n')if(i++ >= in)return(0);
                    334:        if(buf[i] == '/' && buf[i+1] == '*'){
                    335:                i += 2;
                    336:                while(buf[i] != '*' || buf[i+1] != '/'){
                    337:                        if(buf[i] == '\\')i += 2;
                    338:                        else i++;
                    339:                        if(i >= in)return(0);
                    340:                }
                    341:                if((i += 2) >= in)return(0);
                    342:        }
                    343:        if(buf[i] == '\n')if(ccom() == 0)return(0);
                    344:        return(1);
                    345: }
                    346: ascom(){
                    347:        while(buf[i] == '/'){
                    348:                i++;
                    349:                while(buf[i++] != '\n')if(i >= in)return(0);
                    350:                while(buf[i] == '\n')if(i++ >= in)return(0);
                    351:        }
                    352:        return(1);
                    353: }
                    354: 
                    355: english (bp, n)
                    356: char *bp;
                    357: {
                    358: # define NASC 128
                    359:        int ct[NASC], j, vow, freq, rare;
                    360:        int badpun = 0, punct = 0;
                    361:        if (n<50) return(0); /* no point in statistics on squibs */
                    362:        for(j=0; j<NASC; j++)
                    363:                ct[j]=0;
                    364:        for(j=0; j<n; j++)
                    365:        {
                    366:                if (bp[j]<NASC)
                    367:                        ct[bp[j]|040]++;
                    368:                switch (bp[j])
                    369:                {
                    370:                case '.': 
                    371:                case ',': 
                    372:                case ')': 
                    373:                case '%':
                    374:                case ';': 
                    375:                case ':': 
                    376:                case '?':
                    377:                        punct++;
                    378:                        if ( j < n-1 &&
                    379:                            bp[j+1] != ' ' &&
                    380:                            bp[j+1] != '\n')
                    381:                                badpun++;
                    382:                }
                    383:        }
                    384:        if (badpun*5 > punct)
                    385:                return(0);
                    386:        vow = ct['a'] + ct['e'] + ct['i'] + ct['o'] + ct['u'];
                    387:        freq = ct['e'] + ct['t'] + ct['a'] + ct['i'] + ct['o'] + ct['n'];
                    388:        rare = ct['v'] + ct['j'] + ct['k'] + ct['q'] + ct['x'] + ct['z'];
                    389:        if (2*ct[';'] > ct['e']) return(0);
                    390:        if ( (ct['>']+ct['<']+ct['/'])>ct['e']) return(0); /* shell file test */
                    391:        return (vow*5 >= n-ct[' '] && freq >= 10*rare);
                    392: }

unix.superglobalmegacorp.com

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