home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 500-599 / ff589.lza / Term / TermSrc.lha / Identify.c < prev    next >
C/C++ Source or Header  |  1991-12-04  |  14KB  |  646 lines

  1. /* $Revision Header * Header built automatically - do not edit! *************
  2.  *
  3.  *    (C) Copyright 1991 by Olaf 'Olsen' Barthel & MXM
  4.  *
  5.  *    Name .....: Identify.c
  6.  *    Created ..: Thursday 02-May-91 15:00
  7.  *    Revision .: 4
  8.  *
  9.  *    Date            Author          Comment
  10.  *    =========       ========        ====================
  11.  *    23-Oct-91    Olsen        TIFF & PCX fixed (sortof).
  12.  *    15-Aug-91    Olsen        Added some more new file types.
  13.  *    11-Aug-91    Olsen        Added new file types.
  14.  *    02-May-91    Olsen        Created this file!
  15.  *
  16.  * $Revision Header ********************************************************/
  17.  
  18. #include "TermGlobal.h"
  19.  
  20.     /* The file types we know. */
  21.  
  22. enum    {    TYPE_DIR,TYPE_FILE,TYPE_ICON,
  23.         TYPE_TEXT,
  24.         TYPE_C,TYPE_H,
  25.         TYPE_ASM,TYPE_I,
  26.         TYPE_MOD,
  27.         TYPE_REXX,
  28.         TYPE_BASIC,
  29.         TYPE_AMIGAGUIDE,
  30.         TYPE_TEX,TYPE_METAFONT,TYPE_GF,TYPE_TEXFONT,TYPE_TEXDVI,TYPE_FLIB,
  31.         TYPE_OLDMANX,TYPE_NEWMANX,TYPE_OLDMANXLIB,TYPE_NEWMANXLIB,
  32.         TYPE_OBJECT,TYPE_LIB,
  33.         TYPE_EXECUTABLE,
  34.         TYPE_LIBRARY,TYPE_DEVICE,TYPE_FILESYS,TYPE_HANDLER,
  35.         TYPE_GIF,TYPE_DEGAS,TYPE_MACPAINT,TYPE_SUPERPAINT,TYPE_PICT,TYPE_SUNRASTER,TYPE_POSTSCRIPT,TYPE_PCX,TYPE_TIFF,TYPE_BMP,TYPE_JFIF,TYPE_ILBM,
  36.         TYPE_ANIM,TYPE_8SVX,TYPE_SMUS,TYPE_FTXT,TYPE_PREFS,TYPE_TERM,TYPE_AMIGAVISION,TYPE_IFF,
  37.         TYPE_IMPLODER,TYPE_POWERPACKER,TYPE_LHPAK,
  38.         TYPE_ARC,TYPE_ARJ,TYPE_COMPRESSED,TYPE_CPIO,TYPE_MACCOMPRESS,TYPE_COMPACT,TYPE_DIAMOND,TYPE_LHARC,TYPE_LHA,TYPE_ZOO,TYPE_ZIP,TYPE_STUFFIT,TYPE_PACKIT,TYPE_DMS,TYPE_WARP,TYPE_ZOOM,
  39.         TYPE_SPARCOBJECT,TYPE_SPARCEXECUTABLE,
  40.         TYPE_MSDOSEXECUTABLE,
  41.         TYPE_ATARIEXECUTABLE,
  42.         TYPE_MACEXECUTABLE,
  43.     };
  44.  
  45.     /* A structure containing both a file name suffix and the
  46.      * approriate file type.
  47.      */
  48.  
  49. struct Suffix
  50. {
  51.     UBYTE    *Name;
  52.     UBYTE     Type;
  53. };
  54.  
  55.     /* A table of valid ASCII characters (7 bits). */
  56.  
  57. STATIC BYTE ID_ValidTab[256] =
  58. {
  59.     0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,
  60.     0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,
  61.     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  62.     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  63.     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  64.     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  65.     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  66.     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  67.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  68.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  69.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  70.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  71.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  72.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  73.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  74.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  75. };
  76.  
  77.     /* A table of clearly invalid ASCII characters (8 bits). */
  78.  
  79. STATIC BYTE ID_InvalidTab[256] =
  80. {
  81.     1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,
  82.     1,0,1,0,1,1,1,1,1,1,1,0,1,1,1,1,
  83.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  84.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  85.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  86.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  87.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  88.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  89.     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  90.     1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,
  91.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  92.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  93.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  94.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  95.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  96.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  97. };
  98.  
  99.     /* Some file name suffixes for text files and the approriate
  100.      * file types.
  101.      */
  102.  
  103. STATIC struct Suffix TextSuffix[] =
  104. {
  105.     ".C",        TYPE_C,
  106.     ".CP",        TYPE_C,
  107.     ".CC",        TYPE_C,
  108.     ".H",        TYPE_H,
  109.     ".ASM",        TYPE_ASM,
  110.     ".A",        TYPE_ASM,
  111.     ".S",        TYPE_ASM,
  112.     ".I",        TYPE_I,
  113.     ".BAS",        TYPE_BASIC,
  114.     ".GFA",        TYPE_BASIC,
  115.     ".REXX",    TYPE_REXX,
  116.     ".CED",        TYPE_REXX,
  117.     ".TTX",        TYPE_REXX,
  118.     ".VLT",        TYPE_REXX,
  119.     ".CPR",        TYPE_REXX,
  120.     ".TxEd",    TYPE_REXX,
  121.     ".ADPro",    TYPE_REXX,
  122.     ".TEX",        TYPE_TEX,
  123.     ".STY",        TYPE_TEX,
  124.     ".MF",        TYPE_METAFONT,
  125.     ".MOD",        TYPE_MOD,
  126.     ".DEF",        TYPE_MOD,
  127.     ".PS",        TYPE_POSTSCRIPT,
  128.     ".GUIDE",    TYPE_AMIGAGUIDE
  129. };
  130.  
  131.     /* Some more file name suffixes for executable files and the
  132.      * approriate file types.
  133.      */
  134.  
  135. STATIC struct Suffix ExecutableSuffix[] =
  136. {
  137.     ".device",    TYPE_DEVICE,
  138.     ".library",    TYPE_LIBRARY,
  139.     "FileSystem",    TYPE_FILESYS,
  140.     "Handler",    TYPE_HANDLER
  141. };
  142.  
  143.     /* Short descriptions of each file type we know of. */
  144.  
  145. STATIC UBYTE *FileTypes[] =
  146. {
  147.     NULL,
  148.     NULL,
  149.     "Workbench icon file",
  150.     "ASCII text file",
  151.     "`C' source code file",
  152.     "`C' header file",
  153.     "Assembly language source code file",
  154.     "Assembly language include file",
  155.     "Modula-2/Oberon source code file",
  156.     "ARexx script file",
  157.     "Basic source code",
  158.     "AmigaGuide document file",
  159.     "TeX document file",
  160.     "Metafont font file",
  161.     "Generic font file",
  162.     "Packed TeX font file",
  163.     "TeX device independent output file",
  164.     "PasTeX font library file",
  165.     "Manx 3.x object code file",
  166.     "Manx 5.x object code file",
  167.     "Manx 3.x library file",
  168.     "Manx 5.x library file",
  169.     "AmigaDOS object code file",
  170.     "AmigaDOS object code library file",
  171.     "AmigaDOS executable file",
  172.     "System library file",
  173.     "System device file",
  174.     "AmigaDOS filing system handler file",
  175.     "AmigaDOS handler file",
  176.     "GIF image file",
  177.     "Degas image file",
  178.     "MacPaint image file",
  179.     "SuperPaint image file",
  180.     "Macintosh PICT image file",
  181.     "Sun raster image file",
  182.     "Postscript file",
  183.     "PCX image file",
  184.     "TIFF image file",
  185.     "Windows bitmap image file",
  186.     "JFIF image file",
  187.     "IFF-ILBM image file",
  188.     "IFF-ANIM animation file",
  189.     "IFF-8SVX sound file",
  190.     "IFF-SMUS score file",
  191.     "IFF-FTXT text file",
  192.     "IFF-PREF preferences file",
  193.     "IFF-TERM `term' configuration file",
  194.     "IFF file",
  195.     "AmigaVision flow file",
  196.     "Imploder data output file",
  197.     "PowerPacker data output file",
  198.     "LhPak self extracting archive",
  199.     "Arc archive file",
  200.     "ARJ archive file",
  201.     "Compressed file",
  202.     "CPIO archive file",
  203.     "MacCompress archive file",
  204.     "Compact archive file",
  205.     "Diamond archive file",
  206.     "LhArc archive file",
  207.     "LHA archive file",
  208.     "Zoo archive file",
  209.     "PKZip archive file",
  210.     "Stuff It! archive file",
  211.     "Pack It! archive file",
  212.     "DMS disk archive file",
  213.     "Warp disk archive file",
  214.     "Zoom disk archive file",
  215.     "SPARC object code",
  216.     "SPARC executable",
  217.     "MS-DOS executable",
  218.     "Atari-ST/TT executable",
  219.     "Macintosh executable"
  220. };
  221.  
  222.     /* LongCompare(UBYTE *Buffer,ULONG Value):
  223.      *
  224.      *    Compare space in memory with a longword value.
  225.      */
  226.  
  227. STATIC BYTE __regargs
  228. LongCompare(UBYTE *Buffer,ULONG Value)
  229. {
  230.     UBYTE *OtherBuffer = (UBYTE *)&Value,i;
  231.  
  232.     for(i = 0 ; i < 4 ; i++)
  233.     {
  234.         if(OtherBuffer[i] != Buffer[i])
  235.             return(FALSE);
  236.     }
  237.  
  238.     return(TRUE);
  239. }
  240.  
  241.     /* Identify(UBYTE *Name):
  242.      *
  243.      *    Simple routine to identify a file type by looking at
  244.      *    its first 400 bytes. If successful a comment is
  245.      *    attached to the file describing the file type.
  246.      */
  247.  
  248. VOID
  249. Identify(UBYTE *Name)
  250. {
  251.     ULONG    *Buffer;
  252.     UBYTE     Type = TYPE_FILE;
  253.     WORD     i,Len = strlen(Name);
  254.     UBYTE     IFFType[5];
  255.  
  256.         /* Allocate a buffer for the first 410 bytes of the
  257.          * file.
  258.          */
  259.  
  260.     if(Buffer = (ULONG *)AllocVec(410,MEMF_PUBLIC))
  261.     {
  262.         BPTR File,Size;
  263.  
  264.             /* Open the file. */
  265.  
  266.         if(File = Open(Name,MODE_OLDFILE))
  267.         {
  268.                 /* Read the first 410 bytes. */
  269.  
  270.             if((Size = Read(File,Buffer,410)) >= sizeof(ULONG))
  271.             {
  272.                 UBYTE    *CharBuffer = (UBYTE *)Buffer;
  273.                 WORD     Count = 0;
  274.  
  275.                     /* See if it's an ASCII file. */
  276.  
  277.                 for(i = 0 ; i < Size ; i++)
  278.                 {
  279.                     if(ID_ValidTab[CharBuffer[i]])
  280.                         Count++;
  281.                     else
  282.                     {
  283.                         if(ID_InvalidTab[CharBuffer[i]])
  284.                         {
  285.                             Count = 0;
  286.  
  287.                             break;
  288.                         }
  289.                     }
  290.                 }
  291.  
  292.                     /* If more than 75% of the
  293.                      * characters in the first
  294.                      * 400 bytes are legal
  295.                      * ASCII characters this
  296.                      * file is supposed to be
  297.                      * a text file.
  298.                      */
  299.  
  300.                 if(Count > 3 * (Size / 4))
  301.                     Type = TYPE_TEXT;
  302.  
  303.                     /* Examine the first longword. */
  304.  
  305.                 if(Type == TYPE_FILE)
  306.                 {
  307.                     switch(Buffer[0])
  308.                     {
  309.                         case 0x000003E7:Type = TYPE_OBJECT;
  310.                                 break;
  311.  
  312.                         case 0x000003F3:Type = TYPE_EXECUTABLE;
  313.                                 break;
  314.  
  315.                         case 0x000003FA:Type = TYPE_LIB;
  316.                                 break;
  317.  
  318.                         case 0xF7593647:Type = TYPE_TEXFONT;
  319.                                 break;
  320.  
  321.                         case 0xF7020183:Type = TYPE_TEXDVI;
  322.                                 break;
  323.  
  324.                         case 0xF7832020:Type = TYPE_GF;
  325.                                 break;
  326.  
  327.                         case 0x504B0304:Type = TYPE_ZIP;
  328.                                 break;
  329.  
  330.                         case 0x01030107:Type = TYPE_SPARCOBJECT;
  331.                                 break;
  332.  
  333.                         case 0x8103010B:Type = TYPE_SPARCEXECUTABLE;
  334.                                 break;
  335.  
  336.                         case 0x59A66A95:Type = TYPE_SUNRASTER;
  337.                                 break;
  338.  
  339.                         case 0x1F9D902A:Type = TYPE_COMPRESSED;
  340.                                 break;
  341.  
  342.                         case 0x30373037:Type = TYPE_CPIO;
  343.                                 break;
  344.  
  345.                         case 'FLIB':    Type = TYPE_FLIB;
  346.                                 break;
  347.  
  348.                         case 'FORM':    switch(Buffer[2])
  349.                                 {
  350.                                     case 'ILBM':    Type = TYPE_ILBM;
  351.                                             break;
  352.  
  353.                                     case 'ANIM':    Type = TYPE_ANIM;
  354.                                             break;
  355.  
  356.                                     case '8SVX':    Type = TYPE_8SVX;
  357.                                             break;
  358.  
  359.                                     case 'SMUS':    Type = TYPE_SMUS;
  360.                                             break;
  361.  
  362.                                     case 'FTXT':    Type = TYPE_FTXT;
  363.                                             break;
  364.  
  365.                                     case 'PREF':    Type = TYPE_PREFS;
  366.                                             break;
  367.  
  368.                                     case 'TERM':    Type = TYPE_TERM;
  369.                                             break;
  370.  
  371.                                     case 'AVCF':    Type = TYPE_AMIGAVISION;
  372.                                             break;
  373.  
  374.                                     default:    Type = TYPE_IFF;
  375.  
  376.                                             CopyMem(&Buffer[2],IFFType,4);
  377.  
  378.                                             IFFType[4] = 0;
  379.  
  380.                                             break;
  381.                                 }
  382.  
  383.                                 break;
  384.  
  385.                         case 'IMP!':    Type = TYPE_IMPLODER;
  386.                                 break;
  387.  
  388.                         case 'PP20':    Type = TYPE_POWERPACKER;
  389.                                 break;
  390.  
  391.                         case 'DMS!':    Type = TYPE_DMS;
  392.                                 break;
  393.  
  394.                         case 'Warp':    Type = TYPE_WARP;
  395.                                 break;
  396.  
  397.                         case 'ZOM5':
  398.                         case 'ZOOM':    Type = TYPE_ZOOM;
  399.                                 break;
  400.  
  401.                         case 'ZOO ':    Type = TYPE_ZOO;
  402.                                 break;
  403.  
  404.                         case 'GIF8':    Type = TYPE_GIF;
  405.                                 break;
  406.  
  407.                         default:    break;
  408.                     }
  409.                 }
  410.  
  411.                     /* Now for oddly placed magic cookies... */
  412.  
  413.                 if(Type == TYPE_FILE)
  414.                 {
  415.                         /* Dumb check for PCX (awful header -- just
  416.                          * a single byte indicates that the file
  417.                          * is supposed to be a PCX file! Those
  418.                          * PC guys just don't have any
  419.                          * decent software culture!).
  420.                          */
  421.  
  422.                     if(CharBuffer[0] == 0x0A)
  423.                         Type = TYPE_PCX;
  424.  
  425.                         /* Yet another awful file format... */
  426.  
  427.                     if(CharBuffer[0] == 'B' && CharBuffer[1] == 'M')
  428.                         Type = TYPE_BMP;
  429.  
  430.                         /* Check for JFIF... */
  431.  
  432.                     if(LongCompare(&CharBuffer[6],'JFIF'))
  433.                         Type = TYPE_JFIF;
  434.                 }
  435.  
  436.                     /* Check for Macintosh data (note:
  437.                      * this code assumes that the Mac
  438.                      * binary header is still present,
  439.                      * so if you are dealing with stripped
  440.                      * binary files, don't expect the
  441.                      * following code to work!).
  442.                      */
  443.  
  444.                 if(Type == TYPE_FILE)
  445.                 {
  446.                     UBYTE *ByteBuffer = &((UBYTE *)Buffer)[65];
  447.  
  448.                         /* Check for MacPaint... */
  449.  
  450.                     if(LongCompare(ByteBuffer,'PNTG'))
  451.                         Type = TYPE_MACPAINT;
  452.  
  453.                         /* Check for SuperPaint... */
  454.  
  455.                     if(LongCompare(ByteBuffer,'SPTG'))
  456.                         Type = TYPE_SUPERPAINT;
  457.  
  458.                         /* Check for PICT... */
  459.  
  460.                     if(LongCompare(ByteBuffer,'PICT'))
  461.                         Type = TYPE_PICT;
  462.  
  463.                         /* Check for executable... */
  464.  
  465.                     if(LongCompare(ByteBuffer,'APPL') || LongCompare(ByteBuffer,'PRES') || LongCompare(ByteBuffer,'FDOC') || LongCompare(ByteBuffer,'cdev') || LongCompare(ByteBuffer,'INIT'))
  466.                         Type = TYPE_MACEXECUTABLE;
  467.  
  468.                         /* Check for StuffIt archive... */
  469.  
  470.                     if(LongCompare(ByteBuffer,'SIT!') || LongCompare(ByteBuffer,'SIT2'))
  471.                         Type = TYPE_STUFFIT;
  472.  
  473.                         /* Check for PackIt archive... */
  474.  
  475.                     if(LongCompare(ByteBuffer,'PIT '))
  476.                         Type = TYPE_PACKIT;
  477.  
  478.                         /* Check for self-extracting Compact archive. */
  479.  
  480.                     if(LongCompare(ByteBuffer,'APPL') && LongCompare(&ByteBuffer[4],'EXTR'))
  481.                         Type = TYPE_COMPACT;
  482.  
  483.                         /* Check for MacCompress archive. */
  484.  
  485.                     if(LongCompare(ByteBuffer,'ZIVM'))
  486.                         Type = TYPE_MACCOMPRESS;
  487.  
  488.                         /* Check for LhArc archive with MacBinary header. */
  489.  
  490.                     if(LongCompare(ByteBuffer,'LARC'))
  491.                         Type = TYPE_LHARC;
  492.  
  493.                         /* Check for Compact archive. */
  494.  
  495.                     if(LongCompare(ByteBuffer,'PACT'))
  496.                         Type = TYPE_COMPACT;
  497.  
  498.                         /* Check for Diamond archive. */
  499.  
  500.                     if(LongCompare(ByteBuffer,'Pack'))
  501.                         Type = TYPE_DIAMOND;
  502.                 }
  503.  
  504.                     /* Still no match? Have another try... */
  505.  
  506.                 if(Type == TYPE_FILE)
  507.                 {
  508.                     if((Buffer[0] & 0x0000FFFF) == 0x00002D6C && (Buffer[1] & 0xFF00FF00) == 0x68002D00)
  509.                     {
  510.                         if(CharBuffer[5] == '5')
  511.                             Type = TYPE_LHA;
  512.                         else
  513.                             Type = TYPE_LHARC;
  514.                     }
  515.                     else
  516.                     {
  517.                         switch(Buffer[0] & 0xFFFF0000)
  518.                         {
  519.                             case 0x4D4D0000:
  520.                             case 0x49490000:    Type = TYPE_TIFF;
  521.                                         break;
  522.  
  523.                             case 0x1A080000:    Type = TYPE_ARC;
  524.                                         break;
  525.  
  526.                             case 0xEA600000:    Type = TYPE_ARJ;
  527.                                         break;
  528.  
  529.                             case 0x434A0000:    Type = TYPE_NEWMANX;
  530.                                         break;
  531.  
  532.                             case 0x414A0000:    Type = TYPE_OLDMANX;
  533.                                         break;
  534.  
  535.                             case 0x636A0000:    Type = TYPE_NEWMANXLIB;
  536.                                         break;
  537.  
  538.                             case 0x616A0000:    Type = TYPE_OLDMANXLIB;
  539.                                         break;
  540.  
  541.                             case 0xF5000000:    Type = TYPE_BASIC;
  542.                                         break;
  543.  
  544.                             case 0xE3100000:    Type = TYPE_ICON;
  545.                                         break;
  546.  
  547.                             case 0x4D5A0000:    Type = TYPE_MSDOSEXECUTABLE;
  548.                                         break;
  549.  
  550.                             case 0x601A0000:    Type = TYPE_ATARIEXECUTABLE;
  551.                                         break;
  552.  
  553.                             case 0x80000000:    Type = TYPE_DEGAS;
  554.                                         break;
  555.  
  556.                             default:        break;
  557.                         }
  558.                     }
  559.                 }
  560.  
  561.                     /* Take a look at the file name
  562.                      * suffixes.
  563.                      */
  564.  
  565.                 switch(Type)
  566.                 {
  567.                     case TYPE_TEXT:
  568.  
  569.                             for(i = 0 ; i < sizeof(TextSuffix) / sizeof(struct Suffix) ; i++)
  570.                             {
  571.                                 Size = strlen(TextSuffix[i] . Name);
  572.  
  573.                                 if(Len >= Size)
  574.                                 {
  575.                                     if(!Stricmp(&Name[Len - Size],TextSuffix[i] . Name))
  576.                                     {
  577.                                         Type = TextSuffix[i] . Type;
  578.                                         break;
  579.                                     }
  580.                                 }
  581.                             }
  582.  
  583.                             break;
  584.  
  585.                     case TYPE_EXECUTABLE:
  586.  
  587.                             for(i = 0 ; i < sizeof(ExecutableSuffix) / sizeof(struct Suffix) ; i++)
  588.                             {
  589.                                 Size = strlen(ExecutableSuffix[i] . Name);
  590.  
  591.                                 if(Len >= Size)
  592.                                 {
  593.                                     if(!Stricmp(&Name[Len - Size],ExecutableSuffix[i] . Name))
  594.                                     {
  595.                                         Type = ExecutableSuffix[i] . Type;
  596.                                         break;
  597.                                     }
  598.                                 }
  599.                             }
  600.  
  601.                             if(Type == TYPE_EXECUTABLE)
  602.                             {
  603.                                 if(Buffer[10] == 'LSFX')
  604.                                     Type = TYPE_LHPAK;
  605.                             }
  606.  
  607.                             break;
  608.  
  609.                     case TYPE_OBJECT:
  610.  
  611.                             if(Len >= 4)
  612.                             {
  613.                                 if(!Stricmp(&Name[Len - 4],".LIB"))
  614.                                     Type = TYPE_LIB;
  615.                             }
  616.  
  617.                             break;
  618.  
  619.                     default:    break;
  620.                 }
  621.             }
  622.  
  623.             Close(File);
  624.         }
  625.  
  626.         FreeVec(Buffer);
  627.     }
  628.  
  629.     if(Type != TYPE_FILE && FileTypes[Type])
  630.     {
  631.         if(Type == TYPE_IFF)
  632.         {
  633.             UBYTE NameBuffer[40];
  634.  
  635.             SPrintf(NameBuffer,"IFF file \"%s\"",IFFType);
  636.  
  637.             SetComment(Name,NameBuffer);
  638.         }
  639.         else
  640.             SetComment(Name,FileTypes[Type]);
  641.     }
  642.  
  643.     if(Type != TYPE_EXECUTABLE && Type != TYPE_LHPAK)
  644.         SetProtection(Name,FIBF_EXECUTE);
  645. }
  646.