ftp.nice.ch/pub/next/unix/network/www/wwwcount.2.3.NIHS.bs.tar.gz#/wwwcount2.3/combine/getsize.c

This is getsize.c in view mode; [Download] [Up]

/*
 *	GetGIFsize - reads the image size in a GIF file
 *
 *	RCS:
 *		$Revision: 2.3 $
 *		$Date: 1996/05/03 02:21:34 $
 *
 *	Security:
 *		Unclassified
 *
 *	Description:
 *      This functions returns after reading the size params in a GIF file
 *
 *	Input Parameters:
 *		type	identifier	description
 *
 *		char    *filename
 *      unsigned int *width;
 *      unsigned int *height;
 *
 *	Output Parameters:
 *		type	identifier	description
 *
 *		unsigned int *width
 *      unsigned int *height
 *
 *	Return Values:
 *		value	description
 *      0 on success
 *
 *	Side Effects:
 *		text
 *
 *	Limitations and Comments:
 *		text
 *
 *	Development History:
 *		when	who		why
 *  02/18/96    muquit  first cut
 */

#include "combine.h"
#include "defines.h"
#include "errcds.h"


int GetGIFsize(filename,width,height)
char
    *filename;

unsigned int
    *width,
    *height;
{

#define BitSet(byte, bit) (((byte) & (bit)) == (bit))
#define LSBFirstOrder(x, y)	(((y) << 8) | (x))

	int
		rc = 0;

    short int
		transparency_index;

	unsigned char
		c,
		*global_colormap,
		header[MaxTextLength],
		type[12];

	unsigned int
		global_colors;

	FILE
		*fp=(FILE *) NULL;
	
    *width=0;
    *height=0;

	fp = fopen (filename, "rb");

	if (fp == (FILE *) NULL)
	{
		fprintf (stderr, "could not open file: %s\n",filename);
		rc = OPEN_FAILED;
		goto ExitProcessing;
	}


	rc = Read_Data ((char *) type, 1, 6, fp);

	if ((rc == 1) || ((strncmp((char *) type, "GIF87", 5) != 0) &&
		(strncmp ((char *) type, "GIF89", 5) != 0)))
	{
		fprintf (stderr, "Not a GIF Image: [%s]\n",filename);
		rc = NOT_A_GIF_FILE;
		goto ExitProcessing;
	}

	rc = Read_Data ((char *) header, 1, 7, fp);

	if (rc == 1)
	{
		rc = FAILED_TO_READ_SCREEND;
		goto ExitProcessing;
	}

	global_colors = 0;
	global_colormap = (unsigned char *) NULL;

	if (BitSet(header[4], 0x80))
	{
		global_colors = 1 << ((header[4] & 0x07) + 1);
        fseek(fp,3*global_colors,1);
	}

	transparency_index = (-1);

	for ( ; ; )
	{
		rc = Read_Data ((char *) &c, 1, 1, fp);

		if (rc == 1)
		{
			rc = 0;
			break;
		}

		if (c == ';')	/* terminator */
			break;
		
		if (c == '!')	/* EXTENSION ! */
		{
			rc = Read_Data ((char *) &c, 1, 1, fp);

			if (rc == 1)
			{
				rc = READ_ERR_EXT_BLOCK;
				goto ExitProcessing;
			}

			switch (c)
			{
				case 0xf9:	/* Transperency */
				{
					while (ReadDataBlock ((char *) header, fp) !=0)
					if ((header[0] * 0x01) == 1)
					{
						transparency_index = header[3];
					}
					break;
				
				}
				case 0xfe:	/* comment extension */
				{
					int
						length;
					
					for ( ; ; )
					{
						length = ReadDataBlock ((char *) header, fp);
						if (length <= 0)
							break;
					}
					break;
				}	

				default:
				{
					while (ReadDataBlock ((char *) header, fp) != 0);
					break;
				}
			}
		}


		if (c != ',')
			continue;


		/*
		** read Header Now
		*/

		rc = Read_Data ((char *) header, 1, 9, fp);

		if (rc == 1)
		{
			rc = READ_ERR_WIDTH_HEIGHT;
			goto ExitProcessing;
		}

		*width = LSBFirstOrder (header[4], header[5]);
		*height = LSBFirstOrder (header[6], header[7]);
        break;
	}/* for (;;) */

        
ExitProcessing:
	if (fp != (FILE *) NULL)
		(void) fclose ((FILE *) fp);
	return (rc);

}
	

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.