home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 28 / amigaformatcd28.iso / -seriously_amiga- / archivers / mpackppc-wos / src / magic.c < prev    next >
C/C++ Source or Header  |  1998-04-27  |  3KB  |  78 lines

  1. /* (C) Copyright 1993,1994 by Carnegie Mellon University
  2.  * All Rights Reserved.
  3.  *
  4.  * Permission to use, copy, modify, distribute, and sell this software
  5.  * and its documentation for any purpose is hereby granted without
  6.  * fee, provided that the above copyright notice appear in all copies
  7.  * and that both that copyright notice and this permission notice
  8.  * appear in supporting documentation, and that the name of Carnegie
  9.  * Mellon University not be used in advertising or publicity
  10.  * pertaining to distribution of the software without specific,
  11.  * written prior permission.  Carnegie Mellon University makes no
  12.  * representations about the suitability of this software for any
  13.  * purpose.  It is provided "as is" without express or implied
  14.  * warranty.
  15.  *
  16.  * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
  17.  * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  18.  * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
  19.  * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  20.  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
  21.  * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
  22.  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
  23.  * SOFTWARE.
  24.  */
  25. #include <stdio.h>
  26.  
  27. /* Description of the various file formats and their magic numbers */
  28. struct magic {
  29.     char *name;                 /* Name of the file format */
  30.     char *num;          /* The magic number */
  31.     int len;            /* Length of same (0 means strlen(magicnum)) */
  32. };
  33.  
  34. /* The magic numbers of the file formats we know about */
  35. static struct magic magic[] = {
  36.     { "image/gif", "GIF", 0 },
  37.     { "image/jpeg", "\377\330\377", 0 },
  38.     { "video/mpeg", "\0\0\001\263", 4 },
  39.     { "application/postscript", "%!", 0 },
  40. };
  41. static int num_magic = (sizeof(magic)/sizeof(magic[0]));
  42. static char *default_type = "application/octet-stream";
  43.  
  44. /* The longest magic number */
  45. static int max_magiclen = 0;
  46.  
  47. /*
  48.  * Determins the format of the file "inputf".  The name
  49.  * of the file format (or NULL on error) is returned.
  50.  */
  51. char *magic_look(FILE *infile)
  52. {
  53.     int i, j;
  54.     char buf[80];
  55.     int numread = 0;
  56.  
  57.     if (max_magiclen == 0) {
  58.         for (i=0; i<num_magic; i++) {
  59.             if (magic[i].len == 0) magic[i].len = strlen(magic[i].num);
  60.             if (magic[i].len > max_magiclen) max_magiclen = magic[i].len;
  61.         }
  62.     }
  63.  
  64.     numread = fread(buf, 1, max_magiclen, infile);
  65.     rewind(infile);
  66.  
  67.     for (i=0; i<num_magic; i++) {
  68.         if (numread >= magic[i].len) {
  69.             for (j=0; j<magic[i].len; j++) {
  70.                 if (buf[j] != magic[i].num[j]) break;
  71.             }
  72.             if (j == magic[i].len) return magic[i].name;
  73.         }
  74.     }
  75.  
  76.     return default_type;
  77. }
  78.