home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V6 / usr / source / s1 / file.c < prev    next >
Encoding:
C/C++ Source or Header  |  1975-05-13  |  4.1 KB  |  238 lines

  1. int in;
  2. int i 0;
  3. char buf[512];
  4. int *wd {
  5.     &buf[0]};
  6. char *fort[]{
  7.     "function","subroutine","common","dimension","block","integer",
  8.     "real","data","double",0};
  9. char *asc[]{
  10.     "sys","mov","tst","clr","jmp",0};
  11. char *c[]{
  12.     "int","char","float","double","struct","extern",0};
  13. char *as[]{
  14.     "globl","byte","even","text","data","bss","comm",0};
  15. int ibuf[260];
  16. main(argc, argv)
  17. char **argv;
  18. {
  19.  
  20.     while(argc > 1) {
  21.         printf("%s:    ", argv[1]);
  22.         type(argv[1]);
  23.         argc--;
  24.         argv++;
  25.     }
  26. }
  27.  
  28. type(file)
  29. char *file;
  30. {
  31.     int j,nl;
  32.     char ch;
  33.     int mbuf[20];
  34.  
  35.     if(stat(file, mbuf) < 0) {
  36.         printf("cannot stat\n");
  37.         return;
  38.     }
  39.     switch(mbuf[2]&060000) {
  40.  
  41.     case 020000:
  42.         printf("character");
  43.         goto spcl;
  44.  
  45.     case 040000:
  46.         printf("directory\n");
  47.         return;
  48.  
  49.     case 060000:
  50.         printf("block");
  51.  
  52. spcl:
  53.         printf(" special (%d/%d)\n",
  54.         (mbuf[6]>>8)&0377,
  55.         mbuf[6]&0377);
  56.         return;
  57.     }
  58.  
  59.     ibuf[0] = open(file, 0);
  60.     if(ibuf[0] < 0) {
  61.         printf("cannot open\n");
  62.         return;
  63.     }
  64.     in = read(ibuf[0], buf, 512);
  65.     switch(*wd) {
  66.  
  67.     case 0407:
  68.         printf("executable\n");
  69.         goto out;
  70.  
  71.     case 0410:
  72.         printf("pure executable\n");
  73.         goto out;
  74.  
  75.     case 0411:
  76.         printf("separate executable\n");
  77.         goto out;
  78.  
  79.     case 0177555:
  80.         printf("archive\n");
  81.         goto out;
  82.     }
  83.  
  84.     i = 0;
  85.     if(ccom() == 0)goto notc;
  86.     while(buf[i] == '#'){
  87.         j = i;
  88.         while(buf[i++] != '\n'){
  89.             if(i - j > 255){
  90.                 printf("data\n"); 
  91.                 goto out;
  92.             }
  93.             if(i >= in)goto notc;
  94.         }
  95.         if(ccom() == 0)goto notc;
  96.     }
  97. check:
  98.     if(lookup(c) == 1){
  99.         while((ch = buf[i++]) != ';' && ch != '{')if(i >= in)goto notc;
  100.         printf("c program");
  101.         goto outa;
  102.     }
  103.     nl = 0;
  104.     while(buf[i] != '('){
  105.         if(buf[i] <= 0){
  106.             printf("data\n"); 
  107.             goto out; 
  108.         }
  109.         if(buf[i] == ';'){
  110.             i++; 
  111.             goto check; 
  112.         }
  113.         if(buf[i++] == '\n')
  114.             if(nl++ > 6)goto notc;
  115.         if(i >= in)goto notc;
  116.     }
  117.     while(buf[i] != ')'){
  118.         if(buf[i++] == '\n')
  119.             if(nl++ > 6)goto notc;
  120.         if(i >= in)goto notc;
  121.     }
  122.     while(buf[i] != '{'){
  123.         if(buf[i++] == '\n')
  124.             if(nl++ > 6)goto notc;
  125.         if(i >= in)goto notc;
  126.     }
  127.     printf("c program");
  128.     goto outa;
  129. notc:
  130.     i = 0;
  131.     while(buf[i] == 'c' || buf[i] == '#'){
  132.         while(buf[i++] != '\n')if(i >= in)goto notfort;
  133.     }
  134.     if(lookup(fort) == 1){
  135.         printf("fortran");
  136.         goto outa;
  137.     }
  138. notfort:
  139.     i=0;
  140.     if(ascom() == 0)goto notas;
  141.     j = i-1;
  142.     if(buf[i] == '.'){
  143.         i++;
  144.         if(lookup(as) == 1){
  145.             printf("assembler program"); 
  146.             goto outa;
  147.         }
  148.         else if(buf[j] == '\n'){
  149.             printf("roff, nroff, or eqn input");
  150.             goto outa;
  151.         }
  152.     }
  153.     while(lookup(asc) == 0){
  154.         if(ascom() == 0)goto notas;
  155.         while(buf[i] != '\n' && buf[i++] != ':')
  156.             if(i >= in)goto notas;
  157.         while(buf[i] == '\n' || buf[i] == ' ' || buf[i] == '\t')if(i++ >= in)goto notas;
  158.         j = i-1;
  159.         if(buf[i] == '.'){
  160.             i++;
  161.             if(lookup(as) == 1){
  162.                 printf("assembler program"); 
  163.                 goto outa; 
  164.             }
  165.             else if(buf[j] == '\n'){
  166.                 printf("roff, nroff, or eqn input");
  167.                 goto outa;
  168.             }
  169.         }
  170.     }
  171.     printf("assembler program");
  172.     goto outa;
  173. notas:
  174.     for(i=0; i < in; i++)if(buf[i] <= 0){
  175.         printf("data\n"); 
  176.         goto out; 
  177.     }
  178.     if((mbuf[2] & 00111) != 0)
  179.         printf("commands");
  180.     else printf("probably text");
  181. outa:
  182.     while(i < in)
  183.         if(buf[i++] <= 0){
  184.             printf(" with garbage\n");
  185.             goto out;
  186.         }
  187.     while((in = read(ibuf[0],buf,512)) > 0)
  188.         for(i = 0; i < in; i++)
  189.             if(buf[i] <= 0){
  190.                 printf(" with garbage\n");
  191.                 goto out;
  192.             }
  193.     printf("\n");
  194. out:
  195.     close(ibuf[0]);
  196. }
  197. lookup(tab)
  198. char *tab[];
  199. {
  200.     char r;
  201.     int k,j,l;
  202.     while(buf[i] == ' ' || buf[i] == '\t' || buf[i] == '\n')i++;
  203.     for(j=0; tab[j] != 0; j++){
  204.         l=0;
  205.         for(k=i; ((r=tab[j][l++]) == buf[k] && r != '\0');k++);
  206.         if(r == '\0')
  207.             if(buf[k] == ' ' || buf[k] == '\n' || buf[k] == '\t'
  208.                 || buf[k] == '{' || buf[k] == '/'){
  209.                 i=k;
  210.                 return(1);
  211.             }
  212.     }
  213.     return(0);
  214. }
  215. ccom(){
  216.     char cc;
  217.     while((cc = buf[i]) == ' ' || cc == '\t' || cc == '\n')if(i++ >= in)return(0);
  218.     if(buf[i] == '/' && buf[i+1] == '*'){
  219.         i =+ 2;
  220.         while(buf[i] != '*' || buf[i+1] != '/'){
  221.             if(buf[i] == '\\')i =+ 2;
  222.             else i++;
  223.             if(i >= in)return(0);
  224.         }
  225.         if((i =+ 2) >= in)return(0);
  226.     }
  227.     if(buf[i] == '\n')if(ccom() == 0)return(0);
  228.     return(1);
  229. }
  230. ascom(){
  231.     while(buf[i] == '/'){
  232.         i++;
  233.         while(buf[i++] != '\n')if(i >= in)return(0);
  234.         while(buf[i] == '\n')if(i++ >= in)return(0);
  235.     }
  236.     return(1);
  237. }
  238.