Annotation of 3BSD/cmd/file.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * determine type of file
                      3:  */
                      4: 
                      5: #include <sys/param.h>
                      6: #include <sys/stat.h>
                      7: #include <stdio.h>
                      8: #include <ctype.h>
                      9: int in;
                     10: int i  = 0;
                     11: char buf[512];
                     12: char *fort[] = {
                     13:        "function","subroutine","common","dimension","block","integer",
                     14:        "real","data","double",0};
                     15: char *asc[] = {
                     16:        "chmk","mov","tst","clr","jmp",0};
                     17: char *c[] = {
                     18:        "int","char","float","double","struct","extern",0};
                     19: char *as[] = {
                     20:        "globl","byte","align","text","data","comm",0};
                     21: int    ifile;
                     22: 
                     23: main(argc, argv)
                     24: char **argv;
                     25: {
                     26:        FILE *fl;
                     27:        register char *p;
                     28:        char ap[128];
                     29: 
                     30:        if (argc>1 && argv[1][0]=='-' && argv[1][1]=='f') {
                     31:                if ((fl = fopen(argv[2], "r")) == NULL) {
                     32:                        printf("Can't open %s\n", argv[2]);
                     33:                        exit(2);
                     34:                }
                     35:                while ((p = fgets(ap, 128, fl)) != NULL) {
                     36:                        int l = strlen(p);
                     37:                        if (l>0)
                     38:                                p[l-1] = '\0';
                     39:                        printf("%s:     ", p);
                     40:                        type(p);
                     41:                        if (ifile>=0)
                     42:                                close(ifile);
                     43:                }
                     44:                exit(1);
                     45:        }
                     46:        while(argc > 1) {
                     47:                printf("%s:     ", argv[1]);
                     48:                type(argv[1]);
                     49:                argc--;
                     50:                argv++;
                     51:                if (ifile >= 0)
                     52:                        close(ifile);
                     53:        }
                     54: }
                     55: 
                     56: type(file)
                     57: char *file;
                     58: {
                     59:        int j,nl;
                     60:        char ch;
                     61:        struct stat mbuf;
                     62: 
                     63:        ifile = -1;
                     64:        if(stat(file, &mbuf) < 0) {
                     65:                printf("cannot stat\n");
                     66:                return;
                     67:        }
                     68:        switch (mbuf.st_mode & S_IFMT) {
                     69: 
                     70:        case S_IFCHR:
                     71:                printf("character");
                     72:                goto spcl;
                     73: 
                     74:        case S_IFDIR:
                     75:                printf("directory\n");
                     76:                return;
                     77: 
                     78:        case S_IFBLK:
                     79:                printf("block");
                     80: 
                     81: spcl:
                     82:                printf(" special (%d/%d)\n", major(mbuf.st_rdev), minor(mbuf.st_rdev));
                     83:                return;
                     84:        }
                     85: 
                     86:        ifile = open(file, 0);
                     87:        if(ifile < 0) {
                     88:                printf("cannot open\n");
                     89:                return;
                     90:        }
                     91:        in = read(ifile, buf, 512);
                     92:        if(in == 0){
                     93:                printf("empty\n");
                     94:                return;
                     95:        }
                     96:        switch(*(int *)buf) {
                     97: 
                     98:        case 0413:
                     99:                printf("demand paged ");
                    100:        case 0410:
                    101:                printf("pure ");
                    102:                goto exec;
                    103: 
                    104:        case 0412:
                    105:                printf("demand paged ");
                    106:                goto exec;
                    107: 
                    108:        case 0411:
                    109:                printf("separate ");
                    110: 
                    111:        case 0407:
                    112: exec:
                    113:                printf("executable");
                    114:                if(((int *)buf)[4] != 0)
                    115:                        printf(" not stripped");
                    116:                printf("\n");
                    117:                goto out;
                    118: 
                    119:        case 0177555:
                    120:                printf("old archive\n");
                    121:                goto out;
                    122: 
                    123:        case 0177545:
                    124:                printf("archive\n");
                    125:                goto out;
                    126:        }
                    127: 
                    128:        i = 0;
                    129:        if(ccom() == 0)goto notc;
                    130:        while(buf[i] == '#'){
                    131:                j = i;
                    132:                while(buf[i++] != '\n'){
                    133:                        if(i - j > 255){
                    134:                                printf("data\n"); 
                    135:                                goto out;
                    136:                        }
                    137:                        if(i >= in)goto notc;
                    138:                }
                    139:                if(ccom() == 0)goto notc;
                    140:        }
                    141: check:
                    142:        if(lookup(c) == 1){
                    143:                while((ch = buf[i++]) != ';' && ch != '{')if(i >= in)goto notc;
                    144:                printf("c program text");
                    145:                goto outa;
                    146:        }
                    147:        nl = 0;
                    148:        while(buf[i] != '('){
                    149:                if(buf[i] <= 0)
                    150:                        goto notas;
                    151:                if(buf[i] == ';'){
                    152:                        i++; 
                    153:                        goto check; 
                    154:                }
                    155:                if(buf[i++] == '\n')
                    156:                        if(nl++ > 6)goto notc;
                    157:                if(i >= in)goto notc;
                    158:        }
                    159:        while(buf[i] != ')'){
                    160:                if(buf[i++] == '\n')
                    161:                        if(nl++ > 6)goto notc;
                    162:                if(i >= in)goto notc;
                    163:        }
                    164:        while(buf[i] != '{'){
                    165:                if(buf[i++] == '\n')
                    166:                        if(nl++ > 6)goto notc;
                    167:                if(i >= in)goto notc;
                    168:        }
                    169:        printf("c program text");
                    170:        goto outa;
                    171: notc:
                    172:        i = 0;
                    173:        while(buf[i] == 'c' || buf[i] == '#'){
                    174:                while(buf[i++] != '\n')if(i >= in)goto notfort;
                    175:        }
                    176:        if(lookup(fort) == 1){
                    177:                printf("fortran program text");
                    178:                goto outa;
                    179:        }
                    180: notfort:
                    181:        i=0;
                    182:        if(ascom() == 0)goto notas;
                    183:        j = i-1;
                    184:        if(buf[i] == '.'){
                    185:                i++;
                    186:                if(lookup(as) == 1){
                    187:                        printf("assembler program text"); 
                    188:                        goto outa;
                    189:                }
                    190:                else if(buf[j] == '\n' && isalpha(buf[j+2])){
                    191:                        printf("roff, nroff, or eqn input text");
                    192:                        goto outa;
                    193:                }
                    194:        }
                    195:        while(lookup(asc) == 0){
                    196:                if(ascom() == 0)goto notas;
                    197:                while(buf[i] != '\n' && buf[i++] != ':')
                    198:                        if(i >= in)goto notas;
                    199:                while(buf[i] == '\n' || buf[i] == ' ' || buf[i] == '\t')if(i++ >= in)goto notas;
                    200:                j = i-1;
                    201:                if(buf[i] == '.'){
                    202:                        i++;
                    203:                        if(lookup(as) == 1){
                    204:                                printf("assembler program text"); 
                    205:                                goto outa; 
                    206:                        }
                    207:                        else if(buf[j] == '\n' && isalpha(buf[j+2])){
                    208:                                printf("roff, nroff, or eqn input text");
                    209:                                goto outa;
                    210:                        }
                    211:                }
                    212:        }
                    213:        printf("assembler program text");
                    214:        goto outa;
                    215: notas:
                    216:        for(i=0; i < in; i++)if(buf[i]&0200){
                    217:                if (buf[0]=='\100' && buf[1]=='\357') {
                    218:                        printf("troff output\n");
                    219:                        goto out;
                    220:                }
                    221:                printf("data\n"); 
                    222:                goto out; 
                    223:        }
                    224:        if (mbuf.st_mode&((S_IEXEC)|(S_IEXEC>>3)|(S_IEXEC>>6)))
                    225:                printf("commands text");
                    226:        else
                    227:            if (english(buf, in))
                    228:                printf("English text");
                    229:        else
                    230:            printf("ascii text");
                    231: outa:
                    232:        while(i < in)
                    233:                if((buf[i++]&0377) > 127){
                    234:                        printf(" with garbage\n");
                    235:                        goto out;
                    236:                }
                    237:        /* if next few lines in then read whole file looking for nulls ...
                    238:                while((in = read(ifile,buf,512)) > 0)
                    239:                        for(i = 0; i < in; i++)
                    240:                                if((buf[i]&0377) > 127){
                    241:                                        printf(" with garbage\n");
                    242:                                        goto out;
                    243:                                }
                    244:                /*.... */
                    245:        printf("\n");
                    246: out:;
                    247: }
                    248: lookup(tab)
                    249: char *tab[];
                    250: {
                    251:        char r;
                    252:        int k,j,l;
                    253:        while(buf[i] == ' ' || buf[i] == '\t' || buf[i] == '\n')i++;
                    254:        for(j=0; tab[j] != 0; j++){
                    255:                l=0;
                    256:                for(k=i; ((r=tab[j][l++]) == buf[k] && r != '\0');k++);
                    257:                if(r == '\0')
                    258:                        if(buf[k] == ' ' || buf[k] == '\n' || buf[k] == '\t'
                    259:                            || buf[k] == '{' || buf[k] == '/'){
                    260:                                i=k;
                    261:                                return(1);
                    262:                        }
                    263:        }
                    264:        return(0);
                    265: }
                    266: ccom(){
                    267:        char cc;
                    268:        while((cc = buf[i]) == ' ' || cc == '\t' || cc == '\n')if(i++ >= in)return(0);
                    269:        if(buf[i] == '/' && buf[i+1] == '*'){
                    270:                i += 2;
                    271:                while(buf[i] != '*' || buf[i+1] != '/'){
                    272:                        if(buf[i] == '\\')i += 2;
                    273:                        else i++;
                    274:                        if(i >= in)return(0);
                    275:                }
                    276:                if((i += 2) >= in)return(0);
                    277:        }
                    278:        if(buf[i] == '\n')if(ccom() == 0)return(0);
                    279:        return(1);
                    280: }
                    281: ascom(){
                    282:        while(buf[i] == '/'){
                    283:                i++;
                    284:                while(buf[i++] != '\n')if(i >= in)return(0);
                    285:                while(buf[i] == '\n')if(i++ >= in)return(0);
                    286:        }
                    287:        return(1);
                    288: }
                    289: 
                    290: english (bp, n)
                    291: char *bp;
                    292: {
                    293: # define NASC 128
                    294:        int ct[NASC], j, vow, freq, rare;
                    295:        int badpun = 0, punct = 0;
                    296:        if (n<50) return(0); /* no point in statistics on squibs */
                    297:        for(j=0; j<NASC; j++)
                    298:                ct[j]=0;
                    299:        for(j=0; j<n; j++)
                    300:        {
                    301:                if (bp[j]<NASC)
                    302:                        ct[bp[j]|040]++;
                    303:                switch (bp[j])
                    304:                {
                    305:                case '.': 
                    306:                case ',': 
                    307:                case ')': 
                    308:                case '%':
                    309:                case ';': 
                    310:                case ':': 
                    311:                case '?':
                    312:                        punct++;
                    313:                        if ( j < n-1 &&
                    314:                            bp[j+1] != ' ' &&
                    315:                            bp[j+1] != '\n')
                    316:                                badpun++;
                    317:                }
                    318:        }
                    319:        if (badpun*5 > punct)
                    320:                return(0);
                    321:        vow = ct['a'] + ct['e'] + ct['i'] + ct['o'] + ct['u'];
                    322:        freq = ct['e'] + ct['t'] + ct['a'] + ct['i'] + ct['o'] + ct['n'];
                    323:        rare = ct['v'] + ct['j'] + ct['k'] + ct['q'] + ct['x'] + ct['z'];
                    324:        if (2*ct[';'] > ct['e']) return(0);
                    325:        if ( (ct['>']+ct['<']+ct['/'])>ct['e']) return(0); /* shell file test */
                    326:        return (vow*5 >= n-ct[' '] && freq >= 10*rare);
                    327: }

unix.superglobalmegacorp.com

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