home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 424.lha / FileID / fileid.c < prev    next >
C/C++ Source or Header  |  1990-09-30  |  13KB  |  611 lines

  1. /**************************************************
  2.  *
  3.  * FileID.c
  4.  *
  5.  *    Identify picture/IFF file 
  6.  *      and give info about it.
  7.  *
  8.  *    Copyright(c), 1990 Lloyd B. Eldred
  9.  *
  10.  **************************************************/
  11. #include <stdio.h>
  12. #include <math.h>
  13.  
  14. typedef unsigned char UBYTE;     /* 8 bits unsigned */
  15. typedef unsigned short UWORD;    /* 16 bits unsigned */
  16. typedef short WORD;         /* 16 bits signed */
  17. typedef long LONG;               /* 32 bits signed */
  18.  
  19. #define GIF 1
  20. #define IFF 2
  21. #define ANIM 3
  22. #define HIRES 0x8000
  23. #define LACE 0x4
  24. #define HAM 0x800
  25. #define HALFBRITE 0x80
  26.  
  27. main(argc, argv)
  28. char **argv;
  29. {
  30.     FILE *picfile;
  31.     int type;
  32.     char buf[256],buf2[256],tempotext[10];
  33.     int width,height,color,i,planes;
  34.     UBYTE w1,w2,h1,h2,c;
  35.     int start,start2,start3,camg;
  36.     long vpmode,volume,dt;
  37.     int cfind(char * , int , char * , int);
  38.     UWORD sps,tempo;
  39.     long tempo2;
  40.     WORD numframes;
  41.     unsigned long reltime;
  42.     LONG makelong(char,char,char,char);
  43.     LONG size;
  44.     
  45.     printf(
  46.     "FileID -- File IDentifier. Copyright (c) 1990, Lloyd B. Eldred.\n"
  47.      );
  48.  
  49.                if (argc != 2) {
  50.         printf("Usage: FileID filename\n");
  51.         exit(2);
  52.     }
  53.  
  54.     if (argc == 2) {
  55.         if ((picfile = fopen(argv[1], "rb")) == NULL) {
  56.             perror(argv[1]);
  57.             exit(1);
  58.         }
  59.     } 
  60.  
  61.     /* search for header line */
  62.     for (;;) {
  63.         if (fread(buf, sizeof(buf), 1,picfile) != 1) {
  64.             fprintf(stderr, "Unrecognized filetype\n");
  65.             fclose(picfile);
  66.             exit(3);
  67.         }
  68.         start = cfind(buf,sizeof(buf),"GIF",3);
  69.         if (start != -1){
  70.             type=GIF;
  71.             break;
  72.         }
  73.         
  74.         start = cfind(buf,sizeof(buf),"FORM",4);
  75.         if (start != -1){
  76.             type=IFF;
  77.             break;
  78.         }
  79.         
  80.         start = cfind(buf,sizeof(buf),"CAT ",4);
  81.         if (start != -1){
  82.             type=IFF;
  83.             break;
  84.         }
  85.  
  86.         start = cfind(buf,sizeof(buf),"LIST",4);
  87.         if (start != -1){
  88.             type=IFF;
  89.             break;
  90.         }
  91.  
  92.  
  93.             
  94.     }
  95.     
  96.     fclose(picfile);
  97.  
  98. /********************************************************************/
  99. /*                          GIF analysis                            */
  100. /********************************************************************/
  101.     
  102.     if(type == GIF){
  103.         w1 = buf[start+3];
  104.         w2 = buf[start+4];
  105.         h1 = buf[start+5];
  106.         
  107.         printf(" GIF -- Version %c%c%c:",w1,w2,h1);
  108.         if( w1 != '8' || w2 != '7' || h1 != 'a')
  109.             printf(" non recognized version, the following",
  110.                    " are guesses");
  111.         printf("\n");
  112.         if(start != 0)
  113.             printf("Padding encountered at the beginning of",
  114.                    " the file. Some viewers may not like this",
  115.                    " file.\n");
  116.         w1 = buf[start+6];
  117.         w2 = buf[start+7];
  118.         h1 = buf[start+8];
  119.         h2 = buf[start+9];
  120.         c  = buf[start+10];
  121.             
  122.         planes = (int)(c & 0x7) + 1;
  123.         
  124.         color=1;
  125.         
  126.         for(i=0; i<planes ; i++)
  127.           color = color * 2;
  128.         
  129.         width=w1 + 256 * w2;
  130.         
  131.         height=h1 + 256 * h2;
  132.         
  133.         printf("   Width : %5d\n"
  134.                "   Height: %5d\n"
  135.                "   Colors: %5d\n",width,height,color);
  136.         
  137.     }
  138.  
  139. /********************************************************************/
  140. /*                          IFF analysis                            */
  141. /********************************************************************/
  142.  
  143.     if(type == IFF){
  144.         printf(" IFF file:");
  145.  
  146. /* ILBM analysis */
  147.  
  148.         start3 = cfind(buf,sizeof(buf),"ANIM",4);
  149.         if (start3 != -1){
  150.             printf(" ANIM (Cel Animation)\n");
  151.             type = ANIM;
  152.             start = cfind(buf,sizeof(buf),"ILBM",4);
  153.             if(start != -1 && start < sizeof(buf) + 5){
  154.                 w1 = buf[start-4];
  155.                 w2 = buf[start-3];
  156.                 h1 = buf[start-2];
  157.                 h2 = buf[start-1];
  158.                 size = makelong(w1,w2,h1,h2);
  159.                 if ((picfile = fopen(argv[1], "rb")) 
  160.                     == NULL) {
  161.                     perror(argv[1]);
  162.                     exit(1);
  163.                 }
  164.                 if(fseek(picfile,(long)(start+size),0)
  165.                     == -1){
  166.                     printf(" Can't find animation info. (fseek past end of file)\n");
  167.                     exit();
  168.                 }
  169.             if (fread(buf2, sizeof(buf2), 1,picfile) != 1) {
  170.                 fprintf(stderr, 
  171.                     " Can't find animation info. (fread past end of file)\n");
  172.                 }
  173.                 
  174.             }
  175.             start = cfind(buf2,sizeof(buf2),"ANHD",4);
  176.             if(start != -1 && start < sizeof(buf2) - 25){
  177.                 w1 = buf2[start+8];
  178.                 w2 = buf2[start+9];
  179.                 h1 = buf2[start+23];
  180.                 h2 = buf2[start+24];
  181.                 
  182.                 c = buf2[start+25];
  183.  
  184.                 printf("   Compression Mode      :");
  185.                 if(w1 == 0) printf(" None\n");
  186.                 if(w1 == 1) printf(" XOR ILBM mode\n");
  187.                 if(w1 == 2) printf(" Long Delta mode\n");
  188.                 if(w1 == 3) printf(" Short Delta mode\n");
  189.                 if(w1 == 4) printf(
  190.                     " Gen. short/long Delta mode\n");
  191.                 if(w1 == 5) printf(
  192.                     " Byte Vertical Delta mode\n");
  193.                 if(w1 == 'J') printf(
  194.                     " Eric Graham's technique\n");
  195.             
  196.                 reltime = (unsigned long)
  197.                     makelong(w2,h1,h2,c);
  198.                 printf("   Frame timing (jiffies): %d\n"
  199.                     ,reltime);
  200.                 printf("   (1 jiffy=1/60 sec)\n");
  201.             }
  202.             else
  203.                 printf(
  204.                 " Can't find animation information. (Can't find ANHD)\n");
  205.         }
  206.         start = -1;
  207.         if(type != ANIM){
  208.             start = cfind(buf,sizeof(buf),"ILBM",4);
  209.             if(start != -1)
  210.                 printf(
  211.                 " ILBM (Picture: InterLeaved Bit Map)\n");
  212.             start2 = cfind(buf,sizeof(buf),"ACBM",4);
  213.             if(start2 != -1)
  214.                 printf(
  215.                 " ACBM (Picture: Amiga Contiguous Bit Map)\n");
  216.         }
  217.             
  218.         if (start != -1 || start2 != -1 || start3 != -1){
  219.             start = cfind(buf,sizeof(buf),"BMHD",4);
  220.             
  221.             if(start == -1){
  222.                 printf(" Color information not found\n");
  223.                 exit();
  224.             }
  225.             
  226.             
  227.             if(start > (sizeof(buf)-12)){
  228.                 printf(
  229.                 " Incomplete color information found\n");
  230.                 exit();
  231.             }
  232.             w1 = buf[start+8];
  233.             w2 = buf[start+9];
  234.             h1 = buf[start+10];
  235.             h2 = buf[start+11];
  236.             c  = buf[start+16];
  237.  
  238.             width = (int)w2 + (int)(w1<<8);
  239.             height= (int)h2 + (int)(h1<<8);
  240.                         
  241.             planes=(int)c;
  242.             color=1;
  243.             for(i=0; i<planes ; i++)
  244.                   color = color * 2;
  245.   /* HAM or Extra Half Bright? */
  246.   /* Search for CAMG block */
  247.             camg=0;
  248.             start = cfind(buf,sizeof(buf),"CAMG",4);
  249.                             
  250.             if(start != -1) { /* check vpmode flag */
  251.                 camg=1;
  252.                 w1 = buf[start+8];
  253.                 w2 = buf[start+9];
  254.                 h1 = buf[start+10];
  255.                 h2 = buf[start+11]; 
  256.                 vpmode = makelong(w1,w2,h1,h2);
  257.  
  258.                 if(vpmode & HAM) /* HAM flag */
  259.                         color = 4096;
  260.             } /* end if(start != -1) */
  261.                      
  262.             printf("   Width : %5d",width);
  263.             if(camg == 1 && (vpmode & HIRES))
  264.                 printf("  Hi-Res");
  265.             printf("\n");
  266.             
  267.             printf("   Height: %5d",height);
  268.             if(camg == 1 && (vpmode & LACE))
  269.                 printf("  Interlaced");
  270.             printf("\n");
  271.                         
  272.             printf("   Colors: %5d",color);
  273.             if(camg == 1 && (vpmode & HAM))
  274.                 printf("  HAM");
  275.             if(camg == 1 && (vpmode & HALFBRITE))
  276.                 printf("  Extra-Halfbright");
  277.             printf("\n");
  278.             exit();
  279.             
  280.         } /* end if ILBM */
  281.         
  282. /* check for other IFF file types */
  283.  
  284.         start = cfind(buf,sizeof(buf),"FTXT",4);
  285.         if (start != -1){
  286.             printf(" FTXT (Formatted Text)\n");
  287.             exit();
  288.         }
  289.         
  290.         start = cfind(buf,sizeof(buf),"SMUS",4);
  291.         if (start != -1){
  292.             printf(" SMUS (Simple MUsical Score)\n");
  293.             start = cfind(buf,sizeof(buf),"SHDR",4);
  294.             if (start == -1 || start > sizeof(buf) - 11){
  295.                 printf(" Can't read music info.\n");
  296.                 exit();
  297.             }
  298.             w1 = buf[start+8];
  299.             w2 = buf[start+9];
  300.             
  301.             tempo = (UWORD)w2 + (UWORD)(w1<<8);
  302.  
  303.             tempo2 = ((tempo % 128) * 100000)/128;
  304.             
  305.             tempo /= 128;
  306.  
  307.             sprintf(tempotext,"%u.%5d",tempo,tempo2);
  308.             for(i = 0; i<9; i++)
  309.                 if(tempotext[i] == ' ') tempotext[i] = '0';
  310.                         
  311.             h1 = buf[start+10];
  312.  
  313.             volume = ((int)h1 * 100)/127;
  314.  
  315.             c = buf[start+11];
  316.             
  317.             printf("   Tempo  (1/4 notes/min): %s\n",tempotext);
  318.             printf("   Volume (percent)      : %d\n",volume);
  319.             printf("   Tracks                : %d\n",(int)c);
  320.             
  321.             exit();
  322.         }
  323.         
  324.         start = cfind(buf,sizeof(buf),"8SVX",4);
  325.         if (start != -1){
  326.             printf(" 8SVX (8-Bit Sample Voice)\n");
  327.             start = cfind(buf,sizeof(buf),"VHDR",4);
  328.             if (start == -1 || start > sizeof(buf)-27){
  329.                 printf(" Can't read voice info\n");
  330.                 exit();
  331.             }
  332.             w1 = buf[start+20];
  333.             w2 = buf[start+21];
  334.             
  335.             sps = (UWORD)w2 + (UWORD)(w1<<8);
  336.             
  337.             w1 = buf[start+24];
  338.             w2 = buf[start+25];
  339.             h1 = buf[start+26];
  340.             h2 = buf[start+27];
  341.             
  342.             volume = makelong(w1,w2,h1,h2);
  343.             volume = (volume * 100) / 65536;
  344.             printf("   Samples per second: %d\n",sps);
  345.             printf("   Volume (percent)  : %d\n",volume);
  346.             
  347.             exit();
  348.         }
  349.  
  350.         start = cfind(buf,sizeof(buf),"AIFF",4);
  351.         if (start != -1){
  352.             printf(" AIFF (Apple Audio IFF)\n");
  353.             exit();
  354.         }
  355.  
  356.         start = cfind(buf,sizeof(buf),"ANBM",4);
  357.         if (start != -1){
  358.             printf(" ANBM (Animated bitmap -- Deluxe Video)\n");
  359.             start = cfind(buf,sizeof(buf),"FSQN",4);
  360.             if(start == -1 || start > sizeof(buf) - 13 ){
  361.                 printf(" Can't read animation info\n");
  362.                 exit();
  363.             }
  364.             w1 = buf[start+8];
  365.             w2 = buf[start+9];
  366.             
  367.             numframes = (WORD)w2 + (WORD)(w1<<8);
  368.             
  369.             w1 = buf[start+10];
  370.             w2 = buf[start+11];
  371.             h1 = buf[start+12];
  372.             h2 = buf[start+13];
  373.             
  374.             dt = makelong(w1,w2,h1,h2);
  375.             
  376.             printf("   Number of Frames              : %d\n",
  377.                 numframes);
  378.             printf("   Time between frames (jiffies) : %d\n",
  379.                 dt);
  380.             printf("   (1 jiffy=1/60 sec)\n");
  381.             
  382.             exit();
  383.         }
  384.  
  385.         start = cfind(buf,sizeof(buf),"BANK",4);
  386.         if (start != -1){
  387.             printf(" BANK (SoundQuest MIDI data-dump)\n");
  388.             exit();
  389.         }
  390.  
  391.         start = cfind(buf,sizeof(buf),"HEAD",4);
  392.         if (start != -1){
  393.             printf(" HEAD (Flow Idea Processor form)\n");
  394.             exit();
  395.         }
  396.  
  397.         start = cfind(buf,sizeof(buf),"MIDI",4);
  398.         if (start != -1){
  399.             printf(" MIDI\n");
  400.             exit();
  401.         }
  402.  
  403.         start = cfind(buf,sizeof(buf),"PGTB",4);
  404.         if (start != -1){
  405.             printf(" PGTB (ProGram TraceBack diagnostic dump image)\n");
  406.             exit();
  407.         }
  408.  
  409.         start = cfind(buf,sizeof(buf),"SYTH",4);
  410.         if (start != -1){
  411.             printf(" SYTH (SoundQuest Master Librarian file)\n");
  412.             exit();
  413.         }
  414.  
  415.         start = cfind(buf,sizeof(buf),"WORD",4);
  416.         if (start != -1){
  417.             printf(" WORD (ProWrite data file)\n");
  418.             exit();
  419.         }
  420.         
  421.         start = cfind(buf,sizeof(buf),"C100",4);
  422.         if (start != -1){
  423.             printf(" C100 (Cloanto Italia, private word processing form)\n");
  424.             exit();
  425.         }
  426.  
  427.         start = cfind(buf,sizeof(buf),"PDEF",4);
  428.         if (start != -1){
  429.             printf(" PDEF (Deluxe Print page definition)\n");
  430.             exit();
  431.         }
  432.  
  433.         start = cfind(buf,sizeof(buf),"SHAK",4);
  434.         if (start != -1){
  435.             printf(" SHAK (Shakespeare data file)\n");
  436.             exit();
  437.         }
  438.  
  439.         start = cfind(buf,sizeof(buf),"VDEO",4);
  440.         if (start != -1){
  441.             printf(" VDEO (Deluxe Video file)\n");
  442.             exit();
  443.         }
  444.  
  445.         start = cfind(buf,sizeof(buf),"SAMP",4);
  446.         if (start != -1){
  447.             printf(" SAMP (Sound Sample)\n");
  448.             exit();
  449.         }
  450.  
  451.         start = cfind(buf,sizeof(buf),"TDDD",4);
  452.         if (start != -1){
  453.             printf(" TDDD (Turbo Silver file)\n");
  454.             exit();
  455.         }
  456.  
  457.         start = cfind(buf,sizeof(buf),"SC3D",4);
  458.         if (start != -1){
  459.             printf(" SC3D (Sculpt 3-D file)\n");
  460.             exit();
  461.         }
  462.  
  463.         start = cfind(buf,sizeof(buf),"TEXT",4);
  464.         if (start != -1){
  465.             printf(" TEXT (unformatted ASCII text)\n");
  466.             exit();
  467.         }
  468.  
  469.         start = cfind(buf,sizeof(buf),"FNTR",4);
  470.         if (start != -1){
  471.             printf(" FNTR (Raster Font)\n");
  472.             exit();
  473.         }
  474.  
  475.         start = cfind(buf,sizeof(buf),"FNTV",4);
  476.         if (start != -1){
  477.             printf(" FNTV (Vector Font)\n");
  478.             exit();
  479.         }
  480.  
  481.         start = cfind(buf,sizeof(buf),"GSCR",4);
  482.         if (start != -1){
  483.             printf(" GSCR (General-use musical SCoRe)\n");
  484.             exit();
  485.         }
  486.         
  487.         start = cfind(buf,sizeof(buf),"PICS",4);
  488.         if (start != -1){
  489.             printf(" PICS (Macintosh picture)\n");
  490.             exit();
  491.         }
  492.  
  493.         start = cfind(buf,sizeof(buf),"PLBM",4);
  494.         if (start != -1){
  495.             printf(" PLBM (Obsolete)\n");
  496.             exit();
  497.         }
  498.  
  499.         start = cfind(buf,sizeof(buf),"USCR",4);
  500.         if (start != -1){
  501.             printf(" USCR (Uhura Sound software musical score)\n");
  502.             exit();
  503.         }
  504.  
  505.         start = cfind(buf,sizeof(buf),"UVOX",4);
  506.         if (start != -1){
  507.             printf(" UVOX (Uhura Sound software Macintosh Voice)\n");
  508.             exit();
  509.         }
  510.  
  511.         start = cfind(buf,sizeof(buf),"CLIP",4);
  512.         if (start != -1){
  513.             printf(" CLIP (Clipboard data)\n");
  514.             exit();
  515.         }
  516.  
  517.         start = cfind(buf,sizeof(buf),"ARC ",4);
  518.         if (start != -1){
  519.             printf(" ARC  (Arcive form)\n");
  520.             exit();
  521.         }
  522.  
  523.         start = cfind(buf,sizeof(buf),"ATXT",4);
  524.         if (start != -1){
  525.             printf(" ATXT\n");
  526.             exit();
  527.         }
  528.  
  529.         start = cfind(buf,sizeof(buf),"PTXT",4);
  530.         if (start != -1){
  531.             printf(" PTXT\n");
  532.             exit();
  533.         }
  534.  
  535.         start = cfind(buf,sizeof(buf),"RGBX",4);
  536.         if (start != -1){
  537.             printf(" RGBX\n");
  538.             exit();
  539.         }
  540.  
  541.         start = cfind(buf,sizeof(buf),"CDAT",4);
  542.         if (start != -1){
  543.             printf(" CDAT\n");
  544.             exit();
  545.         }
  546.  
  547.         start = cfind(buf,sizeof(buf),"MSMP",4);
  548.         if (start != -1){
  549.             printf(" MSMP\n");
  550.             exit();
  551.         }
  552.  
  553.         start = cfind(buf,sizeof(buf),"FIGR",4);
  554.         if (start != -1){
  555.             printf(" FIGR\n");
  556.             exit();
  557.         }
  558.  
  559.         start = cfind(buf,sizeof(buf),"MOVI",4);
  560.         if (start != -1){
  561.             printf(" MOVI\n");
  562.             exit();
  563.         }
  564.  
  565.         printf(" Unknown type\n");
  566.  
  567.     }
  568.  
  569.  
  570.     exit();
  571.     
  572. } /* end of main() */
  573.  
  574. int cfind(buffer,blength,string,slength)
  575. char *buffer;
  576. char *string;
  577. int blength,slength;
  578. {
  579.     int i,start;
  580.     int found;
  581.     
  582.     start = 0;
  583.     
  584.     while(start < (blength-slength)){
  585.         found = 1;
  586.         
  587.         for(i=0;i<slength;i++)
  588.             if(buffer[start+i] != string[i]){
  589.                 found = 0;
  590.                 break;
  591.             }
  592.         
  593.         if(found == 1) return(start);
  594.         
  595.         start++;
  596.     }
  597.     
  598.     return(-1);  /* string not found */
  599.         
  600. } /* end of cfind() */    
  601.  
  602. LONG makelong(c1,c2,c3,c4)
  603. char c1,c2,c3,c4;
  604. {
  605.     LONG value;
  606.     
  607.     value = (LONG)c4 + (LONG)(c3<<8) + (LONG)(c2<<16) + (LONG)(c1<<24);
  608.     
  609.     return(value);
  610.     
  611. } /* end of makelong() */