15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* pngmem.c - stub functions for memory allocation
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Last changed in libpng 1.2.41 [February 25, 2010]
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 1998-2010 Glenn Randers-Pehrson
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This code is released under the libpng license.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * For conditions of distribution and use, see the disclaimer
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and license in png.h
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This file provides a location for all memory allocation.  Users who
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * need special memory handling are expected to supply replacement
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * functions for png_malloc() and png_free(), and to use
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * png_create_read_struct_2() and png_create_write_struct_2() to
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * identify the replacement functions.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_INTERNAL
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_NO_PEDANTIC_WARNINGS
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "png.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Borland DOS special memory handler */
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* If you change this, be sure to change the one in png.h also */
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Allocate memory for a png_struct.  The malloc and memset can be replaced
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   by a single call to calloc() if this is thought to improve performance. */
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp /* PRIVATE */
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_create_struct(int type)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return (png_create_struct_2(type, png_malloc_ptr_NULL, png_voidp_NULL));
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Alternate version of png_create_struct, for use with user-defined malloc. */
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp /* PRIVATE */
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USER_MEM_SUPPORTED */
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_size_t size;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_voidp struct_ptr;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (type == PNG_STRUCT_INFO)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      size = png_sizeof(png_info);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (type == PNG_STRUCT_PNG)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      size = png_sizeof(png_struct);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return (png_get_copyright(NULL));
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (malloc_fn != NULL)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_struct dummy_struct;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_structp png_ptr = &dummy_struct;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->mem_ptr=mem_ptr;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      struct_ptr = (*(malloc_fn))(png_ptr, (png_uint_32)size);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USER_MEM_SUPPORTED */
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct_ptr = (png_voidp)farmalloc(size);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (struct_ptr != NULL)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_memset(struct_ptr, 0, size);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return (struct_ptr);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Free memory allocated by a png_create_struct() call */
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_destroy_struct(png_voidp struct_ptr)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_destroy_struct_2(struct_ptr, png_free_ptr_NULL, png_voidp_NULL);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Free memory allocated by a png_create_struct() call */
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    png_voidp mem_ptr)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (struct_ptr != NULL)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (free_fn != NULL)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_struct dummy_struct;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_structp png_ptr = &dummy_struct;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->mem_ptr=mem_ptr;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (*(free_fn))(png_ptr, struct_ptr);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USER_MEM_SUPPORTED */
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      farfree (struct_ptr);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Allocate memory.  For reasonable files, size should never exceed
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 64K.  However, zlib may allocate more then 64K if you don't tell
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * it not to.  See zconf.h and png.h for more information. zlib does
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * need to allocate exactly 64K, so whatever you call here must
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * have the ability to do that.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Borland seems to have a problem in DOS mode for exactly 64K.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * It gives you a segment with an offset of 8 (perhaps to store its
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * memory stuff).  zlib doesn't like this at all, so we have to
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * detect and deal with it.  This code should not be needed in
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Windows or OS/2 modes, and only in 16 bit mode.  This code has
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * been updated by Alexander Lehmann for version 0.89 to waste less
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * memory.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Note that we can't use png_size_t for the "size" declaration,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * since on some systems a png_size_t is a 16-bit quantity, and as a
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * result, we would be truncating potentially larger memory requests
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (which should cause a fatal error) and introducing major problems.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp /* PRIVATE */
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_calloc(png_structp png_ptr, png_uint_32 size)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_voidp ret;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ret = (png_malloc(png_ptr, size));
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (ret != NULL)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_memset(ret,0,(png_size_t)size);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return (ret);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp PNGAPI
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_malloc(png_structp png_ptr, png_uint_32 size)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_voidp ret;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL || size == 0)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return (NULL);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->malloc_fn != NULL)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size));
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ret = (png_malloc_default(png_ptr, size));
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       png_error(png_ptr, "Out of memory!");
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return (ret);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp PNGAPI
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_malloc_default(png_structp png_ptr, png_uint_32 size)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_voidp ret;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USER_MEM_SUPPORTED */
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL || size == 0)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return (NULL);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_MAX_MALLOC_64K
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (size > (png_uint_32)65536L)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_warning(png_ptr, "Cannot Allocate > 64K");
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ret = NULL;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (size != (size_t)size)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ret = NULL;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (size == (png_uint_32)65536L)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->offset_table == NULL)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* Try to see if we need to do any of this fancy stuff */
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ret = farmalloc(size);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (ret == NULL || ((png_size_t)ret & 0xffff))
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int num_blocks;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_uint_32 total_size;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_bytep table;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int i;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_byte huge * hptr;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (ret != NULL)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               farfree(ret);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               ret = NULL;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (png_ptr->zlib_window_bits > 14)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               num_blocks = (int)(1 << (png_ptr->zlib_window_bits - 14));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            else
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               num_blocks = 1;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (png_ptr->zlib_mem_level >= 7)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               num_blocks += (int)(1 << (png_ptr->zlib_mem_level - 7));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            else
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               num_blocks++;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            total_size = ((png_uint_32)65536L) * (png_uint_32)num_blocks+16;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            table = farmalloc(total_size);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (table == NULL)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PNG_USER_MEM_SUPPORTED
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_error(png_ptr, "Out Of Memory."); /* Note "O", "M" */
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               else
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_warning(png_ptr, "Out Of Memory.");
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               return (NULL);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if ((png_size_t)table & 0xfff0)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PNG_USER_MEM_SUPPORTED
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_error(png_ptr,
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    "Farmalloc didn't return normalized pointer");
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               else
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_warning(png_ptr,
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    "Farmalloc didn't return normalized pointer");
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               return (NULL);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_ptr->offset_table = table;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_ptr->offset_table_ptr = farmalloc(num_blocks *
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_sizeof(png_bytep));
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (png_ptr->offset_table_ptr == NULL)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PNG_USER_MEM_SUPPORTED
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_error(png_ptr, "Out Of memory."); /* Note "O", "m" */
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               else
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_warning(png_ptr, "Out Of memory.");
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               return (NULL);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            hptr = (png_byte huge *)table;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if ((png_size_t)hptr & 0xf)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               hptr = (png_byte huge *)((long)(hptr) & 0xfffffff0L);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               hptr = hptr + 16L;  /* "hptr += 16L" fails on Turbo C++ 3.0 */
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            for (i = 0; i < num_blocks; i++)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_ptr->offset_table_ptr[i] = (png_bytep)hptr;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               hptr = hptr + (png_uint_32)65536L;  /* "+=" fails on TC++3.0 */
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_ptr->offset_table_number = num_blocks;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_ptr->offset_table_count = 0;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_ptr->offset_table_count_free = 0;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->offset_table_count >= png_ptr->offset_table_number)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PNG_USER_MEM_SUPPORTED
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_error(png_ptr, "Out of Memory."); /* Note "o" and "M" */
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         else
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_warning(png_ptr, "Out of Memory.");
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return (NULL);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ret = png_ptr->offset_table_ptr[png_ptr->offset_table_count++];
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ret = farmalloc(size);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PNG_USER_MEM_SUPPORTED
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (ret == NULL)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_error(png_ptr, "Out of memory."); /* Note "o" and "m" */
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_warning(png_ptr, "Out of memory."); /* Note "o" and "m" */
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return (ret);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Free a pointer allocated by png_malloc().  In the default
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * configuration, png_ptr is not used, but is passed in case it
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is needed.  If ptr is NULL, return without taking any action.
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_free(png_structp png_ptr, png_voidp ptr)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL || ptr == NULL)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->free_fn != NULL)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (*(png_ptr->free_fn))(png_ptr, ptr);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_free_default(png_ptr, ptr);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_free_default(png_structp png_ptr, png_voidp ptr)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USER_MEM_SUPPORTED */
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL || ptr == NULL)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->offset_table != NULL)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int i;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (i = 0; i < png_ptr->offset_table_count; i++)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (ptr == png_ptr->offset_table_ptr[i])
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ptr = NULL;
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_ptr->offset_table_count_free++;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->offset_table_count_free == png_ptr->offset_table_count)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         farfree(png_ptr->offset_table);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         farfree(png_ptr->offset_table_ptr);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->offset_table = NULL;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->offset_table_ptr = NULL;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (ptr != NULL)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      farfree(ptr);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else /* Not the Borland DOS special memory handler */
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Allocate memory for a png_struct or a png_info.  The malloc and
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   memset can be replaced by a single call to calloc() if this is thought
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   to improve performance noticably. */
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp /* PRIVATE */
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_create_struct(int type)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return (png_create_struct_2(type, png_malloc_ptr_NULL, png_voidp_NULL));
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Allocate memory for a png_struct or a png_info.  The malloc and
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   memset can be replaced by a single call to calloc() if this is thought
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   to improve performance noticably. */
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp /* PRIVATE */
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USER_MEM_SUPPORTED */
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_size_t size;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_voidp struct_ptr;
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (type == PNG_STRUCT_INFO)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      size = png_sizeof(png_info);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (type == PNG_STRUCT_PNG)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      size = png_sizeof(png_struct);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return (NULL);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (malloc_fn != NULL)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_struct dummy_struct;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_structp png_ptr = &dummy_struct;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->mem_ptr=mem_ptr;
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      struct_ptr = (*(malloc_fn))(png_ptr, size);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (struct_ptr != NULL)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_memset(struct_ptr, 0, size);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return (struct_ptr);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USER_MEM_SUPPORTED */
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__TURBOC__) && !defined(__FLAT__)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct_ptr = (png_voidp)farmalloc(size);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if defined(_MSC_VER) && defined(MAXSEG_64K)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct_ptr = (png_voidp)halloc(size, 1);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# else
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct_ptr = (png_voidp)malloc(size);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (struct_ptr != NULL)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_memset(struct_ptr, 0, size);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return (struct_ptr);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Free memory allocated by a png_create_struct() call */
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_destroy_struct(png_voidp struct_ptr)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_destroy_struct_2(struct_ptr, png_free_ptr_NULL, png_voidp_NULL);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Free memory allocated by a png_create_struct() call */
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn,
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    png_voidp mem_ptr)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USER_MEM_SUPPORTED */
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (struct_ptr != NULL)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (free_fn != NULL)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_struct dummy_struct;
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_structp png_ptr = &dummy_struct;
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->mem_ptr=mem_ptr;
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (*(free_fn))(png_ptr, struct_ptr);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USER_MEM_SUPPORTED */
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__TURBOC__) && !defined(__FLAT__)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      farfree(struct_ptr);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if defined(_MSC_VER) && defined(MAXSEG_64K)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      hfree(struct_ptr);
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# else
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      free(struct_ptr);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Allocate memory.  For reasonable files, size should never exceed
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 64K.  However, zlib may allocate more then 64K if you don't tell
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * it not to.  See zconf.h and png.h for more information.  zlib does
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * need to allocate exactly 64K, so whatever you call here must
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * have the ability to do that.
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp /* PRIVATE */
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_calloc(png_structp png_ptr, png_uint_32 size)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_voidp ret;
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ret = (png_malloc(png_ptr, size));
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (ret != NULL)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_memset(ret,0,(png_size_t)size);
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return (ret);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp PNGAPI
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_malloc(png_structp png_ptr, png_uint_32 size)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_voidp ret;
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL || size == 0)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return (NULL);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->malloc_fn != NULL)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size));
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ret = (png_malloc_default(png_ptr, size));
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       png_error(png_ptr, "Out of Memory!");
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return (ret);
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp PNGAPI
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_malloc_default(png_structp png_ptr, png_uint_32 size)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_voidp ret;
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USER_MEM_SUPPORTED */
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL || size == 0)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return (NULL);
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_MAX_MALLOC_64K
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (size > (png_uint_32)65536L)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PNG_USER_MEM_SUPPORTED
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_error(png_ptr, "Cannot Allocate > 64K");
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return NULL;
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Check for overflow */
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__TURBOC__) && !defined(__FLAT__)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (size != (unsigned long)size)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ret = NULL;
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ret = farmalloc(size);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if defined(_MSC_VER) && defined(MAXSEG_64K)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (size != (unsigned long)size)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ret = NULL;
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ret = halloc(size, 1);
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# else
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (size != (size_t)size)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ret = NULL;
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ret = malloc((size_t)size);
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PNG_USER_MEM_SUPPORTED
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_error(png_ptr, "Out of Memory");
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return (ret);
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Free a pointer allocated by png_malloc().  If ptr is NULL, return
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * without taking any action.
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_free(png_structp png_ptr, png_voidp ptr)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL || ptr == NULL)
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->free_fn != NULL)
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (*(png_ptr->free_fn))(png_ptr, ptr);
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_free_default(png_ptr, ptr);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_free_default(png_structp png_ptr, png_voidp ptr)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL || ptr == NULL)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USER_MEM_SUPPORTED */
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__TURBOC__) && !defined(__FLAT__)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   farfree(ptr);
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if defined(_MSC_VER) && defined(MAXSEG_64K)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   hfree(ptr);
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# else
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   free(ptr);
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* Not Borland DOS special memory handler */
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_1_0_X
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define png_malloc_warn png_malloc
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This function was added at libpng version 1.2.3.  The png_malloc_warn()
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * function will set up png_malloc() to issue a png_warning and return NULL
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * instead of issuing a png_error, if it fails to allocate the requested
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * memory.
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp PNGAPI
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_malloc_warn(png_structp png_ptr, png_uint_32 size)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_voidp ptr;
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_uint_32 save_flags;
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return (NULL);
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   save_flags = png_ptr->flags;
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK;
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ptr = (png_voidp)png_malloc((png_structp)png_ptr, size);
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->flags=save_flags;
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return(ptr);
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp PNGAPI
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_memcpy_check (png_structp png_ptr, png_voidp s1, png_voidp s2,
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_uint_32 length)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_size_t size;
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   size = (png_size_t)length;
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ((png_uint_32)size != length)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_error(png_ptr, "Overflow in png_memcpy_check.");
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return(png_memcpy (s1, s2, size));
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp PNGAPI
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_memset_check (png_structp png_ptr, png_voidp s1, int value,
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_uint_32 length)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_size_t size;
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   size = (png_size_t)length;
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ((png_uint_32)size != length)
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_error(png_ptr, "Overflow in png_memset_check.");
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return (png_memset (s1, value, size));
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This function is called when the application wants to use another method
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of allocating and freeing memory.
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_mem_fn(png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  malloc_fn, png_free_ptr free_fn)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr != NULL)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->mem_ptr = mem_ptr;
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->malloc_fn = malloc_fn;
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->free_fn = free_fn;
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This function returns a pointer to the mem_ptr associated with the user
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * functions.  The application should free any memory associated with this
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pointer before png_write_destroy and png_read_destroy are called.
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp PNGAPI
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_get_mem_ptr(png_structp png_ptr)
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return (NULL);
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return ((png_voidp)png_ptr->mem_ptr);
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USER_MEM_SUPPORTED */
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */
642